| 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());
|
|
|