Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(743)

Side by Side Diff: src/compiler/wasm-compiler.cc

Issue 2540133002: [wasm] Remove raw byte pointers from WasmModule (Closed)
Patch Set: Address comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | src/vector.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3134 matching lines...) Expand 10 before | Expand all | Expand 10 after
3145 Handle<String> name_str = 3145 Handle<String> name_str =
3146 isolate->factory()->NewStringFromAsciiChecked(buffer.start()); 3146 isolate->factory()->NewStringFromAsciiChecked(buffer.start());
3147 Handle<String> script_str = 3147 Handle<String> script_str =
3148 isolate->factory()->NewStringFromAsciiChecked("(WASM)"); 3148 isolate->factory()->NewStringFromAsciiChecked("(WASM)");
3149 Handle<SharedFunctionInfo> shared = 3149 Handle<SharedFunctionInfo> shared =
3150 isolate->factory()->NewSharedFunctionInfo(name_str, code, false); 3150 isolate->factory()->NewSharedFunctionInfo(name_str, code, false);
3151 PROFILE(isolate, CodeCreateEvent(tag, AbstractCode::cast(*code), *shared, 3151 PROFILE(isolate, CodeCreateEvent(tag, AbstractCode::cast(*code), *shared,
3152 *script_str, 0, 0)); 3152 *script_str, 0, 0));
3153 } 3153 }
3154 3154
3155 Handle<Code> CompileJSToWasmWrapper(Isolate* isolate, wasm::ModuleEnv* module, 3155 Handle<Code> CompileJSToWasmWrapper(Isolate* isolate,
3156 const wasm::WasmModule* module,
3156 Handle<Code> wasm_code, uint32_t index) { 3157 Handle<Code> wasm_code, uint32_t index) {
3157 const wasm::WasmFunction* func = &module->module->functions[index]; 3158 const wasm::WasmFunction* func = &module->functions[index];
3158 3159
3159 //---------------------------------------------------------------------------- 3160 //----------------------------------------------------------------------------
3160 // Create the Graph 3161 // Create the Graph
3161 //---------------------------------------------------------------------------- 3162 //----------------------------------------------------------------------------
3162 Zone zone(isolate->allocator(), ZONE_NAME); 3163 Zone zone(isolate->allocator(), ZONE_NAME);
3163 Graph graph(&zone); 3164 Graph graph(&zone);
3164 CommonOperatorBuilder common(&zone); 3165 CommonOperatorBuilder common(&zone);
3165 MachineOperatorBuilder machine(&zone); 3166 MachineOperatorBuilder machine(&zone);
3166 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); 3167 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine);
3167 3168
3168 Node* control = nullptr; 3169 Node* control = nullptr;
3169 Node* effect = nullptr; 3170 Node* effect = nullptr;
3170 3171
3172 wasm::ModuleEnv module_env(module, nullptr);
3171 WasmGraphBuilder builder(&zone, &jsgraph, func->sig); 3173 WasmGraphBuilder builder(&zone, &jsgraph, func->sig);
3172 builder.set_control_ptr(&control); 3174 builder.set_control_ptr(&control);
3173 builder.set_effect_ptr(&effect); 3175 builder.set_effect_ptr(&effect);
3174 builder.set_module(module); 3176 builder.set_module(&module_env);
3175 builder.BuildJSToWasmWrapper(wasm_code, func->sig); 3177 builder.BuildJSToWasmWrapper(wasm_code, func->sig);
3176 3178
3177 //---------------------------------------------------------------------------- 3179 //----------------------------------------------------------------------------
3178 // Run the compilation pipeline. 3180 // Run the compilation pipeline.
3179 //---------------------------------------------------------------------------- 3181 //----------------------------------------------------------------------------
3180 if (FLAG_trace_turbo_graph) { // Simple textual RPO. 3182 if (FLAG_trace_turbo_graph) { // Simple textual RPO.
3181 OFStream os(stdout); 3183 OFStream os(stdout);
3182 os << "-- Graph after change lowering -- " << std::endl; 3184 os << "-- Graph after change lowering -- " << std::endl;
3183 os << AsRPO(graph); 3185 os << AsRPO(graph);
3184 } 3186 }
3185 3187
3186 // Schedule and compile to machine code. 3188 // Schedule and compile to machine code.
3187 int params = 3189 int params = static_cast<int>(
3188 static_cast<int>(module->GetFunctionSignature(index)->parameter_count()); 3190 module_env.GetFunctionSignature(index)->parameter_count());
3189 CallDescriptor* incoming = Linkage::GetJSCallDescriptor( 3191 CallDescriptor* incoming = Linkage::GetJSCallDescriptor(
3190 &zone, false, params + 1, CallDescriptor::kNoFlags); 3192 &zone, false, params + 1, CallDescriptor::kNoFlags);
3191 Code::Flags flags = Code::ComputeFlags(Code::JS_TO_WASM_FUNCTION); 3193 Code::Flags flags = Code::ComputeFlags(Code::JS_TO_WASM_FUNCTION);
3192 bool debugging = 3194 bool debugging =
3193 #if DEBUG 3195 #if DEBUG
3194 true; 3196 true;
3195 #else 3197 #else
3196 FLAG_print_opt_code || FLAG_trace_turbo || FLAG_trace_turbo_graph; 3198 FLAG_print_opt_code || FLAG_trace_turbo || FLAG_trace_turbo_graph;
3197 #endif 3199 #endif
3198 Vector<const char> func_name = ArrayVector("js-to-wasm"); 3200 Vector<const char> func_name = ArrayVector("js-to-wasm");
(...skipping 12 matching lines...) Expand all
3211 if (FLAG_print_opt_code && !code.is_null()) { 3213 if (FLAG_print_opt_code && !code.is_null()) {
3212 OFStream os(stdout); 3214 OFStream os(stdout);
3213 code->Disassemble(buffer.start(), os); 3215 code->Disassemble(buffer.start(), os);
3214 } 3216 }
3215 #endif 3217 #endif
3216 if (debugging) { 3218 if (debugging) {
3217 buffer.Dispose(); 3219 buffer.Dispose();
3218 } 3220 }
3219 3221
3220 if (isolate->logger()->is_logging_code_events() || isolate->is_profiling()) { 3222 if (isolate->logger()->is_logging_code_events() || isolate->is_profiling()) {
3221 RecordFunctionCompilation( 3223 char func_name[32];
3222 CodeEventListener::FUNCTION_TAG, isolate, code, "js-to-wasm", index, 3224 SNPrintF(ArrayVector(func_name), "js-to-wasm#%d", func->func_index);
3223 wasm::WasmName("export"), 3225 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate, code,
3224 module->module->GetName(func->name_offset, func->name_length)); 3226 "js-to-wasm", index, wasm::WasmName("export"),
3227 CStrVector(func_name));
3225 } 3228 }
3226 return code; 3229 return code;
3227 } 3230 }
3228 3231
3229 Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, Handle<JSReceiver> target, 3232 Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, Handle<JSReceiver> target,
3230 wasm::FunctionSig* sig, uint32_t index, 3233 wasm::FunctionSig* sig, uint32_t index,
3231 Handle<String> module_name, 3234 Handle<String> module_name,
3232 MaybeHandle<String> import_name) { 3235 MaybeHandle<String> import_name) {
3233 //---------------------------------------------------------------------------- 3236 //----------------------------------------------------------------------------
3234 // Create the Graph 3237 // Create the Graph
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
3314 } 3317 }
3315 // Create a TF graph during decoding. 3318 // Create a TF graph during decoding.
3316 3319
3317 Graph* graph = jsgraph_->graph(); 3320 Graph* graph = jsgraph_->graph();
3318 CommonOperatorBuilder* common = jsgraph_->common(); 3321 CommonOperatorBuilder* common = jsgraph_->common();
3319 MachineOperatorBuilder* machine = jsgraph_->machine(); 3322 MachineOperatorBuilder* machine = jsgraph_->machine();
3320 SourcePositionTable* source_position_table = 3323 SourcePositionTable* source_position_table =
3321 new (jsgraph_->zone()) SourcePositionTable(graph); 3324 new (jsgraph_->zone()) SourcePositionTable(graph);
3322 WasmGraphBuilder builder(jsgraph_->zone(), jsgraph_, function_->sig, 3325 WasmGraphBuilder builder(jsgraph_->zone(), jsgraph_, function_->sig,
3323 source_position_table); 3326 source_position_table);
3324 wasm::FunctionBody body = { 3327 const byte* module_start = module_env_->module_bytes.start();
3325 module_env_, function_->sig, module_env_->module->module_start, 3328 wasm::FunctionBody body = {module_env_, function_->sig, module_start,
3326 module_env_->module->module_start + function_->code_start_offset, 3329 module_start + function_->code_start_offset,
3327 module_env_->module->module_start + function_->code_end_offset}; 3330 module_start + function_->code_end_offset};
3328 graph_construction_result_ = 3331 graph_construction_result_ =
3329 wasm::BuildTFGraph(isolate_->allocator(), &builder, body); 3332 wasm::BuildTFGraph(isolate_->allocator(), &builder, body);
3330 3333
3331 if (graph_construction_result_.failed()) { 3334 if (graph_construction_result_.failed()) {
3332 if (FLAG_trace_wasm_compiler) { 3335 if (FLAG_trace_wasm_compiler) {
3333 OFStream os(stdout); 3336 OFStream os(stdout);
3334 os << "Compilation failed: " << graph_construction_result_ << std::endl; 3337 os << "Compilation failed: " << graph_construction_result_ << std::endl;
3335 } 3338 }
3336 return nullptr; 3339 return nullptr;
3337 } 3340 }
3338 3341
3339 if (machine->Is32()) { 3342 if (machine->Is32()) {
3340 Int64Lowering r(graph, machine, common, jsgraph_->zone(), function_->sig); 3343 Int64Lowering r(graph, machine, common, jsgraph_->zone(), function_->sig);
3341 r.LowerGraph(); 3344 r.LowerGraph();
3342 } 3345 }
3343 3346
3344 if (!CpuFeatures::SupportsSimd128()) { 3347 if (!CpuFeatures::SupportsSimd128()) {
3345 SimdScalarLowering(graph, machine, common, jsgraph_->zone(), function_->sig) 3348 SimdScalarLowering(graph, machine, common, jsgraph_->zone(), function_->sig)
3346 .LowerGraph(); 3349 .LowerGraph();
3347 } 3350 }
3348 3351
3349 int index = static_cast<int>(function_->func_index); 3352 int index = static_cast<int>(function_->func_index);
3350 3353
3351 if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) { 3354 if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) {
3352 OFStream os(stdout); 3355 OFStream os(stdout);
3353 PrintAst(isolate_->allocator(), body, os, nullptr); 3356 PrintAst(isolate_->allocator(), body, os, nullptr);
3354 } 3357 }
3355 if (index >= FLAG_trace_wasm_text_start && index < FLAG_trace_wasm_text_end) { 3358 if (index >= FLAG_trace_wasm_text_start && index < FLAG_trace_wasm_text_end) {
3356 OFStream os(stdout); 3359 OFStream os(stdout);
3357 PrintWasmText(module_env_->module, function_->func_index, os, nullptr); 3360 PrintWasmText(module_env_->module, *module_env_, function_->func_index, os,
3361 nullptr);
3358 } 3362 }
3359 if (FLAG_trace_wasm_decode_time) { 3363 if (FLAG_trace_wasm_decode_time) {
3360 *decode_ms = decode_timer.Elapsed().InMillisecondsF(); 3364 *decode_ms = decode_timer.Elapsed().InMillisecondsF();
3361 } 3365 }
3362 return source_position_table; 3366 return source_position_table;
3363 } 3367 }
3364 3368
3365 WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, 3369 WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower,
3366 Isolate* isolate, 3370 Isolate* isolate,
3367 wasm::ModuleEnv* module_env, 3371 wasm::ModuleBytesEnv* module_env,
3368 const wasm::WasmFunction* function, 3372 const wasm::WasmFunction* function,
3369 uint32_t index) 3373 uint32_t index)
3370 : thrower_(thrower), 3374 : thrower_(thrower),
3371 isolate_(isolate), 3375 isolate_(isolate),
3372 module_env_(module_env), 3376 module_env_(module_env),
3373 function_(function), 3377 function_(&module_env->module->functions[index]),
3374 graph_zone_(new Zone(isolate->allocator(), ZONE_NAME)), 3378 graph_zone_(new Zone(isolate->allocator(), ZONE_NAME)),
3375 jsgraph_(new (graph_zone()) JSGraph( 3379 jsgraph_(new (graph_zone()) JSGraph(
3376 isolate, new (graph_zone()) Graph(graph_zone()), 3380 isolate, new (graph_zone()) Graph(graph_zone()),
3377 new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr, 3381 new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr,
3378 nullptr, new (graph_zone()) MachineOperatorBuilder( 3382 nullptr, new (graph_zone()) MachineOperatorBuilder(
3379 graph_zone(), MachineType::PointerRepresentation(), 3383 graph_zone(), MachineType::PointerRepresentation(),
3380 InstructionSelector::SupportedMachineOperatorFlags(), 3384 InstructionSelector::SupportedMachineOperatorFlags(),
3381 InstructionSelector::AlignmentRequirements()))), 3385 InstructionSelector::AlignmentRequirements()))),
3382 compilation_zone_(isolate->allocator(), ZONE_NAME), 3386 compilation_zone_(isolate->allocator(), ZONE_NAME),
3383 info_(function->name_length != 0 3387 info_(function->name_length != 0 ? module_env->GetNameOrNull(function)
3384 ? module_env->module->GetNameOrNull(function->name_offset, 3388 : ArrayVector("wasm"),
3385 function->name_length)
3386 : ArrayVector("wasm"),
3387 isolate, &compilation_zone_, 3389 isolate, &compilation_zone_,
3388 Code::ComputeFlags(Code::WASM_FUNCTION)), 3390 Code::ComputeFlags(Code::WASM_FUNCTION)),
3389 job_(), 3391 job_(),
3390 index_(index), 3392 index_(index),
3391 ok_(true) { 3393 ok_(true) {
3392 // Create and cache this node in the main thread. 3394 // Create and cache this node in the main thread.
3393 jsgraph_->CEntryStubConstant(1); 3395 jsgraph_->CEntryStubConstant(1);
3394 } 3396 }
3395 3397
3396 void WasmCompilationUnit::ExecuteCompilation() { 3398 void WasmCompilationUnit::ExecuteCompilation() {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3446 function_->code_start_offset), 3448 function_->code_start_offset),
3447 decode_ms, node_count, pipeline_ms); 3449 decode_ms, node_count, pipeline_ms);
3448 } 3450 }
3449 } 3451 }
3450 3452
3451 Handle<Code> WasmCompilationUnit::FinishCompilation() { 3453 Handle<Code> WasmCompilationUnit::FinishCompilation() {
3452 if (!ok_) { 3454 if (!ok_) {
3453 if (graph_construction_result_.failed()) { 3455 if (graph_construction_result_.failed()) {
3454 // Add the function as another context for the exception 3456 // Add the function as another context for the exception
3455 ScopedVector<char> buffer(128); 3457 ScopedVector<char> buffer(128);
3456 wasm::WasmName name = module_env_->module->GetName( 3458 wasm::WasmName name = module_env_->GetName(function_);
3457 function_->name_offset, function_->name_length);
3458 SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:", 3459 SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:",
3459 function_->func_index, name.length(), name.start()); 3460 function_->func_index, name.length(), name.start());
3460 thrower_->CompileFailed(buffer.start(), graph_construction_result_); 3461 thrower_->CompileFailed(buffer.start(), graph_construction_result_);
3461 } 3462 }
3462 3463
3463 return Handle<Code>::null(); 3464 return Handle<Code>::null();
3464 } 3465 }
3465 if (job_->FinalizeJob() != CompilationJob::SUCCEEDED) { 3466 if (job_->FinalizeJob() != CompilationJob::SUCCEEDED) {
3466 return Handle<Code>::null(); 3467 return Handle<Code>::null();
3467 } 3468 }
3468 base::ElapsedTimer compile_timer; 3469 base::ElapsedTimer compile_timer;
3469 if (FLAG_trace_wasm_decode_time) { 3470 if (FLAG_trace_wasm_decode_time) {
3470 compile_timer.Start(); 3471 compile_timer.Start();
3471 } 3472 }
3472 Handle<Code> code = info_.code(); 3473 Handle<Code> code = info_.code();
3473 DCHECK(!code.is_null()); 3474 DCHECK(!code.is_null());
3474 3475
3475 if (isolate_->logger()->is_logging_code_events() || 3476 if (isolate_->logger()->is_logging_code_events() ||
3476 isolate_->is_profiling()) { 3477 isolate_->is_profiling()) {
3477 RecordFunctionCompilation( 3478 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate_, code,
3478 CodeEventListener::FUNCTION_TAG, isolate_, code, "WASM_function", 3479 "WASM_function", function_->func_index,
3479 function_->func_index, wasm::WasmName("module"), 3480 wasm::WasmName("module"),
3480 module_env_->module->GetName(function_->name_offset, 3481 module_env_->GetName(function_));
3481 function_->name_length));
3482 } 3482 }
3483 3483
3484 if (FLAG_trace_wasm_decode_time) { 3484 if (FLAG_trace_wasm_decode_time) {
3485 double compile_ms = compile_timer.Elapsed().InMillisecondsF(); 3485 double compile_ms = compile_timer.Elapsed().InMillisecondsF();
3486 PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", 3486 PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n",
3487 static_cast<int>(function_->code_end_offset - 3487 static_cast<int>(function_->code_end_offset -
3488 function_->code_start_offset), 3488 function_->code_start_offset),
3489 compile_ms); 3489 compile_ms);
3490 } 3490 }
3491 3491
3492 return code; 3492 return code;
3493 } 3493 }
3494 3494
3495 } // namespace compiler 3495 } // namespace compiler
3496 } // namespace internal 3496 } // namespace internal
3497 } // namespace v8 3497 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | src/vector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698