Index: src/compiler/code-generator.cc |
diff --git a/src/compiler/code-generator.cc b/src/compiler/code-generator.cc |
index 71c6418ecc6aa4d3af50e757afed41c2bdc61771..1b1654117e0cdd87101003e0f7efe4050a9f750f 100644 |
--- a/src/compiler/code-generator.cc |
+++ b/src/compiler/code-generator.cc |
@@ -59,6 +59,9 @@ CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage, |
new (&labels_[i]) Label; |
} |
CreateFrameAccessState(frame); |
+ if (FLAG_perf_prof_unwinding_info) { |
+ unwinding_info_writer_.Reset(new UnwindingInfoWriter); |
+ } |
} |
void CodeGenerator::CreateFrameAccessState(Frame* frame) { |
@@ -112,6 +115,10 @@ Handle<Code> CodeGenerator::GenerateCode() { |
if (block->IsHandler()) EnsureSpaceForLazyDeopt(); |
// Bind a label for a block. |
current_block_ = block->rpo_number(); |
+ if (!unwinding_info_writer_.is_empty()) { |
+ unwinding_info_writer_->BeginInstructionBlock(masm()->pc_offset(), |
+ block); |
+ } |
if (FLAG_code_comments) { |
// TODO(titzer): these code comments are a giant memory leak. |
Vector<char> buffer = Vector<char>::New(200); |
@@ -162,6 +169,9 @@ Handle<Code> CodeGenerator::GenerateCode() { |
result = AssembleBlock(block); |
} |
if (result != kSuccess) return Handle<Code>(); |
+ if (!unwinding_info_writer_.is_empty()) { |
+ unwinding_info_writer_->EndInstructionBlock(block); |
+ } |
} |
} |
@@ -202,8 +212,14 @@ Handle<Code> CodeGenerator::GenerateCode() { |
safepoints()->Emit(masm(), frame()->GetTotalFrameSlotCount()); |
- Handle<Code> result = |
- v8::internal::CodeGenerator::MakeCodeEpilogue(masm(), nullptr, info); |
+ EhFrameWriter* eh_frame_writer = nullptr; |
+ if (!unwinding_info_writer_.is_empty()) { |
+ unwinding_info_writer_->Finish(masm()->pc_offset()); |
+ eh_frame_writer = unwinding_info_writer_->eh_frame_writer(); |
+ } |
+ |
+ Handle<Code> result = v8::internal::CodeGenerator::MakeCodeEpilogue( |
+ masm(), eh_frame_writer, info); |
result->set_is_turbofanned(true); |
result->set_stack_slots(frame()->GetTotalFrameSlotCount()); |
result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); |