Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index c57dde3bcc4fe38cfba099316dda9fea1c73d90e..d8b316d573738af0efb5d1e175395634997cc6da 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -3123,9 +3123,7 @@ Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, wasm::ModuleEnv* module, |
return code; |
} |
-std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction( |
- JSGraph* jsgraph, wasm::ErrorThrower* thrower, Isolate* isolate, |
- wasm::ModuleEnv*& module_env, const wasm::WasmFunction* function, |
+SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( |
double* decode_ms) { |
base::ElapsedTimer decode_timer; |
if (FLAG_trace_wasm_decode_time) { |
@@ -3133,47 +3131,41 @@ std::pair<JSGraph*, SourcePositionTable*> BuildGraphForWasmFunction( |
} |
// Create a TF graph during decoding. |
- Graph* graph = jsgraph->graph(); |
- CommonOperatorBuilder* common = jsgraph->common(); |
- MachineOperatorBuilder* machine = jsgraph->machine(); |
+ Graph* graph = jsgraph_->graph(); |
+ CommonOperatorBuilder* common = jsgraph_->common(); |
+ MachineOperatorBuilder* machine = jsgraph_->machine(); |
SourcePositionTable* source_position_table = |
- new (jsgraph->zone()) SourcePositionTable(graph); |
- WasmGraphBuilder builder(jsgraph->zone(), jsgraph, function->sig, |
+ new (jsgraph_->zone()) SourcePositionTable(graph); |
+ WasmGraphBuilder builder(jsgraph_->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}; |
- wasm::TreeResult result = |
- wasm::BuildTFGraph(isolate->allocator(), &builder, 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}; |
+ graph_construction_result_ = |
+ wasm::BuildTFGraph(isolate_->allocator(), &builder, body); |
+ |
+ if (graph_construction_result_.failed()) { |
+ if (FLAG_trace_wasm_compiler) { |
+ OFStream os(stdout); |
+ os << "Compilation failed: " << graph_construction_result_ << std::endl; |
+ } |
+ return nullptr; |
+ } |
if (machine->Is32()) { |
- Int64Lowering r(graph, machine, common, jsgraph->zone(), function->sig); |
+ Int64Lowering r(graph, machine, common, jsgraph_->zone(), function_->sig); |
r.LowerGraph(); |
} |
- if (result.failed()) { |
- if (FLAG_trace_wasm_compiler) { |
- OFStream os(stdout); |
- os << "Compilation failed: " << result << std::endl; |
- } |
- // 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); |
- SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:", |
- 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); |
+ PrintAst(isolate_->allocator(), body); |
} |
if (FLAG_trace_wasm_decode_time) { |
*decode_ms = decode_timer.Elapsed().InMillisecondsF(); |
} |
- return std::make_pair(jsgraph, source_position_table); |
+ return source_position_table; |
} |
WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, |
@@ -3221,32 +3213,32 @@ void WasmCompilationUnit::ExecuteCompilation() { |
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; |
+ SourcePositionTable* source_positions = BuildGraphForWasmFunction(&decode_ms); |
- if (jsgraph == nullptr) { |
+ if (graph_construction_result_.failed()) { |
ok_ = false; |
return; |
} |
base::ElapsedTimer pipeline_timer; |
if (FLAG_trace_wasm_decode_time) { |
- node_count = jsgraph->graph()->NodeCount(); |
+ 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()) { |
+ if (jsgraph_->machine()->Is32()) { |
descriptor = |
module_env_->GetI32WasmCallDescriptor(&compilation_zone_, descriptor); |
} |
- job_.Reset(Pipeline::NewWasmCompilationJob(&info_, jsgraph->graph(), |
+ job_.Reset(Pipeline::NewWasmCompilationJob(&info_, jsgraph_->graph(), |
descriptor, source_positions)); |
+ |
+ // The function name {OptimizeGraph()} is misleading but necessary because we |
+ // want to use the CompilationJob interface. A better name would be |
+ // ScheduleGraphAndSelectInstructions. |
ok_ = job_->OptimizeGraph() == CompilationJob::SUCCEEDED; |
// TODO(bradnelson): Improve histogram handling of size_t. |
// TODO(ahaas): The counters are not thread-safe at the moment. |
@@ -3267,6 +3259,16 @@ void WasmCompilationUnit::ExecuteCompilation() { |
Handle<Code> WasmCompilationUnit::FinishCompilation() { |
if (!ok_) { |
+ if (graph_construction_result_.failed()) { |
+ // Add the function as another context for the exception |
+ ScopedVector<char> buffer(128); |
bradnelson
2016/05/25 10:50:12
How do we know this is enough?
bradnelson
2016/05/25 11:18:57
Nevermind, this is fine.
|
+ 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(), graph_construction_result_); |
+ } |
+ |
return Handle<Code>::null(); |
} |
if (job_->GenerateCode() != CompilationJob::SUCCEEDED) { |