aboutsummaryrefslogtreecommitdiff
path: root/gcc/frame.c
diff options
context:
space:
mode:
authorJason Merrill <jason@casey.cygnus.com>2000-03-23 12:14:06 +0000
committerJason Merrill <jason@gcc.gnu.org>2000-03-23 07:14:06 -0500
commit8034da37ce34e442aa8e04f3f1618b70b00ed10e (patch)
treeecba39cb912485714b2d62f815fa864dbb79faf9 /gcc/frame.c
parente77a2b027dce64c01152a744a65f785108e53939 (diff)
downloadgcc-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.c24
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, &reg);
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, &reg);