diff options
author | Gavin Koch <gavin@cygnus.com> | 1997-12-18 07:48:19 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-12-18 07:48:19 -0700 |
commit | 63d96a955940981de3a4bdf2645080068d10faa1 (patch) | |
tree | 1189a2de98605c2f275fd0a8b03e156036477996 /gcc | |
parent | 913b5d5489c6c62f1e422a085979cdeaef8cc935 (diff) | |
download | gcc-63d96a955940981de3a4bdf2645080068d10faa1.zip gcc-63d96a955940981de3a4bdf2645080068d10faa1.tar.gz gcc-63d96a955940981de3a4bdf2645080068d10faa1.tar.bz2 |
dwarf2out.c (dwarf2out_frame_debug): Handle adjustments of the frame pointer in the prologue.
/
* dwarf2out.c (dwarf2out_frame_debug): Handle adjustments of the
frame pointer in the prologue.
From-SVN: r17131
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/dwarf2out.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index d7ddf76..d321e9f 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1221,6 +1221,39 @@ dwarf2out_frame_debug (insn) if (cfa_store_reg == STACK_POINTER_REGNUM) cfa_store_offset += offset; } + else if (dest == hard_frame_pointer_rtx) + { + /* Either setting the FP from an offset of the SP, + or adjusting the FP */ + if (! frame_pointer_needed + || REGNO (dest) != HARD_FRAME_POINTER_REGNUM) + abort (); + + if (XEXP (src, 0) == stack_pointer_rtx + && GET_CODE (XEXP (src, 1)) == CONST_INT) + { + if (cfa_reg != STACK_POINTER_REGNUM) + abort (); + offset = INTVAL (XEXP (src, 1)); + if (GET_CODE (src) == PLUS) + offset = -offset; + cfa_offset += offset; + cfa_reg = HARD_FRAME_POINTER_REGNUM; + } + else if (XEXP (src, 0) == hard_frame_pointer_rtx + && GET_CODE (XEXP (src, 1)) == CONST_INT) + { + if (cfa_reg != HARD_FRAME_POINTER_REGNUM) + abort (); + offset = INTVAL (XEXP (src, 1)); + if (GET_CODE (src) == PLUS) + offset = -offset; + cfa_offset += offset; + } + + else + abort(); + } else { if (GET_CODE (src) != PLUS |