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 #ifndef WASM_RUN_UTILS_H | 5 #ifndef WASM_RUN_UTILS_H |
6 #define WASM_RUN_UTILS_H | 6 #define WASM_RUN_UTILS_H |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 } | 619 } |
620 | 620 |
621 WasmRunner(TestingModule* module, MachineType p0 = MachineType::None(), | 621 WasmRunner(TestingModule* module, MachineType p0 = MachineType::None(), |
622 MachineType p1 = MachineType::None(), | 622 MachineType p1 = MachineType::None(), |
623 MachineType p2 = MachineType::None(), | 623 MachineType p2 = MachineType::None(), |
624 MachineType p3 = MachineType::None()) | 624 MachineType p3 = MachineType::None()) |
625 : zone(&allocator_, ZONE_NAME), | 625 : zone(&allocator_, ZONE_NAME), |
626 compiled_(false), | 626 compiled_(false), |
627 signature_(MachineTypeForC<ReturnType>() == MachineType::None() ? 0 : 1, | 627 signature_(MachineTypeForC<ReturnType>() == MachineType::None() ? 0 : 1, |
628 GetParameterCount(p0, p1, p2, p3), storage_), | 628 GetParameterCount(p0, p1, p2, p3), storage_), |
629 compiler_(&signature_, module) { | 629 compiler_(&signature_, module), |
| 630 possible_nondeterminism_(false) { |
630 DCHECK(module); | 631 DCHECK(module); |
631 InitSigStorage(p0, p1, p2, p3); | 632 InitSigStorage(p0, p1, p2, p3); |
632 } | 633 } |
633 | 634 |
634 void InitSigStorage(MachineType p0, MachineType p1, MachineType p2, | 635 void InitSigStorage(MachineType p0, MachineType p1, MachineType p2, |
635 MachineType p3) { | 636 MachineType p3) { |
636 int index = 0; | 637 int index = 0; |
637 MachineType ret = MachineTypeForC<ReturnType>(); | 638 MachineType ret = MachineTypeForC<ReturnType>(); |
638 if (ret != MachineType::None()) { | 639 if (ret != MachineType::None()) { |
639 storage_[index++] = WasmOpcodes::LocalTypeFor(ret); | 640 storage_[index++] = WasmOpcodes::LocalTypeFor(ret); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 } | 730 } |
730 | 731 |
731 ReturnType CallInterpreter(Vector<WasmVal> args) { | 732 ReturnType CallInterpreter(Vector<WasmVal> args) { |
732 CHECK_EQ(args.length(), | 733 CHECK_EQ(args.length(), |
733 static_cast<int>(compiler_.function_->sig->parameter_count())); | 734 static_cast<int>(compiler_.function_->sig->parameter_count())); |
734 WasmInterpreter::Thread* thread = interpreter()->GetThread(0); | 735 WasmInterpreter::Thread* thread = interpreter()->GetThread(0); |
735 thread->Reset(); | 736 thread->Reset(); |
736 thread->PushFrame(compiler_.function_, args.start()); | 737 thread->PushFrame(compiler_.function_, args.start()); |
737 if (thread->Run() == WasmInterpreter::FINISHED) { | 738 if (thread->Run() == WasmInterpreter::FINISHED) { |
738 WasmVal val = thread->GetReturnValue(); | 739 WasmVal val = thread->GetReturnValue(); |
| 740 possible_nondeterminism_ |= thread->PossibleNondeterminism(); |
739 return val.to<ReturnType>(); | 741 return val.to<ReturnType>(); |
740 } else if (thread->state() == WasmInterpreter::TRAPPED) { | 742 } else if (thread->state() == WasmInterpreter::TRAPPED) { |
741 // TODO(titzer): return the correct trap code | 743 // TODO(titzer): return the correct trap code |
742 int64_t result = 0xdeadbeefdeadbeef; | 744 int64_t result = 0xdeadbeefdeadbeef; |
743 return static_cast<ReturnType>(result); | 745 return static_cast<ReturnType>(result); |
744 } else { | 746 } else { |
745 // TODO(titzer): falling off end | 747 // TODO(titzer): falling off end |
746 ReturnType val = 0; | 748 ReturnType val = 0; |
747 return val; | 749 return val; |
748 } | 750 } |
749 } | 751 } |
750 | 752 |
751 byte AllocateLocal(LocalType type) { return compiler_.AllocateLocal(type); } | 753 byte AllocateLocal(LocalType type) { return compiler_.AllocateLocal(type); } |
752 | 754 |
753 WasmFunction* function() { return compiler_.function_; } | 755 WasmFunction* function() { return compiler_.function_; } |
754 WasmInterpreter* interpreter() { return compiler_.interpreter_; } | 756 WasmInterpreter* interpreter() { return compiler_.interpreter_; } |
| 757 bool possible_nondeterminism() { return possible_nondeterminism_; } |
755 | 758 |
756 protected: | 759 protected: |
757 v8::internal::AccountingAllocator allocator_; | 760 v8::internal::AccountingAllocator allocator_; |
758 Zone zone; | 761 Zone zone; |
759 bool compiled_; | 762 bool compiled_; |
760 LocalType storage_[WASM_RUNNER_MAX_NUM_PARAMETERS]; | 763 LocalType storage_[WASM_RUNNER_MAX_NUM_PARAMETERS]; |
761 FunctionSig signature_; | 764 FunctionSig signature_; |
762 WasmFunctionCompiler compiler_; | 765 WasmFunctionCompiler compiler_; |
763 WasmFunctionWrapper<ReturnType> wrapper_; | 766 WasmFunctionWrapper<ReturnType> wrapper_; |
| 767 bool possible_nondeterminism_; |
764 | 768 |
765 bool interpret() { return compiler_.execution_mode_ == kExecuteInterpreted; } | 769 bool interpret() { return compiler_.execution_mode_ == kExecuteInterpreted; } |
766 | 770 |
767 static size_t GetParameterCount(MachineType p0, MachineType p1, | 771 static size_t GetParameterCount(MachineType p0, MachineType p1, |
768 MachineType p2, MachineType p3) { | 772 MachineType p2, MachineType p3) { |
769 if (p0 == MachineType::None()) return 0; | 773 if (p0 == MachineType::None()) return 0; |
770 if (p1 == MachineType::None()) return 1; | 774 if (p1 == MachineType::None()) return 1; |
771 if (p2 == MachineType::None()) return 2; | 775 if (p2 == MachineType::None()) return 2; |
772 if (p3 == MachineType::None()) return 3; | 776 if (p3 == MachineType::None()) return 3; |
773 return 4; | 777 return 4; |
774 } | 778 } |
775 }; | 779 }; |
776 | 780 |
777 // A macro to define tests that run in different engine configurations. | 781 // A macro to define tests that run in different engine configurations. |
778 // Currently only supports compiled tests, but a future | 782 // Currently only supports compiled tests, but a future |
779 // RunWasmInterpreted_##name version will allow each test to also run in the | 783 // RunWasmInterpreted_##name version will allow each test to also run in the |
780 // interpreter. | 784 // interpreter. |
781 #define WASM_EXEC_TEST(name) \ | 785 #define WASM_EXEC_TEST(name) \ |
782 void RunWasm_##name(WasmExecutionMode execution_mode); \ | 786 void RunWasm_##name(WasmExecutionMode execution_mode); \ |
783 TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \ | 787 TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \ |
784 TEST(RunWasmInterpreted_##name) { RunWasm_##name(kExecuteInterpreted); } \ | 788 TEST(RunWasmInterpreted_##name) { RunWasm_##name(kExecuteInterpreted); } \ |
785 void RunWasm_##name(WasmExecutionMode execution_mode) | 789 void RunWasm_##name(WasmExecutionMode execution_mode) |
786 | 790 |
787 } // namespace | 791 } // namespace |
788 | 792 |
789 #endif | 793 #endif |
OLD | NEW |