Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/wasm/ast-decoder.cc

Issue 1956703002: [wasm] Improve output of PrintAstForDebugging. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/wasm/ast-decoder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
(...skipping 1506 matching lines...) Expand 10 before | Expand all | Expand 10 after
1517 int OpcodeLength(const byte* pc, const byte* end) { 1517 int OpcodeLength(const byte* pc, const byte* end) {
1518 WasmDecoder decoder(nullptr, nullptr, pc, end); 1518 WasmDecoder decoder(nullptr, nullptr, pc, end);
1519 return decoder.OpcodeLength(pc); 1519 return decoder.OpcodeLength(pc);
1520 } 1520 }
1521 1521
1522 int OpcodeArity(const byte* pc, const byte* end) { 1522 int OpcodeArity(const byte* pc, const byte* end) {
1523 WasmDecoder decoder(nullptr, nullptr, pc, end); 1523 WasmDecoder decoder(nullptr, nullptr, pc, end);
1524 return decoder.OpcodeArity(pc); 1524 return decoder.OpcodeArity(pc);
1525 } 1525 }
1526 1526
1527 void PrintAstForDebugging(const byte* start, const byte* end) {
1528 FunctionBody body = {nullptr, nullptr, start, start, end};
1529 base::AccountingAllocator allocator;
1530 PrintAst(&allocator, body);
1531 }
1532
1527 void PrintAst(base::AccountingAllocator* allocator, FunctionBody& body) { 1533 void PrintAst(base::AccountingAllocator* allocator, FunctionBody& body) {
1528 Zone zone(allocator); 1534 Zone zone(allocator);
1529 SR_WasmDecoder decoder(&zone, nullptr, body); 1535 SR_WasmDecoder decoder(&zone, nullptr, body);
1530 1536
1531 OFStream os(stdout); 1537 OFStream os(stdout);
1532 1538
1533 // Print the function signature. 1539 // Print the function signature.
1534 if (body.sig) { 1540 if (body.sig) {
1535 os << "// signature: " << *body.sig << std::endl; 1541 os << "// signature: " << *body.sig << std::endl;
1536 } 1542 }
1537 1543
1538 // Print the local declarations. 1544 // Print the local declarations.
1539 AstLocalDecls decls(&zone); 1545 AstLocalDecls decls(&zone);
1540 decoder.DecodeLocalDecls(decls); 1546 decoder.DecodeLocalDecls(decls);
1541 const byte* pc = decoder.pc(); 1547 const byte* pc = decoder.pc();
1542 if (body.start != decoder.pc()) { 1548 if (body.start != decoder.pc()) {
1543 printf("// locals:"); 1549 os << "// locals: ";
1544 for (auto p : decls.local_types) { 1550 for (auto p : decls.local_types) {
1545 LocalType type = p.first; 1551 LocalType type = p.first;
1546 uint32_t count = p.second; 1552 uint32_t count = p.second;
1547 os << " " << count << " " << WasmOpcodes::TypeName(type); 1553 os << " " << count << " " << WasmOpcodes::TypeName(type);
1548 } 1554 }
1549 os << std::endl; 1555 os << std::endl;
1550 1556
1551 for (const byte* locals = body.start; locals < pc; locals++) { 1557 for (const byte* locals = body.start; locals < pc; locals++) {
1552 printf(" 0x%02x,", *locals); 1558 printf(" 0x%02x,", *locals);
1553 } 1559 }
1554 printf("\n"); 1560 os << std::endl;
1555 } 1561 }
1556 1562
1557 printf("// body: \n"); 1563 os << "// body: \n";
1558 std::vector<int> arity_stack; 1564 int control_depth = 0;
1559 while (pc < body.end) { 1565 while (pc < body.end) {
1560 int arity = decoder.OpcodeArity(pc);
1561 size_t length = decoder.OpcodeLength(pc); 1566 size_t length = decoder.OpcodeLength(pc);
1562 1567
1563 for (auto arity : arity_stack) { 1568 WasmOpcode opcode = static_cast<WasmOpcode>(*pc);
1564 printf(" "); 1569 if (opcode == kExprElse) control_depth--;
1565 USE(arity);
1566 }
1567 1570
1568 WasmOpcode opcode = static_cast<WasmOpcode>(*pc); 1571 for (int i = 0; i < control_depth && i < 32; i++) printf(" ");
1569 printf("k%s,", WasmOpcodes::OpcodeName(opcode)); 1572 printf("k%s,", WasmOpcodes::OpcodeName(opcode));
1570 1573
1571 for (size_t i = 1; i < length; i++) { 1574 for (size_t i = 1; i < length; i++) {
1572 printf(" 0x%02x,", pc[i]); 1575 printf(" 0x%02x,", pc[i]);
1573 } 1576 }
1574 1577
1575 if (body.module) { 1578 switch (opcode) {
1576 switch (opcode) { 1579 case kExprIf:
1577 case kExprCallIndirect: { 1580 case kExprElse:
1578 CallIndirectOperand operand(&decoder, pc); 1581 case kExprLoop:
1579 if (decoder.Validate(pc, operand)) { 1582 case kExprBlock:
1580 os << " // sig #" << operand.index << ": " << *operand.sig; 1583 os << " // @" << static_cast<int>(pc - body.start);
1581 } 1584 control_depth++;
1582 break; 1585 break;
1586 case kExprEnd:
1587 os << " // @" << static_cast<int>(pc - body.start);
1588 control_depth--;
1589 break;
1590 case kExprBr: {
1591 BreakDepthOperand operand(&decoder, pc);
1592 os << " // arity=" << operand.arity << " depth=" << operand.depth;
1593 break;
1594 }
1595 case kExprBrIf: {
1596 BreakDepthOperand operand(&decoder, pc);
1597 os << " // arity=" << operand.arity << " depth" << operand.depth;
1598 break;
1599 }
1600 case kExprBrTable: {
1601 BranchTableOperand operand(&decoder, pc);
1602 os << " // arity=" << operand.arity
1603 << " entries=" << operand.table_count;
1604 break;
1605 }
1606 case kExprCallIndirect: {
1607 CallIndirectOperand operand(&decoder, pc);
1608 if (decoder.Validate(pc, operand)) {
1609 os << " // sig #" << operand.index << ": " << *operand.sig;
1610 } else {
1611 os << " // arity=" << operand.arity << " sig #" << operand.index;
1583 } 1612 }
1584 case kExprCallImport: { 1613 break;
1585 CallImportOperand operand(&decoder, pc); 1614 }
1586 if (decoder.Validate(pc, operand)) { 1615 case kExprCallImport: {
1587 os << " // import #" << operand.index << ": " << *operand.sig; 1616 CallImportOperand operand(&decoder, pc);
1588 } 1617 if (decoder.Validate(pc, operand)) {
1589 break; 1618 os << " // import #" << operand.index << ": " << *operand.sig;
1619 } else {
1620 os << " // arity=" << operand.arity << " import #" << operand.index;
1590 } 1621 }
1591 case kExprCallFunction: { 1622 break;
1592 CallFunctionOperand operand(&decoder, pc); 1623 }
1593 if (decoder.Validate(pc, operand)) { 1624 case kExprCallFunction: {
1594 os << " // function #" << operand.index << ": " << *operand.sig; 1625 CallFunctionOperand operand(&decoder, pc);
1595 } 1626 if (decoder.Validate(pc, operand)) {
1596 break; 1627 os << " // function #" << operand.index << ": " << *operand.sig;
1628 } else {
1629 os << " // arity=" << operand.arity << " function #" << operand.index;
1597 } 1630 }
1598 default: 1631 break;
1599 break;
1600 } 1632 }
1601 } 1633 case kExprReturn: {
1634 ReturnArityOperand operand(&decoder, pc);
1635 os << " // arity=" << operand.arity;
1636 break;
1637 }
1638 default:
1639 break;
1640 }
1602 1641
1603 pc += length; 1642 pc += length;
1604 printf("\n"); 1643 os << std::endl;
1605
1606 arity_stack.push_back(arity);
1607 while (arity_stack.back() == 0) {
1608 arity_stack.pop_back();
1609 if (arity_stack.empty()) break;
1610 arity_stack.back()--;
1611 }
1612 } 1644 }
1613 } 1645 }
1614 1646
1615 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, 1647 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals,
1616 const byte* start, const byte* end) { 1648 const byte* start, const byte* end) {
1617 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; 1649 FunctionBody body = {nullptr, nullptr, nullptr, start, end};
1618 SR_WasmDecoder decoder(zone, nullptr, body); 1650 SR_WasmDecoder decoder(zone, nullptr, body);
1619 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); 1651 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals);
1620 } 1652 }
1621 1653
1622 } // namespace wasm 1654 } // namespace wasm
1623 } // namespace internal 1655 } // namespace internal
1624 } // namespace v8 1656 } // namespace v8
OLDNEW
« no previous file with comments | « src/wasm/ast-decoder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698