| Index: src/compiler/wasm-compiler.cc
|
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
|
| index 5cc9202fa673ebb2555d644c3c24d513f79e99ab..3e4a2a77864e7e8431159a3ea53067b1e8249689 100644
|
| --- a/src/compiler/wasm-compiler.cc
|
| +++ b/src/compiler/wasm-compiler.cc
|
| @@ -2956,85 +2956,105 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction(
|
| return std::make_pair(jsgraph, source_position_table);
|
| }
|
|
|
| -// Helper function to compile a single function.
|
| -Handle<Code> CompileWasmFunction(wasm::ErrorThrower* thrower, Isolate* isolate,
|
| - wasm::ModuleEnv* module_env,
|
| - 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;
|
| - os << std::endl;
|
| - }
|
| +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),
|
| + 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) {}
|
|
|
| - compiler::ZonePool zone_pool(isolate->allocator());
|
| - compiler::ZonePool::Scope graph_zone_scope(&zone_pool);
|
| - double decode_ms = 0;
|
| - std::pair<JSGraph*, SourcePositionTable*> graph_result =
|
| - BuildGraphForWasmFunction(graph_zone_scope.zone(), thrower, isolate,
|
| - module_env, function, &decode_ms);
|
| - JSGraph* jsgraph = graph_result.first;
|
| - SourcePositionTable* source_positions = graph_result.second;
|
| + void ExecuteCompilation() {
|
| + 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;
|
| + }
|
|
|
| - if (jsgraph == nullptr) {
|
| - return Handle<Code>::null();
|
| - }
|
| + double decode_ms = 0;
|
| + size_t node_count = 0;
|
|
|
| - base::ElapsedTimer compile_timer;
|
| - if (FLAG_trace_wasm_decode_time) {
|
| - compile_timer.Start();
|
| - }
|
| - // Run the compiler pipeline to generate machine code.
|
| - CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor(
|
| - jsgraph->graph()->zone(), function->sig);
|
| - if (jsgraph->machine()->Is32()) {
|
| - descriptor = module_env->GetI32WasmCallDescriptor(jsgraph->graph()->zone(),
|
| - descriptor);
|
| - }
|
| - Code::Flags flags = Code::ComputeFlags(Code::WASM_FUNCTION);
|
| - // add flags here if a meaningful name is helpful for debugging.
|
| - bool debugging =
|
| -#if DEBUG
|
| - true;
|
| -#else
|
| - 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);
|
| - 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);
|
| - func_name = Vector<const char>::cast(buffer.SubVector(0, chars));
|
| - } else {
|
| - func_name = ArrayVector("wasm");
|
| + Zone zone(isolate_->allocator());
|
| + std::pair<JSGraph*, SourcePositionTable*> graph_result =
|
| + BuildGraphForWasmFunction(&zone, thrower_, isolate_, module_env_,
|
| + function_, &decode_ms);
|
| + JSGraph* jsgraph = graph_result.first;
|
| + SourcePositionTable* source_positions = graph_result.second;
|
| +
|
| + if (jsgraph == nullptr) {
|
| + ok_ = false;
|
| + return;
|
| }
|
| - }
|
| - CompilationInfo info(func_name, isolate, jsgraph->graph()->zone(), flags);
|
| - base::SmartPointer<CompilationJob> job(Pipeline::NewWasmCompilationJob(
|
| - &info, jsgraph->graph(), descriptor, source_positions));
|
| - Handle<Code> code = Handle<Code>::null();
|
| - if (job->OptimizeGraph() == CompilationJob::SUCCEEDED &&
|
| - job->GenerateCode() == CompilationJob::SUCCEEDED) {
|
| - code = info.code();
|
| - }
|
|
|
| - buffer.Dispose();
|
| + base::ElapsedTimer pipeline_timer;
|
| + if (FLAG_trace_wasm_decode_time) {
|
| + node_count = jsgraph->graph()->NodeCount();
|
| + pipeline_timer.Start();
|
| + }
|
|
|
| - if (!code.is_null()) {
|
| + // 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.
|
| + 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);
|
| + }
|
| + }
|
| +
|
| + 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));
|
| - } else if (func_name.start() != nullptr) {
|
| - MaybeHandle<String> maybe_name =
|
| - isolate->factory()->NewStringFromUtf8(func_name);
|
| + 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));
|
| + } else if (info_.GetDebugName().get() != nullptr) {
|
| + MaybeHandle<String> maybe_name = isolate_->factory()->NewStringFromUtf8(
|
| + CStrVector(info_.GetDebugName().get()));
|
| if (!maybe_name.is_null())
|
| deopt_data->set(0, *maybe_name.ToHandleChecked());
|
| }
|
| @@ -3042,71 +3062,62 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower* thrower, Isolate* isolate,
|
| 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-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),
|
| - decode_ms, static_cast<int>(jsgraph->graph()->NodeCount()), compile_ms);
|
| - }
|
| - // TODO(bradnelson): Improve histogram handling of size_t.
|
| - isolate->counters()->wasm_compile_function_peak_memory_bytes()->AddSample(
|
| - static_cast<int>(jsgraph->graph()->zone()->allocation_size()));
|
| - graph_zone_scope.Destroy();
|
| - 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;
|
| + 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);
|
| }
|
| - // TODO(ahaas): The parallelizable parts of the compilation should move from
|
| - // FinishCompilation to here.
|
| - }
|
|
|
| - Handle<Code> FinishCompilation() {
|
| - return CompileWasmFunction(thrower_, isolate_, module_env_, function_);
|
| + return code;
|
| }
|
|
|
| wasm::ErrorThrower* thrower_;
|
| Isolate* isolate_;
|
| wasm::ModuleEnv* module_env_;
|
| const wasm::WasmFunction* function_;
|
| + 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) {
|
| - return new WasmCompilationUnit(thrower, isolate, module_env, function);
|
| + 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> FinishCompilation(WasmCompilationUnit* unit) {
|
| Handle<Code> result = unit->FinishCompilation();
|
| delete unit;
|
| return result;
|
| }
|
|
|
| +// 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);
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|