Chromium Code Reviews| 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/compiler/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 | 10 |
| (...skipping 2789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2800 int pos = 0; | 2800 int pos = 0; |
| 2801 args[pos++] = HeapConstant(wasm_code); | 2801 args[pos++] = HeapConstant(wasm_code); |
| 2802 | 2802 |
| 2803 // Convert JS parameters to WASM numbers. | 2803 // Convert JS parameters to WASM numbers. |
| 2804 for (int i = 0; i < wasm_count; ++i) { | 2804 for (int i = 0; i < wasm_count; ++i) { |
| 2805 Node* param = Param(i + 1); | 2805 Node* param = Param(i + 1); |
| 2806 Node* wasm_param = FromJS(param, context, sig->GetParam(i)); | 2806 Node* wasm_param = FromJS(param, context, sig->GetParam(i)); |
| 2807 args[pos++] = wasm_param; | 2807 args[pos++] = wasm_param; |
| 2808 } | 2808 } |
| 2809 | 2809 |
| 2810 // Set the ThreadInWasm flag before we do the actual call. | |
| 2811 if (trap_handler::ShouldEnableTrapHandler()) { | |
| 2812 BuildCallToRuntime(Runtime::kSetThreadInWasm, jsgraph(), | |
|
ahaas
2017/02/20 09:27:23
I wonder if we could set this flag without a runti
titzer
2017/02/20 09:50:08
+1. I think you can embed a store directly to a lo
Eric Holk
2017/02/23 02:16:55
TODO is added.
| |
| 2813 jsgraph()->isolate()->native_context(), nullptr, 0, | |
| 2814 effect_, *control_); | |
| 2815 } | |
| 2816 | |
| 2810 args[pos++] = *effect_; | 2817 args[pos++] = *effect_; |
| 2811 args[pos++] = *control_; | 2818 args[pos++] = *control_; |
| 2812 | 2819 |
| 2813 // Call the WASM code. | 2820 // Call the WASM code. |
| 2814 CallDescriptor* desc = | 2821 CallDescriptor* desc = |
| 2815 wasm::ModuleEnv::GetWasmCallDescriptor(jsgraph()->zone(), sig); | 2822 wasm::ModuleEnv::GetWasmCallDescriptor(jsgraph()->zone(), sig); |
| 2816 | 2823 |
| 2817 Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), count, args); | 2824 Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), count, args); |
| 2818 *effect_ = call; | 2825 *effect_ = call; |
| 2826 | |
| 2827 // Clear the ThreadInWasmFlag | |
| 2828 if (trap_handler::ShouldEnableTrapHandler()) { | |
| 2829 BuildCallToRuntime(Runtime::kClearThreadInWasm, jsgraph(), | |
|
ahaas
2017/02/20 09:27:24
Is this runtime function called when WebAssembly t
Eric Holk
2017/02/23 02:16:55
The changes in isolate.cc will clear the flag when
| |
| 2830 jsgraph()->isolate()->native_context(), nullptr, 0, | |
| 2831 effect_, *control_); | |
| 2832 } | |
| 2833 | |
| 2819 Node* retval = call; | 2834 Node* retval = call; |
| 2820 Node* jsval = ToJS( | 2835 Node* jsval = ToJS( |
| 2821 retval, sig->return_count() == 0 ? wasm::kWasmStmt : sig->GetReturn()); | 2836 retval, sig->return_count() == 0 ? wasm::kWasmStmt : sig->GetReturn()); |
| 2822 Return(jsval); | 2837 Return(jsval); |
| 2823 } | 2838 } |
| 2824 | 2839 |
| 2825 int WasmGraphBuilder::AddParameterNodes(Node** args, int pos, int param_count, | 2840 int WasmGraphBuilder::AddParameterNodes(Node** args, int pos, int param_count, |
| 2826 wasm::FunctionSig* sig) { | 2841 wasm::FunctionSig* sig) { |
| 2827 // Convert WASM numbers to JS values. | 2842 // Convert WASM numbers to JS values. |
| 2828 int param_index = 0; | 2843 int param_index = 0; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 2853 jsgraph()->isolate()->native_context(), nullptr, | 2868 jsgraph()->isolate()->native_context(), nullptr, |
| 2854 0, effect_, *control_)); | 2869 0, effect_, *control_)); |
| 2855 return; | 2870 return; |
| 2856 } | 2871 } |
| 2857 | 2872 |
| 2858 Node** args = Buffer(wasm_count + 7); | 2873 Node** args = Buffer(wasm_count + 7); |
| 2859 | 2874 |
| 2860 Node* call; | 2875 Node* call; |
| 2861 bool direct_call = false; | 2876 bool direct_call = false; |
| 2862 | 2877 |
| 2878 if (trap_handler::ShouldEnableTrapHandler()) { | |
| 2879 BuildCallToRuntime(Runtime::kClearThreadInWasm, jsgraph(), | |
| 2880 jsgraph()->isolate()->native_context(), nullptr, 0, | |
| 2881 effect_, *control_); | |
| 2882 } | |
| 2883 | |
| 2863 if (target->IsJSFunction()) { | 2884 if (target->IsJSFunction()) { |
| 2864 Handle<JSFunction> function = Handle<JSFunction>::cast(target); | 2885 Handle<JSFunction> function = Handle<JSFunction>::cast(target); |
| 2865 if (function->shared()->internal_formal_parameter_count() == wasm_count) { | 2886 if (function->shared()->internal_formal_parameter_count() == wasm_count) { |
| 2866 direct_call = true; | 2887 direct_call = true; |
| 2867 int pos = 0; | 2888 int pos = 0; |
| 2868 args[pos++] = jsgraph()->Constant(target); // target callable. | 2889 args[pos++] = jsgraph()->Constant(target); // target callable. |
| 2869 // Receiver. | 2890 // Receiver. |
| 2870 if (is_sloppy(function->shared()->language_mode()) && | 2891 if (is_sloppy(function->shared()->language_mode()) && |
| 2871 !function->shared()->native()) { | 2892 !function->shared()->native()) { |
| 2872 args[pos++] = | 2893 args[pos++] = |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2917 args[pos++] = HeapConstant(isolate->native_context()); | 2938 args[pos++] = HeapConstant(isolate->native_context()); |
| 2918 args[pos++] = *effect_; | 2939 args[pos++] = *effect_; |
| 2919 args[pos++] = *control_; | 2940 args[pos++] = *control_; |
| 2920 | 2941 |
| 2921 call = graph()->NewNode(jsgraph()->common()->Call(desc), pos, args); | 2942 call = graph()->NewNode(jsgraph()->common()->Call(desc), pos, args); |
| 2922 } | 2943 } |
| 2923 | 2944 |
| 2924 *effect_ = call; | 2945 *effect_ = call; |
| 2925 SetSourcePosition(call, 0); | 2946 SetSourcePosition(call, 0); |
| 2926 | 2947 |
| 2948 if (trap_handler::ShouldEnableTrapHandler()) { | |
| 2949 BuildCallToRuntime(Runtime::kSetThreadInWasm, jsgraph(), | |
| 2950 jsgraph()->isolate()->native_context(), nullptr, 0, | |
| 2951 effect_, *control_); | |
| 2952 } | |
| 2953 | |
| 2927 // Convert the return value back. | 2954 // Convert the return value back. |
| 2928 Node* i32_zero = jsgraph()->Int32Constant(0); | 2955 Node* i32_zero = jsgraph()->Int32Constant(0); |
| 2929 Node* val = sig->return_count() == 0 | 2956 Node* val = sig->return_count() == 0 |
| 2930 ? i32_zero | 2957 ? i32_zero |
| 2931 : FromJS(call, HeapConstant(isolate->native_context()), | 2958 : FromJS(call, HeapConstant(isolate->native_context()), |
| 2932 sig->GetReturn()); | 2959 sig->GetReturn()); |
| 2933 Return(val); | 2960 Return(val); |
| 2934 } | 2961 } |
| 2935 | 2962 |
| 2936 void WasmGraphBuilder::BuildWasmInterpreterEntry( | 2963 void WasmGraphBuilder::BuildWasmInterpreterEntry( |
| (...skipping 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4134 function_->code_start_offset), | 4161 function_->code_start_offset), |
| 4135 compile_ms); | 4162 compile_ms); |
| 4136 } | 4163 } |
| 4137 | 4164 |
| 4138 return code; | 4165 return code; |
| 4139 } | 4166 } |
| 4140 | 4167 |
| 4141 } // namespace compiler | 4168 } // namespace compiler |
| 4142 } // namespace internal | 4169 } // namespace internal |
| 4143 } // namespace v8 | 4170 } // namespace v8 |
| OLD | NEW |