Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 619e639e1509a2a73e2e0908bd397869838c08f4..7c376944f1ffcd70af42f6746361602ddb98e8a1 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -2939,180 +2939,133 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction( |
return std::make_pair(jsgraph, source_position_table); |
} |
-class WasmCompilationUnit { |
- public: |
- WasmCompilationUnit(wasm::ErrorThrower* thrower, Isolate* isolate, |
- wasm::ModuleEnv* module_env, |
- const wasm::WasmFunction* function, uint32_t index) |
- : thrower_(thrower), |
- isolate_(isolate), |
- module_env_(module_env), |
- function_(function), |
- graph_zone_(new Zone(isolate->allocator())), |
- jsgraph_(new (graph_zone()) JSGraph( |
- isolate, new (graph_zone()) Graph(graph_zone()), |
- new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr, |
- nullptr, |
- new (graph_zone()) MachineOperatorBuilder( |
- graph_zone(), MachineType::PointerRepresentation(), |
- InstructionSelector::SupportedMachineOperatorFlags()))), |
- compilation_zone_(isolate->allocator()), |
- info_(function->name_length != 0 |
- ? module_env->module->GetNameOrNull(function->name_offset, |
- function->name_length) |
- : ArrayVector("wasm"), |
- isolate, &compilation_zone_, |
- Code::ComputeFlags(Code::WASM_FUNCTION)), |
- job_(), |
- index_(index), |
- ok_(true) { |
- // Create and cache this node in the main thread. |
- jsgraph_->CEntryStubConstant(1); |
- } |
- |
- Zone* graph_zone() { return graph_zone_.get(); } |
- |
- void ExecuteCompilation() { |
- // TODO(ahaas): The counters are not thread-safe at the moment. |
- // 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; |
- os << std::endl; |
- } |
- |
- double decode_ms = 0; |
- size_t node_count = 0; |
- |
- base::SmartPointer<Zone> graph_zone(graph_zone_.Detach()); |
- std::pair<JSGraph*, SourcePositionTable*> graph_result = |
- BuildGraphForWasmFunction(jsgraph_, thrower_, isolate_, module_env_, |
- function_, &decode_ms); |
- JSGraph* jsgraph = graph_result.first; |
- SourcePositionTable* source_positions = graph_result.second; |
- |
- if (jsgraph == nullptr) { |
- ok_ = false; |
- return; |
- } |
- |
- base::ElapsedTimer pipeline_timer; |
- if (FLAG_trace_wasm_decode_time) { |
- node_count = jsgraph->graph()->NodeCount(); |
- pipeline_timer.Start(); |
- } |
- |
- // Run the compiler pipeline to generate machine code. |
- CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor( |
- &compilation_zone_, function_->sig); |
- if (jsgraph->machine()->Is32()) { |
- descriptor = |
- module_env_->GetI32WasmCallDescriptor(&compilation_zone_, descriptor); |
- } |
- job_.Reset(Pipeline::NewWasmCompilationJob(&info_, jsgraph->graph(), |
- descriptor, source_positions)); |
- ok_ = job_->OptimizeGraph() == CompilationJob::SUCCEEDED; |
- // TODO(bradnelson): Improve histogram handling of size_t. |
- // TODO(ahaas): The counters are not thread-safe at the moment. |
- // isolate_->counters()->wasm_compile_function_peak_memory_bytes() |
- // ->AddSample( |
- // static_cast<int>(jsgraph->graph()->zone()->allocation_size())); |
- |
- if (FLAG_trace_wasm_decode_time) { |
- double pipeline_ms = pipeline_timer.Elapsed().InMillisecondsF(); |
- PrintF( |
- "wasm-compilation phase 1 ok: %d bytes, %0.3f ms decode, %zu nodes, " |
- "%0.3f ms pipeline\n", |
- static_cast<int>(function_->code_end_offset - |
- function_->code_start_offset), |
- decode_ms, node_count, pipeline_ms); |
- } |
+WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, |
+ Isolate* isolate, |
+ wasm::ModuleEnv* module_env, |
+ const wasm::WasmFunction* function, |
+ uint32_t index) |
+ : thrower_(thrower), |
+ isolate_(isolate), |
+ module_env_(module_env), |
+ function_(function), |
+ graph_zone_(new Zone(isolate->allocator())), |
+ jsgraph_(new (graph_zone()) JSGraph( |
+ isolate, new (graph_zone()) Graph(graph_zone()), |
+ new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr, |
+ nullptr, new (graph_zone()) MachineOperatorBuilder( |
+ graph_zone(), MachineType::PointerRepresentation(), |
+ InstructionSelector::SupportedMachineOperatorFlags()))), |
+ compilation_zone_(isolate->allocator()), |
+ info_(function->name_length != 0 |
+ ? module_env->module->GetNameOrNull(function->name_offset, |
+ function->name_length) |
+ : ArrayVector("wasm"), |
+ isolate, &compilation_zone_, |
+ Code::ComputeFlags(Code::WASM_FUNCTION)), |
+ job_(), |
+ index_(index), |
+ ok_(true) { |
+ // Create and cache this node in the main thread. |
+ jsgraph_->CEntryStubConstant(1); |
+} |
+ |
+void WasmCompilationUnit::ExecuteCompilation() { |
+ // TODO(ahaas): The counters are not thread-safe at the moment. |
+ // 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; |
+ os << std::endl; |
+ } |
+ |
+ double decode_ms = 0; |
+ size_t node_count = 0; |
+ |
+ base::SmartPointer<Zone> graph_zone(graph_zone_.Detach()); |
+ std::pair<JSGraph*, SourcePositionTable*> graph_result = |
+ BuildGraphForWasmFunction(jsgraph_, thrower_, isolate_, module_env_, |
+ function_, &decode_ms); |
+ JSGraph* jsgraph = graph_result.first; |
+ SourcePositionTable* source_positions = graph_result.second; |
+ |
+ if (jsgraph == nullptr) { |
+ ok_ = false; |
+ return; |
} |
- Handle<Code> FinishCompilation() { |
- if (!ok_) { |
- return Handle<Code>::null(); |
- } |
- if (job_->GenerateCode() != CompilationJob::SUCCEEDED) { |
- return Handle<Code>::null(); |
- } |
- base::ElapsedTimer compile_timer; |
- if (FLAG_trace_wasm_decode_time) { |
- compile_timer.Start(); |
- } |
- Handle<Code> code = info_.code(); |
- DCHECK(!code.is_null()); |
- DCHECK(code->deoptimization_data() == nullptr || |
- code->deoptimization_data()->length() == 0); |
- Handle<FixedArray> deopt_data = |
- isolate_->factory()->NewFixedArray(2, TENURED); |
- if (!module_env_->instance->js_object.is_null()) { |
- deopt_data->set(0, *module_env_->instance->js_object); |
- } |
- deopt_data->set(1, Smi::FromInt(function_->func_index)); |
- deopt_data->set_length(2); |
- code->set_deoptimization_data(*deopt_data); |
- |
- 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) { |
- double compile_ms = compile_timer.Elapsed().InMillisecondsF(); |
- PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", |
- static_cast<int>(function_->code_end_offset - |
- function_->code_start_offset), |
- compile_ms); |
- } |
+ base::ElapsedTimer pipeline_timer; |
+ if (FLAG_trace_wasm_decode_time) { |
+ node_count = jsgraph->graph()->NodeCount(); |
+ pipeline_timer.Start(); |
+ } |
+ |
+ // Run the compiler pipeline to generate machine code. |
+ CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor( |
+ &compilation_zone_, function_->sig); |
+ if (jsgraph->machine()->Is32()) { |
+ descriptor = |
+ module_env_->GetI32WasmCallDescriptor(&compilation_zone_, descriptor); |
+ } |
+ job_.Reset(Pipeline::NewWasmCompilationJob(&info_, jsgraph->graph(), |
+ descriptor, source_positions)); |
+ ok_ = job_->OptimizeGraph() == CompilationJob::SUCCEEDED; |
+ // TODO(bradnelson): Improve histogram handling of size_t. |
+ // TODO(ahaas): The counters are not thread-safe at the moment. |
+ // isolate_->counters()->wasm_compile_function_peak_memory_bytes() |
+ // ->AddSample( |
+ // static_cast<int>(jsgraph->graph()->zone()->allocation_size())); |
- return code; |
+ if (FLAG_trace_wasm_decode_time) { |
+ double pipeline_ms = pipeline_timer.Elapsed().InMillisecondsF(); |
+ PrintF( |
+ "wasm-compilation phase 1 ok: %d bytes, %0.3f ms decode, %zu nodes, " |
+ "%0.3f ms pipeline\n", |
+ static_cast<int>(function_->code_end_offset - |
+ function_->code_start_offset), |
+ decode_ms, node_count, pipeline_ms); |
} |
- |
- wasm::ErrorThrower* thrower_; |
- Isolate* isolate_; |
- wasm::ModuleEnv* module_env_; |
- const wasm::WasmFunction* function_; |
- // The graph zone is deallocated at the end of ExecuteCompilation. |
- base::SmartPointer<Zone> graph_zone_; |
- JSGraph* jsgraph_; |
- Zone compilation_zone_; |
- CompilationInfo info_; |
- base::SmartPointer<CompilationJob> job_; |
- uint32_t index_; |
- bool ok_; |
-}; |
- |
-WasmCompilationUnit* CreateWasmCompilationUnit( |
- wasm::ErrorThrower* thrower, Isolate* isolate, wasm::ModuleEnv* module_env, |
- const wasm::WasmFunction* function, uint32_t index) { |
- return new WasmCompilationUnit(thrower, isolate, module_env, function, index); |
-} |
- |
-void ExecuteCompilation(WasmCompilationUnit* unit) { |
- unit->ExecuteCompilation(); |
} |
-uint32_t GetIndexOfWasmCompilationUnit(WasmCompilationUnit* unit) { |
- return unit->index_; |
-} |
+Handle<Code> WasmCompilationUnit::FinishCompilation() { |
+ if (!ok_) { |
+ return Handle<Code>::null(); |
+ } |
+ if (job_->GenerateCode() != CompilationJob::SUCCEEDED) { |
+ return Handle<Code>::null(); |
+ } |
+ base::ElapsedTimer compile_timer; |
+ if (FLAG_trace_wasm_decode_time) { |
+ compile_timer.Start(); |
+ } |
+ Handle<Code> code = info_.code(); |
+ DCHECK(!code.is_null()); |
+ DCHECK(code->deoptimization_data() == nullptr || |
+ code->deoptimization_data()->length() == 0); |
+ Handle<FixedArray> deopt_data = |
+ isolate_->factory()->NewFixedArray(2, TENURED); |
+ if (!module_env_->instance->js_object.is_null()) { |
+ deopt_data->set(0, *module_env_->instance->js_object); |
+ } |
+ deopt_data->set(1, Smi::FromInt(function_->func_index)); |
+ deopt_data->set_length(2); |
+ code->set_deoptimization_data(*deopt_data); |
+ |
+ RecordFunctionCompilation( |
+ Logger::FUNCTION_TAG, &info_, "WASM_function", function_->func_index, |
+ module_env_->module->GetName(function_->name_offset, |
+ function_->name_length)); |
-Handle<Code> FinishCompilation(WasmCompilationUnit* unit) { |
- Handle<Code> result = unit->FinishCompilation(); |
- delete unit; |
- return result; |
-} |
+ if (FLAG_trace_wasm_decode_time) { |
+ double compile_ms = compile_timer.Elapsed().InMillisecondsF(); |
+ PrintF("wasm-code-generation ok: %d bytes, %0.3f ms code generation\n", |
+ static_cast<int>(function_->code_end_offset - |
+ function_->code_start_offset), |
+ compile_ms); |
+ } |
-// Helper function to compile a single function. |
-Handle<Code> CompileWasmFunction(wasm::ErrorThrower* thrower, Isolate* isolate, |
- wasm::ModuleEnv* module_env, |
- const wasm::WasmFunction* function) { |
- WasmCompilationUnit* unit = |
- CreateWasmCompilationUnit(thrower, isolate, module_env, function, 0); |
- ExecuteCompilation(unit); |
- return FinishCompilation(unit); |
+ return code; |
} |
} // namespace compiler |