diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 866385c..3a7fa3d 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -15930,7 +15930,7 @@ arm_emit_multi_reg_pop (unsigned long saved_regs_mask) int i, j; rtx par; rtx dwarf = NULL_RTX; - rtx tmp, reg; + rtx tmp, reg, fp_sp; bool return_in_pc; int offset_adj; int emit_update; @@ -15996,6 +15996,13 @@ arm_emit_multi_reg_pop (unsigned long saved_regs_mask) par = emit_insn (par); REG_NOTES (par) = dwarf; + RTX_FRAME_RELATED_P (par) = 1; + + fp_sp = frame_pointer_needed + ? hard_frame_pointer_rtx : stack_pointer_rtx; + tmp = plus_constant (Pmode, fp_sp, 4 * num_regs); + dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx, tmp); + add_reg_note (par, REG_CFA_ADJUST_CFA, dwarf); } /* Generate and emit an insn pattern that we will recognize as a pop_multi @@ -22870,15 +22877,20 @@ arm_expand_epilogue (bool really_return) { /* Pop off outgoing args and local frame to adjust stack pointer to last saved register. */ + rtx tmp; amount = offsets->outgoing_args - offsets->saved_regs; if (amount) { /* Force out any pending memory operations that reference stacked data before stack de-allocation occurs. */ emit_insn (gen_blockage ()); - emit_insn (gen_addsi3 (stack_pointer_rtx, - stack_pointer_rtx, - GEN_INT (amount))); + tmp = emit_insn (gen_addsi3 (stack_pointer_rtx, + stack_pointer_rtx, + GEN_INT (amount))); + dwarf = plus_constant (Pmode,stack_pointer_rtx, amount); + dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx, dwarf); + add_reg_note (tmp, REG_CFA_ADJUST_CFA, dwarf); + RTX_FRAME_RELATED_P (tmp) = 1; /* Emit USE(stack_pointer_rtx) to ensure that stack adjustment is not deleted. */ emit_insn (gen_prologue_use (stack_pointer_rtx)); @@ -22973,11 +22985,18 @@ arm_expand_epilogue (bool really_return) } else { + rtx dwarf; + rtx fp_sp = frame_pointer_needed + ? hard_frame_pointer_rtx : stack_pointer_rtx; insn = emit_insn (gen_movsi (gen_rtx_REG (SImode, i), addr)); REG_NOTES (insn) = alloc_reg_note (REG_CFA_RESTORE, gen_rtx_REG (SImode, i), NULL_RTX); + RTX_FRAME_RELATED_P (insn) = 1; + dwarf = plus_constant (Pmode, fp_sp, UNITS_PER_WORD); + dwarf = gen_rtx_SET (VOIDmode, fp_sp, dwarf); + add_reg_note (insn, REG_CFA_ADJUST_CFA, dwarf); } } } @@ -24602,9 +24621,12 @@ arm_unwind_emit (FILE * asm_out_file, rtx insn) handled_one = true; break; + /* The INSN is not expected to be handled here. */ + case REG_CFA_ADJUST_CFA: + return; + case REG_CFA_DEF_CFA: case REG_CFA_EXPRESSION: - case REG_CFA_ADJUST_CFA: case REG_CFA_OFFSET: /* ??? Only handling here what we actually emit. */ gcc_unreachable ();