CpuProfiler: log pc offset for deopts.

This is the fifth part of https://codereview.chromium.org/1012633002
In this part we collect the offsets of deopt calls and save it into
an inlined function info.

On the Next:
Later when deopt happens we will get the offset of deopt call and
search it among inlined infos.

BUG=chromium:452067
LOG=n

Review URL: https://codereview.chromium.org/1011113004

Cr-Commit-Position: refs/heads/master@{#27258}
This commit is contained in:
loislo 2015-03-18 02:30:29 -07:00 committed by Commit bot
parent 46d6ffeddd
commit 7fef610d72
10 changed files with 41 additions and 1 deletions

View File

@ -352,6 +352,8 @@ bool LCodeGen::GenerateJumpTable() {
} else {
__ bl(&call_deopt_entry);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
masm()->CheckConstPool(false, false);
}
@ -887,6 +889,7 @@ void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr,
!info()->saves_caller_doubles()) {
DeoptComment(deopt_info);
__ Call(entry, RelocInfo::RUNTIME_ENTRY);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);

View File

@ -876,6 +876,8 @@ bool LCodeGen::GenerateJumpTable() {
// table.
__ Bl(&call_deopt_entry);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
masm()->CheckConstPool(false, false);
}
@ -1061,6 +1063,7 @@ void LCodeGen::DeoptimizeBranch(
frame_is_built_ && !info()->saves_caller_doubles()) {
DeoptComment(deopt_info);
__ Call(entry, RelocInfo::RUNTIME_ENTRY);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry* table_entry =
new (zone()) Deoptimizer::JumpTableEntry(

View File

@ -322,6 +322,14 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
}
void CompilationInfo::LogDeoptCallPosition(int pc_offset, int inlining_id) {
if (!track_positions_ || IsStub()) return;
DCHECK_LT(static_cast<size_t>(inlining_id), inlined_function_infos_->size());
inlined_function_infos_->at(inlining_id)
.deopt_pc_offsets.push_back(pc_offset);
}
class HOptimizedGraphBuilderWithPositions: public HOptimizedGraphBuilder {
public:
explicit HOptimizedGraphBuilderWithPositions(CompilationInfo* info)

View File

@ -97,6 +97,7 @@ struct InlinedFunctionInfo {
SourcePosition inline_position;
int script_id;
int start_position;
std::vector<int> deopt_pc_offsets;
static const int kNoParentId = -1;
};
@ -342,6 +343,13 @@ class CompilationInfo {
std::vector<InlinedFunctionInfo>* inlined_function_infos() {
return inlined_function_infos_;
}
std::vector<InlinedFunctionInfo>* ReleaseInlinedFunctionInfos() {
std::vector<InlinedFunctionInfo>* tmp = inlined_function_infos_;
inlined_function_infos_ = NULL;
return tmp;
}
void LogDeoptCallPosition(int pc_offset, int inlining_id);
int TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
SourcePosition position, int pareint_id);

View File

@ -395,6 +395,8 @@ bool LCodeGen::GenerateJumpTable() {
if (info()->saves_caller_doubles()) RestoreCallerDoubles();
__ call(entry, RelocInfo::RUNTIME_ENTRY);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
}
if (needs_frame.is_linked()) {
__ bind(&needs_frame);
@ -888,6 +890,7 @@ void LCodeGen::DeoptimizeIf(Condition cc, LInstruction* instr,
if (cc == no_condition && frame_is_built_) {
DeoptComment(deopt_info);
__ call(entry, RelocInfo::RUNTIME_ENTRY);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);

View File

@ -353,6 +353,8 @@ bool LCodeGen::GenerateJumpTable() {
} else {
__ Call(&call_deopt_entry);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
}
if (needs_frame.is_linked()) {
@ -853,6 +855,7 @@ void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr,
!info()->saves_caller_doubles()) {
DeoptComment(deopt_info);
__ Call(entry, RelocInfo::RUNTIME_ENTRY, condition, src1, src2);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);

View File

@ -320,6 +320,8 @@ bool LCodeGen::GenerateJumpTable() {
} else {
__ Call(&call_deopt_entry);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
}
if (needs_frame.is_linked()) {
__ bind(&needs_frame);
@ -820,6 +822,7 @@ void LCodeGen::DeoptimizeIf(Condition condition, LInstruction* instr,
!info()->saves_caller_doubles()) {
DeoptComment(deopt_info);
__ Call(entry, RelocInfo::RUNTIME_ENTRY, condition, src1, src2);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);

View File

@ -343,6 +343,8 @@ bool LCodeGen::GenerateJumpTable() {
} else {
__ b(&call_deopt_entry, SetLK);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
}
if (needs_frame.is_linked()) {
@ -809,6 +811,7 @@ void LCodeGen::DeoptimizeIf(Condition cond, LInstruction* instr,
if (cond == al && frame_is_built_ && !info()->saves_caller_doubles()) {
DeoptComment(deopt_info);
__ Call(entry, RelocInfo::RUNTIME_ENTRY);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);

View File

@ -317,6 +317,8 @@ bool LCodeGen::GenerateJumpTable() {
}
__ call(entry, RelocInfo::RUNTIME_ENTRY);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
}
if (needs_frame.is_linked()) {
@ -358,7 +360,7 @@ bool LCodeGen::GenerateJumpTable() {
__ Move(MemOperand(rsp, 2 * kPointerSize), Smi::FromInt(StackFrame::STUB));
/* stack layout
4: old ebp
4: old rbp
3: context pointer
2: stub marker
1: return address
@ -811,6 +813,7 @@ void LCodeGen::DeoptimizeIf(Condition cc, LInstruction* instr,
!info()->saves_caller_doubles()) {
DeoptComment(deopt_info);
__ call(entry, RelocInfo::RUNTIME_ENTRY);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);

View File

@ -391,6 +391,8 @@ bool LCodeGen::GenerateJumpTable() {
} else {
__ call(entry, RelocInfo::RUNTIME_ENTRY);
}
info()->LogDeoptCallPosition(masm()->pc_offset(),
table_entry->deopt_info.inlining_id);
}
if (needs_frame.is_linked()) {
__ bind(&needs_frame);
@ -1173,6 +1175,7 @@ void LCodeGen::DeoptimizeIf(Condition cc, LInstruction* instr,
if (cc == no_condition && frame_is_built_) {
DeoptComment(deopt_info);
__ call(entry, RelocInfo::RUNTIME_ENTRY);
info()->LogDeoptCallPosition(masm()->pc_offset(), deopt_info.inlining_id);
} else {
Deoptimizer::JumpTableEntry table_entry(entry, deopt_info, bailout_type,
!frame_is_built_);