Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 85b3d09d7d275d04f10c921eccbadb1543f0135b..92f389261bdd822118fd1df271a2932dd1011ab7 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -4053,14 +4053,10 @@ SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( |
MachineOperatorBuilder* machine = jsgraph_->machine(); |
SourcePositionTable* source_position_table = |
new (jsgraph_->zone()) SourcePositionTable(graph); |
- WasmGraphBuilder builder(&module_env_->module_env, jsgraph_->zone(), jsgraph_, |
- function_->sig, source_position_table); |
- const byte* module_start = module_env_->wire_bytes.start(); |
- wasm::FunctionBody body = {function_->sig, module_start, |
- module_start + function_->code_start_offset, |
- module_start + function_->code_end_offset}; |
+ WasmGraphBuilder builder(module_env_, jsgraph_->zone(), jsgraph_, |
+ func_body_.sig, source_position_table); |
graph_construction_result_ = |
- wasm::BuildTFGraph(isolate_->allocator(), &builder, body); |
+ wasm::BuildTFGraph(isolate_->allocator(), &builder, func_body_); |
if (graph_construction_result_.failed()) { |
if (FLAG_trace_wasm_compiler) { |
@@ -4071,65 +4067,64 @@ SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( |
} |
if (machine->Is32()) { |
- Int64Lowering(graph, machine, common, jsgraph_->zone(), function_->sig) |
+ Int64Lowering(graph, machine, common, jsgraph_->zone(), func_body_.sig) |
.LowerGraph(); |
} |
if (builder.has_simd() && !CpuFeatures::SupportsSimd128()) { |
- SimdScalarLowering(jsgraph_, function_->sig).LowerGraph(); |
+ SimdScalarLowering(jsgraph_, func_body_.sig).LowerGraph(); |
} |
- int index = static_cast<int>(function_->func_index); |
- |
- if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) { |
- OFStream os(stdout); |
- PrintRawWasmCode(isolate_->allocator(), body, |
- module_env_->module_env.module); |
- } |
- if (index >= FLAG_trace_wasm_text_start && index < FLAG_trace_wasm_text_end) { |
- OFStream os(stdout); |
- PrintWasmText(module_env_->module_env.module, module_env_->wire_bytes, |
- function_->func_index, os, nullptr); |
+ if (func_index_ >= FLAG_trace_wasm_ast_start && |
+ func_index_ < FLAG_trace_wasm_ast_end) { |
+ PrintRawWasmCode(isolate_->allocator(), func_body_, module_env_->module); |
} |
+ // TODO(clemens): Remove the trace_wasm_text_start flag. |
+ // if (func_index_ >= FLAG_trace_wasm_text_start && func_index_ < |
+ // FLAG_trace_wasm_text_end) { |
+ // OFStream os(stdout); |
+ // PrintWasmText(module_env_.module, module_env_->wire_bytes, |
+ // function_->func_index, os, nullptr); |
+ //} |
if (FLAG_trace_wasm_decode_time) { |
*decode_ms = decode_timer.Elapsed().InMillisecondsF(); |
} |
return source_position_table; |
} |
-char* WasmCompilationUnit::GetTaggedFunctionName( |
- const wasm::WasmFunction* function) { |
- snprintf(function_name_, sizeof(function_name_), "wasm#%d", |
- function->func_index); |
- return function_name_; |
-} |
- |
-WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, |
- Isolate* isolate, |
+WasmCompilationUnit::WasmCompilationUnit(Isolate* isolate, |
wasm::ModuleBytesEnv* module_env, |
- const wasm::WasmFunction* function, |
- uint32_t index) |
- : thrower_(thrower), |
- isolate_(isolate), |
+ const wasm::WasmFunction* function) |
+ : WasmCompilationUnit( |
+ isolate, &module_env->module_env, |
+ wasm::FunctionBody{ |
+ function->sig, module_env->wire_bytes.start(), |
+ module_env->wire_bytes.start() + function->code_start_offset, |
+ module_env->wire_bytes.start() + function->code_end_offset}, |
+ module_env->wire_bytes.GetNameOrNull(function), |
+ function->func_index) {} |
+ |
+WasmCompilationUnit::WasmCompilationUnit(Isolate* isolate, |
+ wasm::ModuleEnv* module_env, |
+ wasm::FunctionBody body, |
+ wasm::WasmName name, int index) |
+ : isolate_(isolate), |
module_env_(module_env), |
- function_(&module_env->module_env.module->functions[index]), |
+ func_body_(body), |
+ func_name_(name), |
graph_zone_(new Zone(isolate->allocator(), ZONE_NAME)), |
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(), |
- InstructionSelector::AlignmentRequirements()))), |
+ nullptr, |
+ new (graph_zone()) MachineOperatorBuilder( |
+ graph_zone(), MachineType::PointerRepresentation(), |
+ InstructionSelector::SupportedMachineOperatorFlags(), |
+ InstructionSelector::AlignmentRequirements()))), |
compilation_zone_(isolate->allocator(), ZONE_NAME), |
- info_(function->name_length != 0 |
- ? module_env->wire_bytes.GetNameOrNull(function) |
- : CStrVector(GetTaggedFunctionName(function)), |
- isolate, &compilation_zone_, |
+ info_(name, isolate, &compilation_zone_, |
Code::ComputeFlags(Code::WASM_FUNCTION)), |
- job_(), |
- index_(index), |
- ok_(true), |
+ func_index_(index), |
protected_instructions_(&compilation_zone_) { |
// Create and cache this node in the main thread. |
jsgraph_->CEntryStubConstant(1); |
@@ -4140,12 +4135,12 @@ void WasmCompilationUnit::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_->wire_bytes.GetNameOrNull(function_)) |
- << std::endl; |
- os << std::endl; |
+ if (func_name_.start() != nullptr) { |
+ PrintF("Compiling WASM function %d:'%.*s'\n\n", func_index(), |
+ func_name_.length(), func_name_.start()); |
+ } else { |
+ PrintF("Compiling WASM function %d:<unnamed>\n\n", func_index()); |
+ } |
} |
double decode_ms = 0; |
@@ -4167,14 +4162,14 @@ void WasmCompilationUnit::ExecuteCompilation() { |
// Run the compiler pipeline to generate machine code. |
CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor( |
- &compilation_zone_, function_->sig); |
+ &compilation_zone_, func_body_.sig); |
if (jsgraph_->machine()->Is32()) { |
- descriptor = module_env_->module_env.GetI32WasmCallDescriptor( |
- &compilation_zone_, descriptor); |
+ descriptor = |
+ module_env_->GetI32WasmCallDescriptor(&compilation_zone_, descriptor); |
} |
job_.reset(Pipeline::NewWasmCompilationJob( |
&info_, jsgraph_, descriptor, source_positions, &protected_instructions_, |
- module_env_->module_env.module->origin != wasm::kWasmOrigin)); |
+ module_env_->module->origin != wasm::kWasmOrigin)); |
ok_ = job_->ExecuteJob() == CompilationJob::SUCCEEDED; |
// TODO(bradnelson): Improve histogram handling of size_t. |
// TODO(ahaas): The counters are not thread-safe at the moment. |
@@ -4187,20 +4182,25 @@ void WasmCompilationUnit::ExecuteCompilation() { |
PrintF( |
"wasm-compilation phase 1 ok: %u bytes, %0.3f ms decode, %zu nodes, " |
"%0.3f ms pipeline\n", |
- function_->code_end_offset - function_->code_start_offset, decode_ms, |
+ static_cast<unsigned>(func_body_.end - func_body_.start), decode_ms, |
node_count, pipeline_ms); |
} |
} |
-Handle<Code> WasmCompilationUnit::FinishCompilation() { |
+Handle<Code> WasmCompilationUnit::FinishCompilation( |
+ wasm::ErrorThrower* thrower) { |
if (!ok_) { |
if (graph_construction_result_.failed()) { |
// Add the function as another context for the exception |
ScopedVector<char> buffer(128); |
- wasm::WasmName name = module_env_->wire_bytes.GetName(function_); |
- SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:", |
- function_->func_index, name.length(), name.start()); |
- thrower_->CompileFailed(buffer.start(), graph_construction_result_); |
+ if (func_name_.start() == nullptr) { |
+ SNPrintF(buffer, |
+ "Compiling WASM function #%d:%.*s failed:", func_index_, |
+ func_name_.length(), func_name_.start()); |
+ } else { |
+ SNPrintF(buffer, "Compiling WASM function #%d failed:", func_index_); |
+ } |
+ thrower->CompileFailed(buffer.start(), graph_construction_result_); |
} |
return Handle<Code>::null(); |
@@ -4218,21 +4218,29 @@ Handle<Code> WasmCompilationUnit::FinishCompilation() { |
if (isolate_->logger()->is_logging_code_events() || |
isolate_->is_profiling()) { |
RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate_, code, |
- "WASM_function", function_->func_index, |
- wasm::WasmName("module"), |
- module_env_->wire_bytes.GetName(function_)); |
+ "WASM_function", func_index_, |
+ wasm::WasmName("module"), func_name_); |
} |
if (FLAG_trace_wasm_decode_time) { |
double codegen_ms = codegen_timer.Elapsed().InMillisecondsF(); |
PrintF("wasm-code-generation ok: %u bytes, %0.3f ms code generation\n", |
- function_->code_end_offset - function_->code_start_offset, |
+ static_cast<unsigned>(func_body_.end - func_body_.start), |
codegen_ms); |
} |
return code; |
} |
+// static |
+Handle<Code> WasmCompilationUnit::CompileWasmFunction( |
+ wasm::ErrorThrower* thrower, Isolate* isolate, |
+ wasm::ModuleBytesEnv* module_env, const wasm::WasmFunction* function) { |
+ WasmCompilationUnit unit(isolate, module_env, function); |
+ unit.ExecuteCompilation(); |
+ return unit.FinishCompilation(thrower); |
+} |
+ |
} // namespace compiler |
} // namespace internal |
} // namespace v8 |