@@ -129,7 +129,8 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
129129 public:
130130 OutOfLineRecordWrite (CodeGenerator* gen, Register object, Register offset,
131131 Register value, Register scratch0, Register scratch1,
132- RecordWriteMode mode, StubCallMode stub_mode)
132+ RecordWriteMode mode, StubCallMode stub_mode,
133+ UnwindingInfoWriter* unwinding_info_writer)
133134 : OutOfLineCode(gen),
134135 object_ (object),
135136 offset_(offset),
@@ -140,11 +141,13 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
140141 mode_(mode),
141142 stub_mode_(stub_mode),
142143 must_save_lr_(!gen->frame_access_state ()->has_frame()),
144+ unwinding_info_writer_(unwinding_info_writer),
143145 zone_(gen->zone ()) {}
144146
145147 OutOfLineRecordWrite (CodeGenerator* gen, Register object, int32_t offset,
146148 Register value, Register scratch0, Register scratch1,
147- RecordWriteMode mode, StubCallMode stub_mode)
149+ RecordWriteMode mode, StubCallMode stub_mode,
150+ UnwindingInfoWriter* unwinding_info_writer)
148151 : OutOfLineCode(gen),
149152 object_(object),
150153 offset_(no_reg),
@@ -155,6 +158,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
155158 mode_(mode),
156159 stub_mode_(stub_mode),
157160 must_save_lr_(!gen->frame_access_state ()->has_frame()),
161+ unwinding_info_writer_(unwinding_info_writer),
158162 zone_(gen->zone ()) {}
159163
160164 void Generate () final {
@@ -180,6 +184,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
180184 // We need to save and restore lr if the frame was elided.
181185 __ mflr (scratch0_);
182186 __ Push (scratch0_);
187+ unwinding_info_writer_->MarkLinkRegisterOnTopOfStack (__ pc_offset ());
183188 }
184189 if (mode_ == RecordWriteMode::kValueIsEphemeronKey ) {
185190 __ CallEphemeronKeyBarrier (object_, scratch1_, save_fp_mode);
@@ -194,6 +199,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
194199 // We need to save and restore lr if the frame was elided.
195200 __ Pop (scratch0_);
196201 __ mtlr (scratch0_);
202+ unwinding_info_writer_->MarkPopLinkRegisterFromTopOfStack (__ pc_offset ());
197203 }
198204 }
199205
@@ -207,6 +213,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
207213 RecordWriteMode const mode_;
208214 StubCallMode stub_mode_;
209215 bool must_save_lr_;
216+ UnwindingInfoWriter* const unwinding_info_writer_;
210217 Zone* zone_;
211218};
212219
@@ -675,6 +682,7 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr,
675682
676683void CodeGenerator::AssembleDeconstructFrame () {
677684 __ LeaveFrame (StackFrame::MANUAL );
685+ unwinding_info_writer_.MarkFrameDeconstructed (__ pc_offset ());
678686}
679687
680688void CodeGenerator::AssemblePrepareTailCall () {
@@ -1182,16 +1190,16 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
11821190 AddressingModeField::decode (instr->opcode ());
11831191 if (addressing_mode == kMode_MRI ) {
11841192 int32_t offset = i.InputInt32 (1 );
1185- ool = new (zone ())
1186- OutOfLineRecordWrite ( this , object, offset, value, scratch0,
1187- scratch1, mode, DetermineStubCallMode ());
1193+ ool = new (zone ()) OutOfLineRecordWrite (
1194+ this , object, offset, value, scratch0, scratch1, mode ,
1195+ DetermineStubCallMode (), &unwinding_info_writer_ );
11881196 __ StoreP (value, MemOperand (object, offset));
11891197 } else {
11901198 DCHECK_EQ (kMode_MRR , addressing_mode);
11911199 Register offset (i.InputRegister (1 ));
1192- ool = new (zone ())
1193- OutOfLineRecordWrite ( this , object, offset, value, scratch0,
1194- scratch1, mode, DetermineStubCallMode ());
1200+ ool = new (zone ()) OutOfLineRecordWrite (
1201+ this , object, offset, value, scratch0, scratch1, mode ,
1202+ DetermineStubCallMode (), &unwinding_info_writer_ );
11951203 __ StorePX (value, MemOperand (object, offset));
11961204 }
11971205 __ CheckPageFlag (object, scratch0,
@@ -2407,6 +2415,7 @@ void CodeGenerator::AssembleConstructFrame() {
24072415 }
24082416 }
24092417 }
2418+ unwinding_info_writer_.MarkFrameConstructed (__ pc_offset ());
24102419 }
24112420
24122421 int required_slots =
@@ -2517,6 +2526,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* pop) {
25172526 __ MultiPopDoubles (double_saves);
25182527 }
25192528 PPCOperandConverter g (this , nullptr );
2529+ unwinding_info_writer_.MarkBlockWillExit ();
25202530
25212531 if (call_descriptor->IsCFunctionCall ()) {
25222532 AssembleDeconstructFrame ();
0 commit comments