aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGavin Koch <gavin@cygnus.com>1997-12-18 07:48:19 -0700
committerJeff Law <law@gcc.gnu.org>1997-12-18 07:48:19 -0700
commit63d96a955940981de3a4bdf2645080068d10faa1 (patch)
tree1189a2de98605c2f275fd0a8b03e156036477996 /gcc
parent913b5d5489c6c62f1e422a085979cdeaef8cc935 (diff)
downloadgcc-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.c33
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