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 21 matching lines...) Expand all Loading... |
32 #endif | 32 #endif |
33 | 33 |
34 #define CHECK_PROTOTYPE_OPCODE(flag) \ | 34 #define CHECK_PROTOTYPE_OPCODE(flag) \ |
35 if (module_ != nullptr && module_->origin == kAsmJsOrigin) { \ | 35 if (module_ != nullptr && module_->origin == kAsmJsOrigin) { \ |
36 error("Opcode not supported for asmjs modules"); \ | 36 error("Opcode not supported for asmjs modules"); \ |
37 } \ | 37 } \ |
38 if (!FLAG_##flag) { \ | 38 if (!FLAG_##flag) { \ |
39 error("Invalid opcode (enable with --" #flag ")"); \ | 39 error("Invalid opcode (enable with --" #flag ")"); \ |
40 break; \ | 40 break; \ |
41 } | 41 } |
42 // TODO(titzer): this is only for intermediate migration. | |
43 #define IMPLICIT_FUNCTION_END 1 | |
44 | 42 |
45 // An SsaEnv environment carries the current local variable renaming | 43 // An SsaEnv environment carries the current local variable renaming |
46 // as well as the current effect and control dependency in the TF graph. | 44 // as well as the current effect and control dependency in the TF graph. |
47 // It maintains a control state that tracks whether the environment | 45 // It maintains a control state that tracks whether the environment |
48 // is reachable, has reached a control end, or has been merged. | 46 // is reachable, has reached a control end, or has been merged. |
49 struct SsaEnv { | 47 struct SsaEnv { |
50 enum State { kControlEnd, kUnreachable, kReached, kMerged }; | 48 enum State { kControlEnd, kUnreachable, kReached, kMerged }; |
51 | 49 |
52 State state; | 50 State state; |
53 TFNode* control; | 51 TFNode* control; |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 return false; | 484 return false; |
487 } | 485 } |
488 | 486 |
489 DCHECK_EQ(0, local_types_->size()); | 487 DCHECK_EQ(0, local_types_->size()); |
490 WasmDecoder::DecodeLocals(this, sig_, local_types_); | 488 WasmDecoder::DecodeLocals(this, sig_, local_types_); |
491 InitSsaEnv(); | 489 InitSsaEnv(); |
492 DecodeFunctionBody(); | 490 DecodeFunctionBody(); |
493 | 491 |
494 if (failed()) return TraceFailed(); | 492 if (failed()) return TraceFailed(); |
495 | 493 |
496 #if IMPLICIT_FUNCTION_END | 494 if (!control_.empty()) { |
497 // With implicit end support (old style), the function block | 495 // Generate a better error message whether the unterminated control |
498 // remains on the stack. Other control blocks are an error. | 496 // structure is the function body block or an innner structure. |
499 if (control_.size() > 1) { | 497 if (control_.size() > 1) { |
500 error(pc_, control_.back().pc, "unterminated control structure"); | 498 error(pc_, control_.back().pc, "unterminated control structure"); |
| 499 } else { |
| 500 error("function body must end with \"end\" opcode."); |
| 501 } |
501 return TraceFailed(); | 502 return TraceFailed(); |
502 } | 503 } |
503 | 504 |
504 // Assume an implicit end to the function body block. | |
505 if (control_.size() == 1) { | |
506 Control* c = &control_.back(); | |
507 if (ssa_env_->go()) { | |
508 FallThruTo(c); | |
509 } | |
510 | |
511 if (c->end_env->go()) { | |
512 // Push the end values onto the stack. | |
513 stack_.resize(c->stack_depth); | |
514 if (c->merge.arity == 1) { | |
515 stack_.push_back(c->merge.vals.first); | |
516 } else { | |
517 for (unsigned i = 0; i < c->merge.arity; i++) { | |
518 stack_.push_back(c->merge.vals.array[i]); | |
519 } | |
520 } | |
521 | |
522 TRACE(" @%-8d #xx:%-20s|", startrel(pc_), "ImplicitReturn"); | |
523 SetEnv("function:end", c->end_env); | |
524 DoReturn(); | |
525 TRACE("\n"); | |
526 } | |
527 } | |
528 #else | |
529 if (!control_.empty()) { | |
530 error(pc_, control_.back().pc, "unterminated control structure"); | |
531 return TraceFailed(); | |
532 } | |
533 | |
534 if (!last_end_found_) { | 505 if (!last_end_found_) { |
535 error("function body must end with \"end\" opcode."); | 506 error("function body must end with \"end\" opcode."); |
536 return false; | 507 return false; |
537 } | 508 } |
538 #endif | |
539 | 509 |
540 if (FLAG_trace_wasm_decode_time) { | 510 if (FLAG_trace_wasm_decode_time) { |
541 double ms = decode_timer.Elapsed().InMillisecondsF(); | 511 double ms = decode_timer.Elapsed().InMillisecondsF(); |
542 PrintF("wasm-decode %s (%0.3f ms)\n\n", ok() ? "ok" : "failed", ms); | 512 PrintF("wasm-decode %s (%0.3f ms)\n\n", ok() ? "ok" : "failed", ms); |
543 } else { | 513 } else { |
544 TRACE("wasm-decode %s\n\n", ok() ? "ok" : "failed"); | 514 TRACE("wasm-decode %s\n\n", ok() ? "ok" : "failed"); |
545 } | 515 } |
546 | 516 |
547 return true; | 517 return true; |
548 } | 518 } |
(...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2056 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, | 2026 BitVector* AnalyzeLoopAssignmentForTesting(Zone* zone, size_t num_locals, |
2057 const byte* start, const byte* end) { | 2027 const byte* start, const byte* end) { |
2058 Decoder decoder(start, end); | 2028 Decoder decoder(start, end); |
2059 return WasmDecoder::AnalyzeLoopAssignment(&decoder, start, | 2029 return WasmDecoder::AnalyzeLoopAssignment(&decoder, start, |
2060 static_cast<int>(num_locals), zone); | 2030 static_cast<int>(num_locals), zone); |
2061 } | 2031 } |
2062 | 2032 |
2063 } // namespace wasm | 2033 } // namespace wasm |
2064 } // namespace internal | 2034 } // namespace internal |
2065 } // namespace v8 | 2035 } // namespace v8 |
OLD | NEW |