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 "src/isolate-inl.h" | 7 #include "src/isolate-inl.h" |
8 | 8 |
9 #include "src/base/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 2937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2948 | 2948 |
2949 void WasmGraphBuilder::SetSourcePosition(Node* node, | 2949 void WasmGraphBuilder::SetSourcePosition(Node* node, |
2950 wasm::WasmCodePosition position) { | 2950 wasm::WasmCodePosition position) { |
2951 DCHECK_NE(position, wasm::kNoCodePosition); | 2951 DCHECK_NE(position, wasm::kNoCodePosition); |
2952 compiler::SourcePosition pos(position); | 2952 compiler::SourcePosition pos(position); |
2953 if (source_position_table_) | 2953 if (source_position_table_) |
2954 source_position_table_->SetSourcePosition(node, pos); | 2954 source_position_table_->SetSourcePosition(node, pos); |
2955 } | 2955 } |
2956 | 2956 |
2957 static void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag, | 2957 static void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag, |
2958 Isolate* isolate, Handle<Code> code, | 2958 CompilationInfo* info, |
2959 const char* message, uint32_t index, | 2959 const char* message, uint32_t index, |
2960 const wasm::WasmName& module_name, | 2960 wasm::WasmName func_name) { |
2961 const wasm::WasmName& func_name) { | 2961 Isolate* isolate = info->isolate(); |
2962 DCHECK(isolate->logger()->is_logging_code_events() || | 2962 if (isolate->logger()->is_logging_code_events() || isolate->is_profiling()) { |
2963 isolate->is_profiling()); | 2963 ScopedVector<char> buffer(128); |
2964 | 2964 SNPrintF(buffer, "%s#%d:%.*s", message, index, func_name.length(), |
2965 ScopedVector<char> buffer(128); | 2965 func_name.start()); |
2966 SNPrintF(buffer, "%s#%d:%.*s:%.*s", message, index, module_name.length(), | 2966 Handle<String> name_str = |
2967 module_name.start(), func_name.length(), func_name.start()); | 2967 isolate->factory()->NewStringFromAsciiChecked(buffer.start()); |
2968 Handle<String> name_str = | 2968 Handle<String> script_str = |
2969 isolate->factory()->NewStringFromAsciiChecked(buffer.start()); | 2969 isolate->factory()->NewStringFromAsciiChecked("(WASM)"); |
2970 Handle<String> script_str = | 2970 Handle<Code> code = info->code(); |
2971 isolate->factory()->NewStringFromAsciiChecked("(WASM)"); | 2971 Handle<SharedFunctionInfo> shared = |
2972 Handle<SharedFunctionInfo> shared = | 2972 isolate->factory()->NewSharedFunctionInfo(name_str, code, false); |
2973 isolate->factory()->NewSharedFunctionInfo(name_str, code, false); | 2973 PROFILE(isolate, CodeCreateEvent(tag, AbstractCode::cast(*code), *shared, |
2974 PROFILE(isolate, CodeCreateEvent(tag, AbstractCode::cast(*code), *shared, | 2974 *script_str, 0, 0)); |
2975 *script_str, 0, 0)); | 2975 } |
2976 } | 2976 } |
2977 | 2977 |
2978 Handle<JSFunction> CompileJSToWasmWrapper(Isolate* isolate, | 2978 Handle<JSFunction> CompileJSToWasmWrapper( |
2979 wasm::ModuleEnv* module, | 2979 Isolate* isolate, wasm::ModuleEnv* module, Handle<String> name, |
2980 Handle<String> name, | 2980 Handle<Code> wasm_code, Handle<JSObject> module_object, uint32_t index) { |
2981 Handle<Code> wasm_code, | |
2982 uint32_t index) { | |
2983 const wasm::WasmFunction* func = &module->module->functions[index]; | 2981 const wasm::WasmFunction* func = &module->module->functions[index]; |
2984 | 2982 |
2985 //---------------------------------------------------------------------------- | 2983 //---------------------------------------------------------------------------- |
2986 // Create the JSFunction object. | 2984 // Create the JSFunction object. |
2987 //---------------------------------------------------------------------------- | 2985 //---------------------------------------------------------------------------- |
2988 Handle<SharedFunctionInfo> shared = | 2986 Handle<SharedFunctionInfo> shared = |
2989 isolate->factory()->NewSharedFunctionInfo(name, wasm_code, false); | 2987 isolate->factory()->NewSharedFunctionInfo(name, wasm_code, false); |
2990 int params = static_cast<int>(func->sig->parameter_count()); | 2988 int params = static_cast<int>(func->sig->parameter_count()); |
2991 shared->set_length(params); | 2989 shared->set_length(params); |
2992 shared->set_internal_formal_parameter_count(params); | 2990 shared->set_internal_formal_parameter_count(params); |
2993 Handle<JSFunction> function = isolate->factory()->NewFunction( | 2991 Handle<JSFunction> function = isolate->factory()->NewFunction( |
2994 isolate->wasm_function_map(), name, MaybeHandle<Code>()); | 2992 isolate->wasm_function_map(), name, MaybeHandle<Code>()); |
| 2993 function->SetInternalField(0, *module_object); |
2995 function->set_shared(*shared); | 2994 function->set_shared(*shared); |
2996 | 2995 |
2997 //---------------------------------------------------------------------------- | 2996 //---------------------------------------------------------------------------- |
2998 // Create the Graph | 2997 // Create the Graph |
2999 //---------------------------------------------------------------------------- | 2998 //---------------------------------------------------------------------------- |
3000 Zone zone(isolate->allocator()); | 2999 Zone zone(isolate->allocator()); |
3001 Graph graph(&zone); | 3000 Graph graph(&zone); |
3002 CommonOperatorBuilder common(&zone); | 3001 CommonOperatorBuilder common(&zone); |
3003 MachineOperatorBuilder machine(&zone); | 3002 MachineOperatorBuilder machine(&zone); |
3004 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); | 3003 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3050 #ifdef ENABLE_DISASSEMBLER | 3049 #ifdef ENABLE_DISASSEMBLER |
3051 if (FLAG_print_opt_code && !code.is_null()) { | 3050 if (FLAG_print_opt_code && !code.is_null()) { |
3052 OFStream os(stdout); | 3051 OFStream os(stdout); |
3053 code->Disassemble(buffer.start(), os); | 3052 code->Disassemble(buffer.start(), os); |
3054 } | 3053 } |
3055 #endif | 3054 #endif |
3056 if (debugging) { | 3055 if (debugging) { |
3057 buffer.Dispose(); | 3056 buffer.Dispose(); |
3058 } | 3057 } |
3059 | 3058 |
3060 if (isolate->logger()->is_logging_code_events() || | 3059 RecordFunctionCompilation( |
3061 isolate->is_profiling()) { | 3060 CodeEventListener::FUNCTION_TAG, &info, "js-to-wasm", index, |
3062 RecordFunctionCompilation( | 3061 module->module->GetName(func->name_offset, func->name_length)); |
3063 CodeEventListener::FUNCTION_TAG, isolate, code, "js-to-wasm", index, | |
3064 wasm::WasmName("export"), | |
3065 module->module->GetName(func->name_offset, func->name_length)); | |
3066 } | |
3067 // Set the JSFunction's machine code. | 3062 // Set the JSFunction's machine code. |
3068 function->set_code(*code); | 3063 function->set_code(*code); |
3069 } | 3064 } |
3070 return function; | 3065 return function; |
3071 } | 3066 } |
3072 | 3067 |
3073 Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, | 3068 Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, |
3074 Handle<JSFunction> function, | 3069 Handle<JSFunction> function, |
3075 wasm::FunctionSig* sig, uint32_t index, | 3070 wasm::FunctionSig* sig, |
3076 Handle<String> import_module, | 3071 wasm::WasmName module_name, |
3077 MaybeHandle<String> import_function) { | 3072 wasm::WasmName function_name) { |
3078 //---------------------------------------------------------------------------- | 3073 //---------------------------------------------------------------------------- |
3079 // Create the Graph | 3074 // Create the Graph |
3080 //---------------------------------------------------------------------------- | 3075 //---------------------------------------------------------------------------- |
3081 Zone zone(isolate->allocator()); | 3076 Zone zone(isolate->allocator()); |
3082 Graph graph(&zone); | 3077 Graph graph(&zone); |
3083 CommonOperatorBuilder common(&zone); | 3078 CommonOperatorBuilder common(&zone); |
3084 MachineOperatorBuilder machine(&zone); | 3079 MachineOperatorBuilder machine(&zone); |
3085 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); | 3080 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
3086 | 3081 |
3087 Node* control = nullptr; | 3082 Node* control = nullptr; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3126 code = Pipeline::GenerateCodeForTesting(&info, incoming, &graph, nullptr); | 3121 code = Pipeline::GenerateCodeForTesting(&info, incoming, &graph, nullptr); |
3127 #ifdef ENABLE_DISASSEMBLER | 3122 #ifdef ENABLE_DISASSEMBLER |
3128 if (FLAG_print_opt_code && !code.is_null()) { | 3123 if (FLAG_print_opt_code && !code.is_null()) { |
3129 OFStream os(stdout); | 3124 OFStream os(stdout); |
3130 code->Disassemble(buffer.start(), os); | 3125 code->Disassemble(buffer.start(), os); |
3131 } | 3126 } |
3132 #endif | 3127 #endif |
3133 if (debugging) { | 3128 if (debugging) { |
3134 buffer.Dispose(); | 3129 buffer.Dispose(); |
3135 } | 3130 } |
| 3131 |
| 3132 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, &info, |
| 3133 "wasm-to-js", 0, module_name); |
3136 } | 3134 } |
3137 if (isolate->logger()->is_logging_code_events() || isolate->is_profiling()) { | |
3138 const char* function_name = nullptr; | |
3139 int function_name_size = 0; | |
3140 if (!import_function.is_null()) { | |
3141 Handle<String> handle = import_function.ToHandleChecked(); | |
3142 function_name = handle->ToCString().get(); | |
3143 function_name_size = handle->length(); | |
3144 } | |
3145 RecordFunctionCompilation( | |
3146 CodeEventListener::FUNCTION_TAG, isolate, code, "wasm-to-js", index, | |
3147 {import_module->ToCString().get(), import_module->length()}, | |
3148 {function_name, function_name_size}); | |
3149 } | |
3150 | |
3151 return code; | 3135 return code; |
3152 } | 3136 } |
3153 | 3137 |
3154 SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( | 3138 SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( |
3155 double* decode_ms) { | 3139 double* decode_ms) { |
3156 base::ElapsedTimer decode_timer; | 3140 base::ElapsedTimer decode_timer; |
3157 if (FLAG_trace_wasm_decode_time) { | 3141 if (FLAG_trace_wasm_decode_time) { |
3158 decode_timer.Start(); | 3142 decode_timer.Start(); |
3159 } | 3143 } |
3160 // Create a TF graph during decoding. | 3144 // Create a TF graph during decoding. |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3303 if (job_->GenerateCode() != CompilationJob::SUCCEEDED) { | 3287 if (job_->GenerateCode() != CompilationJob::SUCCEEDED) { |
3304 return Handle<Code>::null(); | 3288 return Handle<Code>::null(); |
3305 } | 3289 } |
3306 base::ElapsedTimer compile_timer; | 3290 base::ElapsedTimer compile_timer; |
3307 if (FLAG_trace_wasm_decode_time) { | 3291 if (FLAG_trace_wasm_decode_time) { |
3308 compile_timer.Start(); | 3292 compile_timer.Start(); |
3309 } | 3293 } |
3310 Handle<Code> code = info_.code(); | 3294 Handle<Code> code = info_.code(); |
3311 DCHECK(!code.is_null()); | 3295 DCHECK(!code.is_null()); |
3312 | 3296 |
3313 if (isolate_->logger()->is_logging_code_events() || | 3297 RecordFunctionCompilation( |
3314 isolate_->is_profiling()) { | 3298 CodeEventListener::FUNCTION_TAG, &info_, "WASM_function", |
3315 RecordFunctionCompilation( | 3299 function_->func_index, |
3316 CodeEventListener::FUNCTION_TAG, isolate_, code, "WASM_function", | 3300 module_env_->module->GetName(function_->name_offset, |
3317 function_->func_index, wasm::WasmName("module"), | 3301 function_->name_length)); |
3318 module_env_->module->GetName(function_->name_offset, | |
3319 function_->name_length)); | |
3320 } | |
3321 | 3302 |
3322 if (FLAG_trace_wasm_decode_time) { | 3303 if (FLAG_trace_wasm_decode_time) { |
3323 double compile_ms = compile_timer.Elapsed().InMillisecondsF(); | 3304 double compile_ms = compile_timer.Elapsed().InMillisecondsF(); |
3324 PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", | 3305 PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", |
3325 static_cast<int>(function_->code_end_offset - | 3306 static_cast<int>(function_->code_end_offset - |
3326 function_->code_start_offset), | 3307 function_->code_start_offset), |
3327 compile_ms); | 3308 compile_ms); |
3328 } | 3309 } |
3329 | 3310 |
3330 return code; | 3311 return code; |
3331 } | 3312 } |
3332 | 3313 |
3333 } // namespace compiler | 3314 } // namespace compiler |
3334 } // namespace internal | 3315 } // namespace internal |
3335 } // namespace v8 | 3316 } // namespace v8 |
OLD | NEW |