diff options
author | Jason Merrill <jason@casey.cygnus.com> | 2000-03-23 00:29:55 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2000-03-22 19:29:55 -0500 |
commit | 2c84914526bd6e657d8e55291fe7ce3f1395c766 (patch) | |
tree | b3b34069ee82d4ab6af7bad503c9132d5330f934 /gcc/frame.c | |
parent | cb1072f45021824406e8ac504a111d6bbccb5b81 (diff) | |
download | gcc-2c84914526bd6e657d8e55291fe7ce3f1395c766.zip gcc-2c84914526bd6e657d8e55291fe7ce3f1395c766.tar.gz gcc-2c84914526bd6e657d8e55291fe7ce3f1395c766.tar.bz2 |
Implement dwarf2 exception handling for the ARM.
* config/arm/arm.h (INCOMING_RETURN_ADDR_RTX): Define.
(DWARF_FRAME_RETURN_COLUMN): Define.
* config/arm/arm.c (emit_multi_reg_push): Return rtx. Attach
REG_FRAME_RELATED_EXPR note.
(emit_sfm): Likewise.
(arm_expand_prologue): Set RTX_FRAME_RELATED_P on everything.
* dwarf2out.c (reg_save): Handle saving a register to itself.
(dwarf2out_frame_debug_expr): Handle an intermediate cfa reg.
* except.c (eh_regs): Don't use the static chain reg if it's
callee-saved.
* frame.h (frame_state): Add cfa_saved field.
* frame.c (execute_cfa_insn): Set it.
* libgcc2.c (throw_helper): Don't adjust sp if it's restored in
the epilogue.
* function.c (ARG_POINTER_CFA_OFFSET): Default to FIRST_PARM_OFFSET.
Now takes a parm.
(instantiate_virtual_regs): Adjust.
* tm.texi: Adjust.
* config/m68k/m68k.h (ARG_POINTER_CFA_OFFSET): Don't define.
* config/ns32k/ns32k.h (ARG_POINTER_CFA_OFFSET): Don't define.
* config/sparc/sparc.h (ARG_POINTER_CFA_OFFSET): Take a parm.
* dwarf2out.c (reg_number): Refer to FIRST_PSEUDO_REGISTER.
(initial_return_save): Use DWARF_FRAME_REGNUM, not reg_number.
From-SVN: r32696
Diffstat (limited to 'gcc/frame.c')
-rw-r--r-- | gcc/frame.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/frame.c b/gcc/frame.c index 79ba78a..688355a 100644 --- a/gcc/frame.c +++ b/gcc/frame.c @@ -697,6 +697,8 @@ execute_cfa_insn (void *p, struct frame_state_internal *state, offset *= info->data_align; state->s.saved[reg] = REG_SAVED_OFFSET; state->s.reg_or_offset[reg] = offset; + if (reg == state->s.cfa_reg) + state->s.cfa_saved = 1; } else if (insn & DW_CFA_restore) { @@ -728,6 +730,8 @@ execute_cfa_insn (void *p, struct frame_state_internal *state, offset *= info->data_align; state->s.saved[reg] = REG_SAVED_OFFSET; state->s.reg_or_offset[reg] = offset; + if (reg == state->s.cfa_reg) + state->s.cfa_saved = 1; break; case DW_CFA_restore_extended: p = decode_uleb128 (p, ®); |