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/zone-containers.h" | 10 #include "src/zone/zone-containers.h" |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 // Initialize {local_type_vec} from signature. | 590 // Initialize {local_type_vec} from signature. |
591 if (sig_) { | 591 if (sig_) { |
592 local_type_vec_.reserve(sig_->parameter_count()); | 592 local_type_vec_.reserve(sig_->parameter_count()); |
593 for (size_t i = 0; i < sig_->parameter_count(); ++i) { | 593 for (size_t i = 0; i < sig_->parameter_count(); ++i) { |
594 local_type_vec_.push_back(sig_->GetParam(i)); | 594 local_type_vec_.push_back(sig_->GetParam(i)); |
595 } | 595 } |
596 } | 596 } |
597 // Decode local declarations, if any. | 597 // Decode local declarations, if any. |
598 uint32_t entries = consume_u32v("local decls count"); | 598 uint32_t entries = consume_u32v("local decls count"); |
599 TRACE("local decls count: %u\n", entries); | 599 TRACE("local decls count: %u\n", entries); |
600 while (entries-- > 0 && pc_ < limit_) { | 600 while (entries-- > 0 && pc_ < end_) { |
601 uint32_t count = consume_u32v("local count"); | 601 uint32_t count = consume_u32v("local count"); |
602 if ((count + local_type_vec_.size()) > kMaxNumWasmLocals) { | 602 if ((count + local_type_vec_.size()) > kMaxNumWasmLocals) { |
603 error(pc_ - 1, "local count too large"); | 603 error(pc_ - 1, "local count too large"); |
604 return; | 604 return; |
605 } | 605 } |
606 byte code = consume_u8("local type"); | 606 byte code = consume_u8("local type"); |
607 ValueType type; | 607 ValueType type; |
608 switch (code) { | 608 switch (code) { |
609 case kLocalI32: | 609 case kLocalI32: |
610 type = kWasmI32; | 610 type = kWasmI32; |
(...skipping 16 matching lines...) Expand all Loading... |
627 } | 627 } |
628 local_type_vec_.insert(local_type_vec_.end(), count, type); | 628 local_type_vec_.insert(local_type_vec_.end(), count, type); |
629 } | 629 } |
630 total_locals_ = local_type_vec_.size(); | 630 total_locals_ = local_type_vec_.size(); |
631 } | 631 } |
632 | 632 |
633 // Decodes the body of a function. | 633 // Decodes the body of a function. |
634 void DecodeFunctionBody() { | 634 void DecodeFunctionBody() { |
635 TRACE("wasm-decode %p...%p (module+%d, %d bytes) %s\n", | 635 TRACE("wasm-decode %p...%p (module+%d, %d bytes) %s\n", |
636 reinterpret_cast<const void*>(start_), | 636 reinterpret_cast<const void*>(start_), |
637 reinterpret_cast<const void*>(limit_), baserel(pc_), | 637 reinterpret_cast<const void*>(end_), baserel(pc_), |
638 static_cast<int>(limit_ - start_), builder_ ? "graph building" : ""); | 638 static_cast<int>(end_ - start_), builder_ ? "graph building" : ""); |
639 | 639 |
640 { | 640 { |
641 // Set up initial function block. | 641 // Set up initial function block. |
642 SsaEnv* break_env = ssa_env_; | 642 SsaEnv* break_env = ssa_env_; |
643 SetEnv("initial env", Steal(break_env)); | 643 SetEnv("initial env", Steal(break_env)); |
644 PushBlock(break_env); | 644 PushBlock(break_env); |
645 Control* c = &control_.back(); | 645 Control* c = &control_.back(); |
646 c->merge.arity = static_cast<uint32_t>(sig_->return_count()); | 646 c->merge.arity = static_cast<uint32_t>(sig_->return_count()); |
647 | 647 |
648 if (c->merge.arity == 1) { | 648 if (c->merge.arity == 1) { |
649 c->merge.vals.first = {pc_, nullptr, sig_->GetReturn(0)}; | 649 c->merge.vals.first = {pc_, nullptr, sig_->GetReturn(0)}; |
650 } else if (c->merge.arity > 1) { | 650 } else if (c->merge.arity > 1) { |
651 c->merge.vals.array = zone_->NewArray<Value>(c->merge.arity); | 651 c->merge.vals.array = zone_->NewArray<Value>(c->merge.arity); |
652 for (unsigned i = 0; i < c->merge.arity; i++) { | 652 for (unsigned i = 0; i < c->merge.arity; i++) { |
653 c->merge.vals.array[i] = {pc_, nullptr, sig_->GetReturn(i)}; | 653 c->merge.vals.array[i] = {pc_, nullptr, sig_->GetReturn(i)}; |
654 } | 654 } |
655 } | 655 } |
656 } | 656 } |
657 | 657 |
658 if (pc_ >= limit_) return; // Nothing to do. | 658 if (pc_ >= end_) return; // Nothing to do. |
659 | 659 |
660 while (true) { // decoding loop. | 660 while (true) { // decoding loop. |
661 unsigned len = 1; | 661 unsigned len = 1; |
662 WasmOpcode opcode = static_cast<WasmOpcode>(*pc_); | 662 WasmOpcode opcode = static_cast<WasmOpcode>(*pc_); |
663 if (!WasmOpcodes::IsPrefixOpcode(opcode)) { | 663 if (!WasmOpcodes::IsPrefixOpcode(opcode)) { |
664 TRACE(" @%-8d #%02x:%-20s|", startrel(pc_), opcode, | 664 TRACE(" @%-8d #%02x:%-20s|", startrel(pc_), opcode, |
665 WasmOpcodes::ShortOpcodeName(opcode)); | 665 WasmOpcodes::ShortOpcodeName(opcode)); |
666 } | 666 } |
667 | 667 |
668 FunctionSig* sig = WasmOpcodes::Signature(opcode); | 668 FunctionSig* sig = WasmOpcodes::Signature(opcode); |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1239 break; | 1239 break; |
1240 } | 1240 } |
1241 default: | 1241 default: |
1242 break; | 1242 break; |
1243 } | 1243 } |
1244 } | 1244 } |
1245 PrintF("\n"); | 1245 PrintF("\n"); |
1246 } | 1246 } |
1247 #endif | 1247 #endif |
1248 pc_ += len; | 1248 pc_ += len; |
1249 if (pc_ >= limit_) { | 1249 if (pc_ >= end_) { |
1250 // End of code reached or exceeded. | 1250 // End of code reached or exceeded. |
1251 if (pc_ > limit_ && ok()) error("Beyond end of code"); | 1251 if (pc_ > end_ && ok()) error("Beyond end of code"); |
1252 return; | 1252 return; |
1253 } | 1253 } |
1254 } // end decode loop | 1254 } // end decode loop |
1255 } | 1255 } |
1256 | 1256 |
1257 void EndControl() { ssa_env_->Kill(SsaEnv::kControlEnd); } | 1257 void EndControl() { ssa_env_->Kill(SsaEnv::kControlEnd); } |
1258 | 1258 |
1259 void SetBlockType(Control* c, BlockTypeOperand& operand) { | 1259 void SetBlockType(Control* c, BlockTypeOperand& operand) { |
1260 c->merge.arity = operand.arity; | 1260 c->merge.arity = operand.arity; |
1261 if (c->merge.arity == 1) { | 1261 if (c->merge.arity == 1) { |
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1816 result->locals = nullptr; | 1816 result->locals = nullptr; |
1817 return result; | 1817 return result; |
1818 } | 1818 } |
1819 | 1819 |
1820 int EnvironmentCount() { | 1820 int EnvironmentCount() { |
1821 if (builder_) return static_cast<int>(local_type_vec_.size()); | 1821 if (builder_) return static_cast<int>(local_type_vec_.size()); |
1822 return 0; // if we aren't building a graph, don't bother with SSA renaming. | 1822 return 0; // if we aren't building a graph, don't bother with SSA renaming. |
1823 } | 1823 } |
1824 | 1824 |
1825 virtual void onFirstError() { | 1825 virtual void onFirstError() { |
1826 limit_ = start_; // Terminate decoding loop. | 1826 end_ = start_; // Terminate decoding loop. |
1827 builder_ = nullptr; // Don't build any more nodes. | 1827 builder_ = nullptr; // Don't build any more nodes. |
1828 TRACE(" !%s\n", error_msg_.get()); | 1828 TRACE(" !%s\n", error_msg_.get()); |
1829 } | 1829 } |
1830 BitVector* AnalyzeLoopAssignment(const byte* pc) { | 1830 BitVector* AnalyzeLoopAssignment(const byte* pc) { |
1831 if (pc >= limit_) return nullptr; | 1831 if (pc >= end_) return nullptr; |
1832 if (*pc != kExprLoop) return nullptr; | 1832 if (*pc != kExprLoop) return nullptr; |
1833 | 1833 |
1834 BitVector* assigned = | 1834 BitVector* assigned = |
1835 new (zone_) BitVector(static_cast<int>(local_type_vec_.size()), zone_); | 1835 new (zone_) BitVector(static_cast<int>(local_type_vec_.size()), zone_); |
1836 int depth = 0; | 1836 int depth = 0; |
1837 // Iteratively process all AST nodes nested inside the loop. | 1837 // Iteratively process all AST nodes nested inside the loop. |
1838 while (pc < limit_ && ok()) { | 1838 while (pc < end_ && ok()) { |
1839 WasmOpcode opcode = static_cast<WasmOpcode>(*pc); | 1839 WasmOpcode opcode = static_cast<WasmOpcode>(*pc); |
1840 unsigned length = 1; | 1840 unsigned length = 1; |
1841 switch (opcode) { | 1841 switch (opcode) { |
1842 case kExprLoop: | 1842 case kExprLoop: |
1843 case kExprIf: | 1843 case kExprIf: |
1844 case kExprBlock: | 1844 case kExprBlock: |
1845 case kExprTry: | 1845 case kExprTry: |
1846 length = OpcodeLength(pc); | 1846 length = OpcodeLength(pc); |
1847 depth++; | 1847 depth++; |
1848 break; | 1848 break; |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2071 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, | 2071 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, |
2072 const byte* start, const byte* end) { | 2072 const byte* start, const byte* end) { |
2073 FunctionBody body = {nullptr, nullptr, start, end}; | 2073 FunctionBody body = {nullptr, nullptr, start, end}; |
2074 WasmFullDecoder decoder(zone, body); | 2074 WasmFullDecoder decoder(zone, body); |
2075 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); | 2075 return decoder.AnalyzeLoopAssignmentForTesting(start, num_locals); |
2076 } | 2076 } |
2077 | 2077 |
2078 } // namespace wasm | 2078 } // namespace wasm |
2079 } // namespace internal | 2079 } // namespace internal |
2080 } // namespace v8 | 2080 } // namespace v8 |
OLD | NEW |