Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index d70b4805e1a66fc045f9612b0721add3d4328f91..ed5451fa02904395a7f21b8437efb643327b4b6b 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -1353,6 +1353,10 @@ void HGraphBuilder::LoopBuilder::EndBody() { |
HGraph* HGraphBuilder::CreateGraph() { |
graph_ = new (zone()) HGraph(info_, descriptor_); |
if (FLAG_hydrogen_stats) isolate()->GetHStatistics()->Initialize(info_); |
+ if (!info_->IsStub() && info_->is_tracking_positions()) { |
+ TraceInlinedFunction(info_->shared_info(), SourcePosition::Unknown(), |
+ InlinedFunctionInfo::kNoParentId); |
+ } |
CompilationPhase phase("H_Block building", info_); |
set_current_block(graph()->entry_block()); |
if (!BuildGraph()) return NULL; |
@@ -1360,6 +1364,51 @@ HGraph* HGraphBuilder::CreateGraph() { |
return graph_; |
} |
+int HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, |
+ SourcePosition position, |
+ int parent_id) { |
+ DCHECK(info_->is_tracking_positions()); |
+ |
+ int inline_id = static_cast<int>(info_->inlined_function_infos().size()); |
+ InlinedFunctionInfo info(parent_id, position, UnboundScript::kNoScriptId, |
+ shared->start_position()); |
+ if (!shared->script()->IsUndefined()) { |
+ Handle<Script> script(Script::cast(shared->script())); |
+ info.script_id = script->id(); |
+ |
+ if (FLAG_hydrogen_track_positions && !script->source()->IsUndefined()) { |
+ CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); |
+ OFStream os(tracing_scope.file()); |
+ os << "--- FUNCTION SOURCE (" << shared->DebugName()->ToCString().get() |
+ << ") id{" << info_->optimization_id() << "," << inline_id |
+ << "} ---\n"; |
+ { |
+ DisallowHeapAllocation no_allocation; |
+ int start = shared->start_position(); |
+ int len = shared->end_position() - start; |
+ String::SubStringRange source(String::cast(script->source()), start, |
+ len); |
+ for (const auto& c : source) { |
+ os << AsReversiblyEscapedUC16(c); |
+ } |
+ } |
+ |
+ os << "\n--- END ---\n"; |
+ } |
+ } |
+ |
+ info_->inlined_function_infos().push_back(info); |
+ |
+ if (FLAG_hydrogen_track_positions && inline_id != 0) { |
+ CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); |
+ OFStream os(tracing_scope.file()); |
+ os << "INLINE (" << shared->DebugName()->ToCString().get() << ") id{" |
+ << info_->optimization_id() << "," << inline_id << "} AS " << inline_id |
+ << " AT " << position << std::endl; |
+ } |
+ |
+ return inline_id; |
+} |
HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
DCHECK(current_block() != NULL); |
@@ -3787,10 +3836,6 @@ HGraph::HGraph(CompilationInfo* info, CallInterfaceDescriptor descriptor) |
start_environment_ = new (zone_) |
HEnvironment(zone_, descriptor.GetRegisterParameterCount() + 1); |
} else { |
- if (info->is_tracking_positions()) { |
- info->TraceInlinedFunction(info->shared_info(), SourcePosition::Unknown(), |
- InlinedFunctionInfo::kNoParentId); |
- } |
start_environment_ = |
new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); |
} |
@@ -3819,7 +3864,10 @@ void HGraph::FinalizeUniqueness() { |
int HGraph::SourcePositionToScriptPosition(SourcePosition pos) { |
return (FLAG_hydrogen_track_positions && !pos.IsUnknown()) |
- ? info()->start_position_for(pos.inlining_id()) + pos.position() |
+ ? info()->inlined_function_infos() |
+ .at(pos.inlining_id()) |
+ .start_position + |
+ pos.position() |
: pos.raw(); |
} |
@@ -8647,8 +8695,8 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target, |
int inlining_id = 0; |
if (top_info()->is_tracking_positions()) { |
- inlining_id = top_info()->TraceInlinedFunction( |
- target_shared, source_position(), function_state()->inlining_id()); |
+ inlining_id = TraceInlinedFunction(target_shared, source_position(), |
+ function_state()->inlining_id()); |
} |
// Save the pending call context. Set up new one for the inlined function. |