5 #include "src/compiler/backend/arm/unwinding-info-writer-arm.h" 6 #include "src/compiler/backend/instruction.h" 12 void UnwindingInfoWriter::BeginInstructionBlock(
int pc_offset,
13 const InstructionBlock* block) {
14 if (!enabled())
return;
16 block_will_exit_ =
false;
18 DCHECK_LT(block->rpo_number().ToInt(),
19 static_cast<int>(block_initial_states_.size()));
20 const BlockInitialState* initial_state =
21 block_initial_states_[block->rpo_number().ToInt()];
23 if (initial_state->saved_lr_ != saved_lr_) {
24 eh_frame_writer_.AdvanceLocation(pc_offset);
25 if (initial_state->saved_lr_) {
26 eh_frame_writer_.RecordRegisterSavedToStack(lr, kPointerSize);
28 eh_frame_writer_.RecordRegisterFollowsInitialRule(lr);
30 saved_lr_ = initial_state->saved_lr_;
37 DCHECK(block->predecessors().empty() || block->successors().empty());
41 void UnwindingInfoWriter::EndInstructionBlock(
const InstructionBlock* block) {
42 if (!enabled() || block_will_exit_)
return;
44 for (
const RpoNumber& successor : block->successors()) {
45 int successor_index = successor.ToInt();
46 DCHECK_LT(successor_index, static_cast<int>(block_initial_states_.size()));
47 const BlockInitialState* existing_state =
48 block_initial_states_[successor_index];
53 DCHECK_EQ(existing_state->saved_lr_, saved_lr_);
55 block_initial_states_[successor_index] =
56 new (zone_) BlockInitialState(saved_lr_);
61 void UnwindingInfoWriter::MarkFrameConstructed(
int at_pc) {
62 if (!enabled())
return;
77 eh_frame_writer_.AdvanceLocation(at_pc);
78 eh_frame_writer_.RecordRegisterSavedToStack(lr, kPointerSize);
82 void UnwindingInfoWriter::MarkFrameDeconstructed(
int at_pc) {
83 if (!enabled())
return;
86 eh_frame_writer_.AdvanceLocation(at_pc);
87 eh_frame_writer_.RecordRegisterFollowsInitialRule(lr);
91 void UnwindingInfoWriter::MarkLinkRegisterOnTopOfStack(
int pc_offset) {
92 if (!enabled())
return;
94 eh_frame_writer_.AdvanceLocation(pc_offset);
95 eh_frame_writer_.SetBaseAddressRegisterAndOffset(sp, 0);
96 eh_frame_writer_.RecordRegisterSavedToStack(lr, 0);
99 void UnwindingInfoWriter::MarkPopLinkRegisterFromTopOfStack(
int pc_offset) {
100 if (!enabled())
return;
102 eh_frame_writer_.AdvanceLocation(pc_offset);
103 eh_frame_writer_.SetBaseAddressRegisterAndOffset(fp, 0);
104 eh_frame_writer_.RecordRegisterFollowsInitialRule(lr);