Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/signature.h" | 5 #include "src/signature.h" |
| 6 | 6 |
| 7 #include "src/bit-vector.h" | 7 #include "src/bit-vector.h" |
| 8 #include "src/flags.h" | 8 #include "src/flags.h" |
| 9 #include "src/handles.h" | 9 #include "src/handles.h" |
| 10 #include "src/zone-containers.h" | 10 #include "src/zone-containers.h" |
| 11 | 11 |
| 12 #include "src/wasm/ast-decoder.h" | 12 #include "src/wasm/ast-decoder.h" |
| 13 #include "src/wasm/decoder.h" | 13 #include "src/wasm/decoder.h" |
| 14 #include "src/wasm/wasm-module.h" | 14 #include "src/wasm/wasm-module.h" |
| 15 #include "src/wasm/wasm-opcodes.h" | 15 #include "src/wasm/wasm-opcodes.h" |
| 16 | 16 |
| 17 #include "src/ostreams.h" | |
| 18 | |
| 17 #include "src/compiler/wasm-compiler.h" | 19 #include "src/compiler/wasm-compiler.h" |
| 18 | 20 |
| 19 namespace v8 { | 21 namespace v8 { |
| 20 namespace internal { | 22 namespace internal { |
| 21 namespace wasm { | 23 namespace wasm { |
| 22 | 24 |
| 23 #if DEBUG | 25 #if DEBUG |
| 24 #define TRACE(...) \ | 26 #define TRACE(...) \ |
| 25 do { \ | 27 do { \ |
| 26 if (FLAG_trace_wasm_decoder) PrintF(__VA_ARGS__); \ | 28 if (FLAG_trace_wasm_decoder) PrintF(__VA_ARGS__); \ |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 if (trees_.size() == 0) { | 396 if (trees_.size() == 0) { |
| 395 if (sig_->return_count() > 0) { | 397 if (sig_->return_count() > 0) { |
| 396 error(start_, "no trees created"); | 398 error(start_, "no trees created"); |
| 397 } | 399 } |
| 398 } else { | 400 } else { |
| 399 tree = trees_[0]; | 401 tree = trees_[0]; |
| 400 } | 402 } |
| 401 } | 403 } |
| 402 | 404 |
| 403 if (ok()) { | 405 if (ok()) { |
| 404 if (FLAG_trace_wasm_ast) { | |
| 405 FunctionBody body = {module_, sig_, base_, start_, end_}; | |
| 406 PrintAst(body); | |
| 407 } | |
| 408 TRACE("wasm-decode ok\n"); | 406 TRACE("wasm-decode ok\n"); |
| 409 } else { | 407 } else { |
| 410 TRACE("wasm-error module+%-6d func+%d: %s\n\n", baserel(error_pc_), | 408 TRACE("wasm-error module+%-6d func+%d: %s\n\n", baserel(error_pc_), |
| 411 startrel(error_pc_), error_msg_.get()); | 409 startrel(error_pc_), error_msg_.get()); |
| 412 } | 410 } |
| 413 | 411 |
| 414 return toResult(tree); | 412 return toResult(tree); |
| 415 } | 413 } |
| 416 | 414 |
| 417 std::vector<LocalType>* DecodeLocalDeclsForTesting() { | 415 std::vector<LocalType>* DecodeLocalDeclsForTesting() { |
| (...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1682 return decoder.OpcodeLength(pc); | 1680 return decoder.OpcodeLength(pc); |
| 1683 } | 1681 } |
| 1684 | 1682 |
| 1685 int OpcodeArity(ModuleEnv* module, FunctionSig* sig, const byte* pc, | 1683 int OpcodeArity(ModuleEnv* module, FunctionSig* sig, const byte* pc, |
| 1686 const byte* end) { | 1684 const byte* end) { |
| 1687 WasmDecoder decoder(module, sig, pc, end); | 1685 WasmDecoder decoder(module, sig, pc, end); |
| 1688 return decoder.OpcodeArity(pc); | 1686 return decoder.OpcodeArity(pc); |
| 1689 } | 1687 } |
| 1690 | 1688 |
| 1691 void PrintAst(FunctionBody& body) { | 1689 void PrintAst(FunctionBody& body) { |
| 1692 WasmDecoder decoder(body.module, body.sig, body.start, body.end); | 1690 Zone zone; |
| 1693 const byte* pc = body.start; | 1691 SR_WasmDecoder decoder(&zone, nullptr, body); |
| 1692 | |
| 1693 OFStream os(stdout); | |
| 1694 | |
| 1695 // Print the function signature. | |
| 1696 if (body.sig) { | |
| 1697 os << "// signature: " << *body.sig << std::endl; | |
| 1698 } | |
| 1699 | |
| 1700 // Print the local declarations. | |
| 1701 std::vector<LocalType>* decls = decoder.DecodeLocalDeclsForTesting(); | |
| 1702 const byte* pc = decoder.pc(); | |
| 1703 if (body.start != decoder.pc()) { | |
| 1704 printf("// locals:"); | |
|
ahaas
2016/03/15 14:24:55
Why do you mix streams and printf here?
titzer
2016/03/15 17:18:04
Meh, it's a mix because of some 0x%02x things belo
| |
| 1705 size_t pos = 0; | |
| 1706 while (pos < decls->size()) { | |
| 1707 LocalType type = decls->at(pos++); | |
| 1708 size_t count = 1; | |
| 1709 while (pos < decls->size() && decls->at(pos) == type) { | |
| 1710 pos++; | |
| 1711 count++; | |
| 1712 } | |
| 1713 | |
| 1714 os << " " << count << " " << WasmOpcodes::TypeName(type); | |
| 1715 } | |
| 1716 os << std::endl; | |
| 1717 | |
| 1718 for (const byte* locals = body.start; locals < pc; locals++) { | |
| 1719 printf(" 0x%02x,", *locals); | |
| 1720 } | |
| 1721 printf("\n"); | |
| 1722 } | |
| 1723 delete decls; | |
| 1724 | |
| 1725 printf("// body: \n"); | |
| 1694 std::vector<int> arity_stack; | 1726 std::vector<int> arity_stack; |
| 1695 while (pc < body.end) { | 1727 while (pc < body.end) { |
| 1696 int arity = decoder.OpcodeArity(pc); | 1728 int arity = decoder.OpcodeArity(pc); |
| 1697 size_t length = decoder.OpcodeLength(pc); | 1729 size_t length = decoder.OpcodeLength(pc); |
| 1698 | 1730 |
| 1699 for (auto arity : arity_stack) { | 1731 for (auto arity : arity_stack) { |
| 1700 printf(" "); | 1732 printf(" "); |
| 1701 USE(arity); | 1733 USE(arity); |
| 1702 } | 1734 } |
| 1703 | 1735 |
| 1704 WasmOpcode opcode = static_cast<WasmOpcode>(*pc); | 1736 WasmOpcode opcode = static_cast<WasmOpcode>(*pc); |
| 1705 printf("k%s,", WasmOpcodes::OpcodeName(opcode)); | 1737 printf("k%s,", WasmOpcodes::OpcodeName(opcode)); |
| 1706 | 1738 |
| 1707 for (size_t i = 1; i < length; i++) { | 1739 for (size_t i = 1; i < length; i++) { |
| 1708 printf(" 0x%02x,", pc[i]); | 1740 printf(" 0x%02x,", pc[i]); |
| 1709 } | 1741 } |
| 1742 | |
| 1743 if (body.module) { | |
| 1744 switch (opcode) { | |
| 1745 case kExprCallIndirect: { | |
| 1746 SignatureIndexOperand operand(&decoder, pc); | |
| 1747 if (decoder.Validate(pc, operand)) { | |
| 1748 os << " // sig #" << operand.index << ": " << *operand.sig; | |
| 1749 } | |
| 1750 break; | |
| 1751 } | |
| 1752 case kExprCallImport: { | |
| 1753 ImportIndexOperand operand(&decoder, pc); | |
| 1754 if (decoder.Validate(pc, operand)) { | |
| 1755 os << " // import #" << operand.index << ": " << *operand.sig; | |
| 1756 } | |
| 1757 break; | |
| 1758 } | |
| 1759 case kExprCallFunction: { | |
| 1760 FunctionIndexOperand operand(&decoder, pc); | |
| 1761 if (decoder.Validate(pc, operand)) { | |
| 1762 os << " // function #" << operand.index << ": " << *operand.sig; | |
| 1763 } | |
| 1764 break; | |
| 1765 } | |
| 1766 default: | |
| 1767 break; | |
| 1768 } | |
| 1769 } | |
| 1770 | |
| 1710 pc += length; | 1771 pc += length; |
| 1711 printf("\n"); | 1772 printf("\n"); |
| 1712 | 1773 |
| 1713 arity_stack.push_back(arity); | 1774 arity_stack.push_back(arity); |
| 1714 while (arity_stack.back() == 0) { | 1775 while (arity_stack.back() == 0) { |
| 1715 arity_stack.pop_back(); | 1776 arity_stack.pop_back(); |
| 1716 if (arity_stack.empty()) break; | 1777 if (arity_stack.empty()) break; |
| 1717 arity_stack.back()--; | 1778 arity_stack.back()--; |
| 1718 } | 1779 } |
| 1719 } | 1780 } |
| 1720 } | 1781 } |
| 1721 | 1782 |
| 1722 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, | 1783 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, |
| 1723 const byte* start, const byte* end) { | 1784 const byte* start, const byte* end) { |
| 1724 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; | 1785 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; |
| 1725 SR_WasmDecoder decoder(zone, nullptr, body); | 1786 SR_WasmDecoder decoder(zone, nullptr, body); |
| 1726 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); | 1787 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); |
| 1727 } | 1788 } |
| 1728 | 1789 |
| 1729 } // namespace wasm | 1790 } // namespace wasm |
| 1730 } // namespace internal | 1791 } // namespace internal |
| 1731 } // namespace v8 | 1792 } // namespace v8 |
| OLD | NEW |