Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 395f2e8103c43eb829a96a4e273c0a8f6227cb11..5ba177b89c9ed838b512e86fb935f38eef506362 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -248,8 +248,9 @@ class WasmTrapHelper : public ZoneObject { |
} |
}; |
-WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph, |
- wasm::FunctionSig* function_signature) |
+WasmGraphBuilder::WasmGraphBuilder( |
+ Zone* zone, JSGraph* jsgraph, wasm::FunctionSig* function_signature, |
+ compiler::SourcePositionTable* source_position_table) |
: zone_(zone), |
jsgraph_(jsgraph), |
module_(nullptr), |
@@ -261,8 +262,11 @@ WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph, |
cur_buffer_(def_buffer_), |
cur_bufsize_(kDefaultBufferSize), |
trap_(new (zone) WasmTrapHelper(this)), |
- function_signature_(function_signature) { |
+ function_signature_(function_signature), |
+ source_position_table_(source_position_table) { |
DCHECK_NOT_NULL(jsgraph_); |
+ DCHECK_IMPLIES(source_position_table != nullptr, |
+ source_position_table->GetGraph() == graph()); |
} |
@@ -2479,6 +2483,27 @@ void WasmGraphBuilder::Int64LoweringForTesting() { |
} |
} |
+void WasmGraphBuilder::EnterSourcePositionScope() { |
+ DCHECK_NULL(source_position_scope_); |
+ if (source_position_table_) { |
+ source_position_table_->AddDecorator(); |
+ source_position_scope_ = new SourcePositionScope(source_position_table_); |
+ } |
+} |
+ |
+void WasmGraphBuilder::LeaveSourcePositionScope() { |
+ DCHECK_EQ(!!source_position_table_, !!source_position_scope_); |
+ if (!source_position_scope_) return; |
+ delete source_position_scope_; |
+ source_position_scope_ = nullptr; |
+ source_position_table_->RemoveDecorator(); |
+} |
+ |
+void WasmGraphBuilder::SetCurrentSourcePosition(int position) { |
+ if (source_position_scope_) |
+ source_position_scope_->SetCurrentPosition(SourcePosition(position)); |
+} |
+ |
static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, |
CompilationInfo* info, |
const char* message, uint32_t index, |
@@ -2711,13 +2736,18 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate, |
&zone, MachineType::PointerRepresentation(), |
InstructionSelector::SupportedMachineOperatorFlags()); |
JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); |
- WasmGraphBuilder builder(&zone, &jsgraph, function.sig); |
+ SourcePositionTable source_position_table(&graph); |
+ 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}; |
+ |
+ builder.EnterSourcePositionScope(); |
wasm::TreeResult result = |
wasm::BuildTFGraph(isolate->allocator(), &builder, body); |
+ builder.LeaveSourcePositionScope(); |
if (result.failed()) { |
if (FLAG_trace_wasm_compiler) { |
@@ -2753,6 +2783,7 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate, |
if (machine.Is32()) { |
descriptor = module_env->GetI32WasmCallDescriptor(&zone, descriptor); |
} |
+ |
Code::Flags flags = Code::ComputeFlags(Code::WASM_FUNCTION); |
// add flags here if a meaningful name is helpful for debugging. |
bool debugging = |
@@ -2772,6 +2803,9 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate, |
func_name = buffer.start(); |
} |
CompilationInfo info(func_name, isolate, &zone, flags); |
+ // TODO(clemensh): make source position tracking optional |
+ info.MarkAsSourcePositionsEnabled(); |
+ info.SetSourcePositionTable(&source_position_table); |
Handle<Code> code = |
Pipeline::GenerateCodeForTesting(&info, descriptor, &graph); |