OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/wasm/wasm-interpreter.h" | 5 #include "src/wasm/wasm-interpreter.h" |
6 | 6 |
7 #include "src/utils.h" | 7 #include "src/utils.h" |
8 #include "src/wasm/ast-decoder.h" | 8 #include "src/wasm/ast-decoder.h" |
9 #include "src/wasm/decoder.h" | 9 #include "src/wasm/decoder.h" |
10 #include "src/wasm/wasm-external-refs.h" | 10 #include "src/wasm/wasm-external-refs.h" |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 | 648 |
649 static inline int32_t ExecuteI32ReinterpretF32(float a, TrapReason* trap) { | 649 static inline int32_t ExecuteI32ReinterpretF32(float a, TrapReason* trap) { |
650 return bit_cast<int32_t>(a); | 650 return bit_cast<int32_t>(a); |
651 } | 651 } |
652 | 652 |
653 static inline int64_t ExecuteI64ReinterpretF64(double a, TrapReason* trap) { | 653 static inline int64_t ExecuteI64ReinterpretF64(double a, TrapReason* trap) { |
654 return bit_cast<int64_t>(a); | 654 return bit_cast<int64_t>(a); |
655 } | 655 } |
656 | 656 |
657 static inline int32_t ExecuteGrowMemory(uint32_t delta_pages, | 657 static inline int32_t ExecuteGrowMemory(uint32_t delta_pages, |
658 WasmModuleInstance* instance) { | 658 WasmInstance* instance) { |
659 // TODO(ahaas): Move memory allocation to wasm-module.cc for better | 659 // TODO(ahaas): Move memory allocation to wasm-module.cc for better |
660 // encapsulation. | 660 // encapsulation. |
661 if (delta_pages > wasm::WasmModule::kMaxMemPages) { | 661 if (delta_pages > wasm::WasmModule::kMaxMemPages) { |
662 return -1; | 662 return -1; |
663 } | 663 } |
664 uint32_t old_size = instance->mem_size; | 664 uint32_t old_size = instance->mem_size; |
665 uint32_t new_size; | 665 uint32_t new_size; |
666 byte* new_mem_start; | 666 byte* new_mem_start; |
667 if (instance->mem_size == 0) { | 667 if (instance->mem_size == 0) { |
668 if (delta_pages > wasm::WasmModule::kMaxMemPages) { | 668 if (delta_pages > wasm::WasmModule::kMaxMemPages) { |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 code->start = const_cast<byte*>(start); | 960 code->start = const_cast<byte*>(start); |
961 code->end = const_cast<byte*>(end); | 961 code->end = const_cast<byte*>(end); |
962 Preprocess(code); | 962 Preprocess(code); |
963 return true; | 963 return true; |
964 } | 964 } |
965 }; | 965 }; |
966 | 966 |
967 // Responsible for executing code directly. | 967 // Responsible for executing code directly. |
968 class ThreadImpl : public WasmInterpreter::Thread { | 968 class ThreadImpl : public WasmInterpreter::Thread { |
969 public: | 969 public: |
970 ThreadImpl(Zone* zone, CodeMap* codemap, WasmModuleInstance* instance) | 970 ThreadImpl(Zone* zone, CodeMap* codemap, WasmInstance* instance) |
971 : codemap_(codemap), | 971 : codemap_(codemap), |
972 instance_(instance), | 972 instance_(instance), |
973 stack_(zone), | 973 stack_(zone), |
974 frames_(zone), | 974 frames_(zone), |
975 blocks_(zone), | 975 blocks_(zone), |
976 state_(WasmInterpreter::STOPPED), | 976 state_(WasmInterpreter::STOPPED), |
977 break_pc_(kInvalidPc), | 977 break_pc_(kInvalidPc), |
978 trap_reason_(kTrapCount) {} | 978 trap_reason_(kTrapCount) {} |
979 | 979 |
980 virtual ~ThreadImpl() {} | 980 virtual ~ThreadImpl() {} |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1073 }; | 1073 }; |
1074 | 1074 |
1075 struct Block { | 1075 struct Block { |
1076 pc_t pc; | 1076 pc_t pc; |
1077 sp_t sp; | 1077 sp_t sp; |
1078 size_t fp; | 1078 size_t fp; |
1079 unsigned arity; | 1079 unsigned arity; |
1080 }; | 1080 }; |
1081 | 1081 |
1082 CodeMap* codemap_; | 1082 CodeMap* codemap_; |
1083 WasmModuleInstance* instance_; | 1083 WasmInstance* instance_; |
1084 ZoneVector<WasmVal> stack_; | 1084 ZoneVector<WasmVal> stack_; |
1085 ZoneVector<Frame> frames_; | 1085 ZoneVector<Frame> frames_; |
1086 ZoneVector<Block> blocks_; | 1086 ZoneVector<Block> blocks_; |
1087 WasmInterpreter::State state_; | 1087 WasmInterpreter::State state_; |
1088 pc_t break_pc_; | 1088 pc_t break_pc_; |
1089 TrapReason trap_reason_; | 1089 TrapReason trap_reason_; |
1090 | 1090 |
1091 CodeMap* codemap() { return codemap_; } | 1091 CodeMap* codemap() { return codemap_; } |
1092 WasmModuleInstance* instance() { return instance_; } | 1092 WasmInstance* instance() { return instance_; } |
1093 const WasmModule* module() { return instance_->module; } | 1093 const WasmModule* module() { return instance_->module; } |
1094 | 1094 |
1095 void DoTrap(TrapReason trap, pc_t pc) { | 1095 void DoTrap(TrapReason trap, pc_t pc) { |
1096 state_ = WasmInterpreter::TRAPPED; | 1096 state_ = WasmInterpreter::TRAPPED; |
1097 trap_reason_ = trap; | 1097 trap_reason_ = trap; |
1098 CommitPc(pc); | 1098 CommitPc(pc); |
1099 } | 1099 } |
1100 | 1100 |
1101 // Push a frame with arguments already on the stack. | 1101 // Push a frame with arguments already on the stack. |
1102 void PushFrame(InterpreterCode* code, pc_t call_pc, pc_t ret_pc) { | 1102 void PushFrame(InterpreterCode* code, pc_t call_pc, pc_t ret_pc) { |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1711 } | 1711 } |
1712 } | 1712 } |
1713 } | 1713 } |
1714 }; | 1714 }; |
1715 | 1715 |
1716 //============================================================================ | 1716 //============================================================================ |
1717 // The implementation details of the interpreter. | 1717 // The implementation details of the interpreter. |
1718 //============================================================================ | 1718 //============================================================================ |
1719 class WasmInterpreterInternals : public ZoneObject { | 1719 class WasmInterpreterInternals : public ZoneObject { |
1720 public: | 1720 public: |
1721 WasmModuleInstance* instance_; | 1721 WasmInstance* instance_; |
1722 CodeMap codemap_; | 1722 CodeMap codemap_; |
1723 ZoneVector<ThreadImpl*> threads_; | 1723 ZoneVector<ThreadImpl*> threads_; |
1724 | 1724 |
1725 WasmInterpreterInternals(Zone* zone, WasmModuleInstance* instance) | 1725 WasmInterpreterInternals(Zone* zone, WasmInstance* instance) |
1726 : instance_(instance), | 1726 : instance_(instance), |
1727 codemap_(instance_ ? instance_->module : nullptr, zone), | 1727 codemap_(instance_ ? instance_->module : nullptr, zone), |
1728 threads_(zone) { | 1728 threads_(zone) { |
1729 threads_.push_back(new ThreadImpl(zone, &codemap_, instance)); | 1729 threads_.push_back(new ThreadImpl(zone, &codemap_, instance)); |
1730 } | 1730 } |
1731 | 1731 |
1732 void Delete() { | 1732 void Delete() { |
1733 // TODO(titzer): CFI doesn't like threads in the ZoneVector. | 1733 // TODO(titzer): CFI doesn't like threads in the ZoneVector. |
1734 for (auto t : threads_) delete t; | 1734 for (auto t : threads_) delete t; |
1735 threads_.resize(0); | 1735 threads_.resize(0); |
1736 } | 1736 } |
1737 }; | 1737 }; |
1738 | 1738 |
1739 //============================================================================ | 1739 //============================================================================ |
1740 // Implementation of the public interface of the interpreter. | 1740 // Implementation of the public interface of the interpreter. |
1741 //============================================================================ | 1741 //============================================================================ |
1742 WasmInterpreter::WasmInterpreter(WasmModuleInstance* instance, | 1742 WasmInterpreter::WasmInterpreter(WasmInstance* instance, |
1743 AccountingAllocator* allocator) | 1743 AccountingAllocator* allocator) |
1744 : zone_(allocator), | 1744 : zone_(allocator), |
1745 internals_(new (&zone_) WasmInterpreterInternals(&zone_, instance)) {} | 1745 internals_(new (&zone_) WasmInterpreterInternals(&zone_, instance)) {} |
1746 | 1746 |
1747 WasmInterpreter::~WasmInterpreter() { internals_->Delete(); } | 1747 WasmInterpreter::~WasmInterpreter() { internals_->Delete(); } |
1748 | 1748 |
1749 void WasmInterpreter::Run() { internals_->threads_[0]->Run(); } | 1749 void WasmInterpreter::Run() { internals_->threads_[0]->Run(); } |
1750 | 1750 |
1751 void WasmInterpreter::Pause() { internals_->threads_[0]->Pause(); } | 1751 void WasmInterpreter::Pause() { internals_->threads_[0]->Pause(); } |
1752 | 1752 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1844 | 1844 |
1845 ControlTransferMap WasmInterpreter::ComputeControlTransfersForTesting( | 1845 ControlTransferMap WasmInterpreter::ComputeControlTransfersForTesting( |
1846 Zone* zone, const byte* start, const byte* end) { | 1846 Zone* zone, const byte* start, const byte* end) { |
1847 ControlTransfers targets(zone, nullptr, nullptr, start, end); | 1847 ControlTransfers targets(zone, nullptr, nullptr, start, end); |
1848 return targets.map_; | 1848 return targets.map_; |
1849 } | 1849 } |
1850 | 1850 |
1851 } // namespace wasm | 1851 } // namespace wasm |
1852 } // namespace internal | 1852 } // namespace internal |
1853 } // namespace v8 | 1853 } // namespace v8 |
OLD | NEW |