CpuProfiler: log pc offset for deopts.
authorloislo <loislo@chromium.org>
Wed, 18 Mar 2015 09:30:29 +0000 (02:30 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 18 Mar 2015 09:30:36 +0000 (09:30 +0000)
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}

src/arm/lithium-codegen-arm.cc
src/arm64/lithium-codegen-arm64.cc
src/compiler.cc
src/compiler.h
src/ia32/lithium-codegen-ia32.cc
src/mips/lithium-codegen-mips.cc
src/mips64/lithium-codegen-mips64.cc
src/ppc/lithium-codegen-ppc.cc
src/x64/lithium-codegen-x64.cc
src/x87/lithium-codegen-x87.cc

index fea392b567bd55db95be0c3a048fe6c7f7eee84a..646e1a9689a6e56ae7a460a5dc6f1efe5adbd01b 100644 (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_);
index 620f841d8c220862343af542e5930796a120a747..2c99a607f53eefc812b0a366829507bbb3d52cc0 100644 (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(
index 35c581f6b09b2bdb09fc3edb499e15ced5005e43..b622d9ce8574932f79225fcef40f9ec7b6997da4 100644 (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)
index 3f2aa4beb9474976891c293d3a041475f780fd5e..630e9cb74e47343efc66ed4c75894cebf792f762 100644 (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);
 
index 8b0fbc222fa798fe41593d7b3ced9d6dfd37f6c8..ed3e4b205fff5cc007951ce3e250b3fbb7f36660 100644 (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_);
index fca001f98b77b382d680111e577541d5ad279043..18d0c9bdae4197cd02fc648bd5105acae8f623b1 100644 (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_);
index 1471d58b89cbc7c36d3be07e5438ea5f3979f795..51c5ec48fe3ebca563d0d82a479a43e1deb0bc72 100644 (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_);
index f67f4c94de071b571139651df731b2c1d1610f3d..9af13ae23525989c6194b0905028e8aa135d6656 100644 (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_);
index 204030f5befb26690f1a244f9ae56bd2f964e30c..ffa0c4cd0fc668a367ea0a97df0542f684021360 100644 (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_);
index 53914b1985977ba9d8b86242f839a4b77c4962ce..4467d2e6ce0591a384036ff35ead45731ea88bb4 100644 (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_);