| 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" |
| (...skipping 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1457 | 1457 |
| 1458 bool DecodeLocalDecls(AstLocalDecls& decls, const byte* start, | 1458 bool DecodeLocalDecls(AstLocalDecls& decls, const byte* start, |
| 1459 const byte* end) { | 1459 const byte* end) { |
| 1460 base::AccountingAllocator allocator; | 1460 base::AccountingAllocator allocator; |
| 1461 Zone tmp(&allocator); | 1461 Zone tmp(&allocator); |
| 1462 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; | 1462 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; |
| 1463 WasmFullDecoder decoder(&tmp, nullptr, body); | 1463 WasmFullDecoder decoder(&tmp, nullptr, body); |
| 1464 return decoder.DecodeLocalDecls(decls); | 1464 return decoder.DecodeLocalDecls(decls); |
| 1465 } | 1465 } |
| 1466 | 1466 |
| 1467 BytecodeIterator::BytecodeIterator(const byte* start, const byte* end, |
| 1468 AstLocalDecls* decls) |
| 1469 : Decoder(start, end) { |
| 1470 if (decls != nullptr) { |
| 1471 if (DecodeLocalDecls(*decls, start, end)) { |
| 1472 pc_ += decls->decls_encoded_size; |
| 1473 if (pc_ > end_) pc_ = end_; |
| 1474 } |
| 1475 } |
| 1476 } |
| 1477 |
| 1467 DecodeResult VerifyWasmCode(base::AccountingAllocator* allocator, | 1478 DecodeResult VerifyWasmCode(base::AccountingAllocator* allocator, |
| 1468 FunctionBody& body) { | 1479 FunctionBody& body) { |
| 1469 Zone zone(allocator); | 1480 Zone zone(allocator); |
| 1470 WasmFullDecoder decoder(&zone, nullptr, body); | 1481 WasmFullDecoder decoder(&zone, nullptr, body); |
| 1471 decoder.Decode(); | 1482 decoder.Decode(); |
| 1472 return decoder.toResult<DecodeStruct*>(nullptr); | 1483 return decoder.toResult<DecodeStruct*>(nullptr); |
| 1473 } | 1484 } |
| 1474 | 1485 |
| 1475 DecodeResult BuildTFGraph(base::AccountingAllocator* allocator, | 1486 DecodeResult BuildTFGraph(base::AccountingAllocator* allocator, |
| 1476 TFBuilder* builder, FunctionBody& body) { | 1487 TFBuilder* builder, FunctionBody& body) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1504 int line_nr = 0; | 1515 int line_nr = 0; |
| 1505 | 1516 |
| 1506 // Print the function signature. | 1517 // Print the function signature. |
| 1507 if (body.sig) { | 1518 if (body.sig) { |
| 1508 os << "// signature: " << *body.sig << std::endl; | 1519 os << "// signature: " << *body.sig << std::endl; |
| 1509 ++line_nr; | 1520 ++line_nr; |
| 1510 } | 1521 } |
| 1511 | 1522 |
| 1512 // Print the local declarations. | 1523 // Print the local declarations. |
| 1513 AstLocalDecls decls(&zone); | 1524 AstLocalDecls decls(&zone); |
| 1514 decoder.DecodeLocalDecls(decls); | 1525 BytecodeIterator i(body.start, body.end, &decls); |
| 1515 const byte* pc = decoder.pc(); | 1526 if (body.start != i.pc()) { |
| 1516 if (body.start != decoder.pc()) { | |
| 1517 os << "// locals: "; | 1527 os << "// locals: "; |
| 1518 for (auto p : decls.local_types) { | 1528 for (auto p : decls.local_types) { |
| 1519 LocalType type = p.first; | 1529 LocalType type = p.first; |
| 1520 uint32_t count = p.second; | 1530 uint32_t count = p.second; |
| 1521 os << " " << count << " " << WasmOpcodes::TypeName(type); | 1531 os << " " << count << " " << WasmOpcodes::TypeName(type); |
| 1522 } | 1532 } |
| 1523 os << std::endl; | 1533 os << std::endl; |
| 1524 ++line_nr; | 1534 ++line_nr; |
| 1525 | 1535 |
| 1526 for (const byte* locals = body.start; locals < pc; locals++) { | 1536 for (const byte* locals = body.start; locals < i.pc(); locals++) { |
| 1527 os << (locals == body.start ? "0x" : " 0x") << AsHex(*locals, 2) << ","; | 1537 os << (locals == body.start ? "0x" : " 0x") << AsHex(*locals, 2) << ","; |
| 1528 } | 1538 } |
| 1529 os << std::endl; | 1539 os << std::endl; |
| 1530 ++line_nr; | 1540 ++line_nr; |
| 1531 } | 1541 } |
| 1532 | 1542 |
| 1533 os << "// body: " << std::endl; | 1543 os << "// body: " << std::endl; |
| 1534 ++line_nr; | 1544 ++line_nr; |
| 1535 unsigned control_depth = 0; | 1545 unsigned control_depth = 0; |
| 1536 while (pc < body.end) { | 1546 for (; i.has_next(); i.next()) { |
| 1537 unsigned length = decoder.OpcodeLength(pc); | 1547 unsigned length = decoder.OpcodeLength(i.pc()); |
| 1538 | 1548 |
| 1539 WasmOpcode opcode = static_cast<WasmOpcode>(*pc); | 1549 WasmOpcode opcode = i.current(); |
| 1540 if (opcode == kExprElse) control_depth--; | 1550 if (opcode == kExprElse) control_depth--; |
| 1541 | 1551 |
| 1542 int num_whitespaces = control_depth < 32 ? 2 * control_depth : 64; | 1552 int num_whitespaces = control_depth < 32 ? 2 * control_depth : 64; |
| 1543 if (offset_table) { | 1553 if (offset_table) { |
| 1544 offset_table->push_back( | 1554 offset_table->push_back( |
| 1545 std::make_tuple(pc - body.start, line_nr, num_whitespaces)); | 1555 std::make_tuple(i.pc_offset(), line_nr, num_whitespaces)); |
| 1546 } | 1556 } |
| 1547 | 1557 |
| 1548 // 64 whitespaces | 1558 // 64 whitespaces |
| 1549 const char* padding = | 1559 const char* padding = |
| 1550 " "; | 1560 " "; |
| 1551 os.write(padding, num_whitespaces); | 1561 os.write(padding, num_whitespaces); |
| 1552 os << "k" << WasmOpcodes::OpcodeName(opcode) << ","; | 1562 os << "k" << WasmOpcodes::OpcodeName(opcode) << ","; |
| 1553 | 1563 |
| 1554 for (size_t i = 1; i < length; ++i) { | 1564 for (size_t j = 1; j < length; ++j) { |
| 1555 os << " " << AsHex(pc[i], 2) << ","; | 1565 os << " " << AsHex(i.pc()[j], 2) << ","; |
| 1556 } | 1566 } |
| 1557 | 1567 |
| 1558 switch (opcode) { | 1568 switch (opcode) { |
| 1559 case kExprIf: | 1569 case kExprIf: |
| 1560 case kExprElse: | 1570 case kExprElse: |
| 1561 case kExprLoop: | 1571 case kExprLoop: |
| 1562 case kExprBlock: | 1572 case kExprBlock: |
| 1563 os << " // @" << static_cast<int>(pc - body.start); | 1573 os << " // @" << i.pc_offset(); |
| 1564 control_depth++; | 1574 control_depth++; |
| 1565 break; | 1575 break; |
| 1566 case kExprEnd: | 1576 case kExprEnd: |
| 1567 os << " // @" << static_cast<int>(pc - body.start); | 1577 os << " // @" << i.pc_offset(); |
| 1568 control_depth--; | 1578 control_depth--; |
| 1569 break; | 1579 break; |
| 1570 case kExprBr: { | 1580 case kExprBr: { |
| 1571 BreakDepthOperand operand(&decoder, pc); | 1581 BreakDepthOperand operand(&i, i.pc()); |
| 1572 os << " // arity=" << operand.arity << " depth=" << operand.depth; | 1582 os << " // arity=" << operand.arity << " depth=" << operand.depth; |
| 1573 break; | 1583 break; |
| 1574 } | 1584 } |
| 1575 case kExprBrIf: { | 1585 case kExprBrIf: { |
| 1576 BreakDepthOperand operand(&decoder, pc); | 1586 BreakDepthOperand operand(&i, i.pc()); |
| 1577 os << " // arity=" << operand.arity << " depth" << operand.depth; | 1587 os << " // arity=" << operand.arity << " depth" << operand.depth; |
| 1578 break; | 1588 break; |
| 1579 } | 1589 } |
| 1580 case kExprBrTable: { | 1590 case kExprBrTable: { |
| 1581 BranchTableOperand operand(&decoder, pc); | 1591 BranchTableOperand operand(&i, i.pc()); |
| 1582 os << " // arity=" << operand.arity | 1592 os << " // arity=" << operand.arity |
| 1583 << " entries=" << operand.table_count; | 1593 << " entries=" << operand.table_count; |
| 1584 break; | 1594 break; |
| 1585 } | 1595 } |
| 1586 case kExprCallIndirect: { | 1596 case kExprCallIndirect: { |
| 1587 CallIndirectOperand operand(&decoder, pc); | 1597 CallIndirectOperand operand(&i, i.pc()); |
| 1588 if (decoder.Complete(pc, operand)) { | 1598 if (decoder.Complete(i.pc(), operand)) { |
| 1589 os << " // sig #" << operand.index << ": " << *operand.sig; | 1599 os << " // sig #" << operand.index << ": " << *operand.sig; |
| 1590 } else { | 1600 } else { |
| 1591 os << " // arity=" << operand.arity << " sig #" << operand.index; | 1601 os << " // arity=" << operand.arity << " sig #" << operand.index; |
| 1592 } | 1602 } |
| 1593 break; | 1603 break; |
| 1594 } | 1604 } |
| 1595 case kExprCallImport: { | 1605 case kExprCallImport: { |
| 1596 CallImportOperand operand(&decoder, pc); | 1606 CallImportOperand operand(&i, i.pc()); |
| 1597 if (decoder.Complete(pc, operand)) { | 1607 if (decoder.Complete(i.pc(), operand)) { |
| 1598 os << " // import #" << operand.index << ": " << *operand.sig; | 1608 os << " // import #" << operand.index << ": " << *operand.sig; |
| 1599 } else { | 1609 } else { |
| 1600 os << " // arity=" << operand.arity << " import #" << operand.index; | 1610 os << " // arity=" << operand.arity << " import #" << operand.index; |
| 1601 } | 1611 } |
| 1602 break; | 1612 break; |
| 1603 } | 1613 } |
| 1604 case kExprCallFunction: { | 1614 case kExprCallFunction: { |
| 1605 CallFunctionOperand operand(&decoder, pc); | 1615 CallFunctionOperand operand(&i, i.pc()); |
| 1606 if (decoder.Complete(pc, operand)) { | 1616 if (decoder.Complete(i.pc(), operand)) { |
| 1607 os << " // function #" << operand.index << ": " << *operand.sig; | 1617 os << " // function #" << operand.index << ": " << *operand.sig; |
| 1608 } else { | 1618 } else { |
| 1609 os << " // arity=" << operand.arity << " function #" << operand.index; | 1619 os << " // arity=" << operand.arity << " function #" << operand.index; |
| 1610 } | 1620 } |
| 1611 break; | 1621 break; |
| 1612 } | 1622 } |
| 1613 case kExprReturn: { | 1623 case kExprReturn: { |
| 1614 ReturnArityOperand operand(&decoder, pc); | 1624 ReturnArityOperand operand(&i, i.pc()); |
| 1615 os << " // arity=" << operand.arity; | 1625 os << " // arity=" << operand.arity; |
| 1616 break; | 1626 break; |
| 1617 } | 1627 } |
| 1618 default: | 1628 default: |
| 1619 break; | 1629 break; |
| 1620 } | 1630 } |
| 1621 | |
| 1622 pc += length; | |
| 1623 os << std::endl; | 1631 os << std::endl; |
| 1624 ++line_nr; | 1632 ++line_nr; |
| 1625 } | 1633 } |
| 1626 | 1634 |
| 1627 return decoder.ok(); | 1635 return decoder.ok(); |
| 1628 } | 1636 } |
| 1629 | 1637 |
| 1630 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, | 1638 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, |
| 1631 const byte* start, const byte* end) { | 1639 const byte* start, const byte* end) { |
| 1632 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; | 1640 FunctionBody body = {nullptr, nullptr, nullptr, start, end}; |
| 1633 WasmFullDecoder decoder(zone, nullptr, body); | 1641 WasmFullDecoder decoder(zone, nullptr, body); |
| 1634 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); | 1642 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); |
| 1635 } | 1643 } |
| 1636 | 1644 |
| 1637 } // namespace wasm | 1645 } // namespace wasm |
| 1638 } // namespace internal | 1646 } // namespace internal |
| 1639 } // namespace v8 | 1647 } // namespace v8 |
| OLD | NEW |