| Index: src/compiler/wasm-compiler.cc
|
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
|
| index 572a20ab4fc41fd7ee0ff93ee16c90b8d6458c69..8c11d9628bfc5a6aa75b0ae4a2be0df62c823b95 100644
|
| --- a/src/compiler/wasm-compiler.cc
|
| +++ b/src/compiler/wasm-compiler.cc
|
| @@ -2856,8 +2856,8 @@ Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, wasm::ModuleEnv* module,
|
| }
|
|
|
| std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| - Zone* zone, wasm::ErrorThrower& thrower, Isolate* isolate,
|
| - wasm::ModuleEnv*& module_env, const wasm::WasmFunction& function,
|
| + Zone* zone, wasm::ErrorThrower* thrower, Isolate* isolate,
|
| + wasm::ModuleEnv*& module_env, const wasm::WasmFunction* function,
|
| double* decode_ms) {
|
| base::ElapsedTimer decode_timer;
|
| if (FLAG_trace_wasm_decode_time) {
|
| @@ -2873,16 +2873,16 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| new (zone) JSGraph(isolate, graph, common, nullptr, nullptr, machine);
|
| SourcePositionTable* source_position_table =
|
| new (zone) SourcePositionTable(graph);
|
| - WasmGraphBuilder builder(zone, jsgraph, function.sig, source_position_table);
|
| + WasmGraphBuilder builder(zone, jsgraph, function->sig, source_position_table);
|
| wasm::FunctionBody body = {
|
| - module_env, function.sig, module_env->module->module_start,
|
| - module_env->module->module_start + function.code_start_offset,
|
| - module_env->module->module_start + function.code_end_offset};
|
| + module_env, function->sig, module_env->module->module_start,
|
| + module_env->module->module_start + function->code_start_offset,
|
| + module_env->module->module_start + function->code_end_offset};
|
| wasm::TreeResult result =
|
| wasm::BuildTFGraph(isolate->allocator(), &builder, body);
|
|
|
| if (machine->Is32()) {
|
| - Int64Lowering r(graph, machine, common, zone, function.sig);
|
| + Int64Lowering r(graph, machine, common, zone, function->sig);
|
| r.LowerGraph();
|
| }
|
|
|
| @@ -2893,14 +2893,14 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| }
|
| // Add the function as another context for the exception
|
| ScopedVector<char> buffer(128);
|
| - wasm::WasmName name =
|
| - module_env->module->GetName(function.name_offset, function.name_length);
|
| + wasm::WasmName name = module_env->module->GetName(function->name_offset,
|
| + function->name_length);
|
| SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:",
|
| - function.func_index, name.length(), name.start());
|
| - thrower.Failed(buffer.start(), result);
|
| + function->func_index, name.length(), name.start());
|
| + thrower->Failed(buffer.start(), result);
|
| return std::make_pair(nullptr, nullptr);
|
| }
|
| - int index = static_cast<int>(function.func_index);
|
| + int index = static_cast<int>(function->func_index);
|
| if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) {
|
| PrintAst(isolate->allocator(), body);
|
| }
|
| @@ -2911,15 +2911,15 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| }
|
|
|
| // Helper function to compile a single function.
|
| -Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
|
| +Handle<Code> CompileWasmFunction(wasm::ErrorThrower* thrower, Isolate* isolate,
|
| wasm::ModuleEnv* module_env,
|
| - const wasm::WasmFunction& function) {
|
| + const wasm::WasmFunction* function) {
|
| HistogramTimerScope wasm_compile_function_time_scope(
|
| isolate->counters()->wasm_compile_function_time());
|
| if (FLAG_trace_wasm_compiler) {
|
| OFStream os(stdout);
|
| os << "Compiling WASM function "
|
| - << wasm::WasmFunctionName(&function, module_env) << std::endl;
|
| + << wasm::WasmFunctionName(function, module_env) << std::endl;
|
| os << std::endl;
|
| }
|
|
|
| @@ -2942,7 +2942,7 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
|
| }
|
| // Run the compiler pipeline to generate machine code.
|
| CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor(
|
| - jsgraph->graph()->zone(), function.sig);
|
| + jsgraph->graph()->zone(), function->sig);
|
| if (jsgraph->machine()->Is32()) {
|
| descriptor = module_env->GetI32WasmCallDescriptor(jsgraph->graph()->zone(),
|
| descriptor);
|
| @@ -2956,12 +2956,12 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
|
| FLAG_print_opt_code || FLAG_trace_turbo || FLAG_trace_turbo_graph;
|
| #endif
|
| Vector<const char> func_name = module_env->module->GetNameOrNull(
|
| - function.name_offset, function.name_length);
|
| + function->name_offset, function->name_length);
|
| Vector<char> buffer;
|
| if (func_name.is_empty()) {
|
| if (debugging) {
|
| buffer = Vector<char>::New(128);
|
| - int chars = SNPrintF(buffer, "WASM_function_#%d", function.func_index);
|
| + int chars = SNPrintF(buffer, "WASM_function_#%d", function->func_index);
|
| func_name = Vector<const char>::cast(buffer.SubVector(0, chars));
|
| } else {
|
| func_name = ArrayVector("wasm");
|
| @@ -2978,10 +2978,10 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
|
|
|
| buffer.Dispose();
|
| if (!code.is_null()) {
|
| - RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, "WASM_function",
|
| - function.func_index,
|
| - module_env->module->GetName(
|
| - function.name_offset, function.name_length));
|
| + RecordFunctionCompilation(
|
| + Logger::FUNCTION_TAG, &info, "WASM_function", function->func_index,
|
| + module_env->module->GetName(function->name_offset,
|
| + function->name_length));
|
| }
|
|
|
| if (FLAG_trace_wasm_decode_time) {
|
| @@ -2989,7 +2989,8 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
|
| PrintF(
|
| "wasm-compile ok: %d bytes, %0.3f ms decode, %d nodes, %0.3f ms "
|
| "compile\n",
|
| - static_cast<int>(function.code_end_offset - function.code_start_offset),
|
| + static_cast<int>(function->code_end_offset -
|
| + function->code_start_offset),
|
| decode_ms, static_cast<int>(jsgraph->graph()->NodeCount()), compile_ms);
|
| }
|
| // TODO(bradnelson): Improve histogram handling of size_t.
|
| @@ -2999,6 +3000,49 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
|
| return code;
|
| }
|
|
|
| +class WasmCompilationUnit {
|
| + public:
|
| + WasmCompilationUnit(wasm::ErrorThrower* thrower, Isolate* isolate,
|
| + wasm::ModuleEnv* module_env,
|
| + const wasm::WasmFunction* function)
|
| + : thrower_(thrower),
|
| + isolate_(isolate),
|
| + module_env_(module_env),
|
| + function_(function) {}
|
| +
|
| + void ExecuteCompilation() {
|
| + if (function_->external) {
|
| + return;
|
| + }
|
| + // TODO(ahaas): The parallelizable parts of the compilation should move from
|
| + // FinishCompilation to here.
|
| + }
|
| +
|
| + Handle<Code> FinishCompilation() {
|
| + return CompileWasmFunction(thrower_, isolate_, module_env_, function_);
|
| + }
|
| +
|
| + wasm::ErrorThrower* thrower_;
|
| + Isolate* isolate_;
|
| + wasm::ModuleEnv* module_env_;
|
| + const wasm::WasmFunction* function_;
|
| +};
|
| +
|
| +WasmCompilationUnit* CreateWasmCompilationUnit(
|
| + wasm::ErrorThrower* thrower, Isolate* isolate, wasm::ModuleEnv* module_env,
|
| + const wasm::WasmFunction* function) {
|
| + return new WasmCompilationUnit(thrower, isolate, module_env, function);
|
| +}
|
| +
|
| +void ExecuteCompilation(WasmCompilationUnit* unit) {
|
| + unit->ExecuteCompilation();
|
| +}
|
| +
|
| +Handle<Code> FinishCompilation(WasmCompilationUnit* unit) {
|
| + Handle<Code> result = unit->FinishCompilation();
|
| + delete unit;
|
| + return result;
|
| +}
|
|
|
| } // namespace compiler
|
| } // namespace internal
|
|
|