diff options
author | Jason Merrill <jason@casey.cygnus.com> | 2000-03-23 12:14:06 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2000-03-23 07:14:06 -0500 |
commit | 8034da37ce34e442aa8e04f3f1618b70b00ed10e (patch) | |
tree | ecba39cb912485714b2d62f815fa864dbb79faf9 /gcc/frame.c | |
parent | e77a2b027dce64c01152a744a65f785108e53939 (diff) | |
download | gcc-8034da37ce34e442aa8e04f3f1618b70b00ed10e.zip gcc-8034da37ce34e442aa8e04f3f1618b70b00ed10e.tar.gz gcc-8034da37ce34e442aa8e04f3f1618b70b00ed10e.tar.bz2 |
rs6000.h (DWARF_FRAME_RETURN_COLUMN): Define.
* config/rs6000/rs6000.h (DWARF_FRAME_RETURN_COLUMN): Define.
* config/alpha/alpha.h (DWARF_FRAME_RETURN_COLUMN): Define.
* config/sparc/sparc.h (DWARF_FRAME_RETURN_COLUMN): Define.
* frame.h (frame_state): Revert last change.
* frame.c (execute_cfa_insn): Just don't record the save of a CFA reg.
* libgcc2.c (throw_helper): Revert last change.
From-SVN: r32705
Diffstat (limited to 'gcc/frame.c')
-rw-r--r-- | gcc/frame.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/gcc/frame.c b/gcc/frame.c index 688355a..cfd979b 100644 --- a/gcc/frame.c +++ b/gcc/frame.c @@ -694,11 +694,16 @@ execute_cfa_insn (void *p, struct frame_state_internal *state, { reg = (insn & 0x3f); p = decode_uleb128 (p, &offset); - 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; + /* Don't record anything about this register; it's only used to + reload SP in the epilogue. We don't want to copy in SP + values for outer frames; we handle restoring SP specially. */; + else + { + offset *= info->data_align; + state->s.saved[reg] = REG_SAVED_OFFSET; + state->s.reg_or_offset[reg] = offset; + } } else if (insn & DW_CFA_restore) { @@ -727,11 +732,14 @@ execute_cfa_insn (void *p, struct frame_state_internal *state, case DW_CFA_offset_extended: p = decode_uleb128 (p, ®); p = decode_uleb128 (p, &offset); - 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; + /* Don't record anything; see above. */; + else + { + offset *= info->data_align; + state->s.saved[reg] = REG_SAVED_OFFSET; + state->s.reg_or_offset[reg] = offset; + } break; case DW_CFA_restore_extended: p = decode_uleb128 (p, ®); |