* s390-tdep.c (s390_pop_frame_regular): On the S/390, the frame
authorJim Blandy <jimb@codesourcery.com>
Wed, 14 Nov 2001 22:34:38 +0000 (22:34 +0000)
committerJim Blandy <jimb@codesourcery.com>
Wed, 14 Nov 2001 22:34:38 +0000 (22:34 +0000)
pointer and the SP are often the same, so we can't pop the frame
by setting the SP to the FP; we need to get the old SP from
saved_regs.

gdb/ChangeLog
gdb/s390-tdep.c

index 5f245cc7aea392a24cfd903493c6ff8922363423..f13b54a22a9615a893d1e822621889c97b44ec95 100644 (file)
@@ -1,5 +1,10 @@
 2001-11-14  Jim Blandy  <jimb@redhat.com>
 
+       * s390-tdep.c (s390_pop_frame_regular): On the S/390, the frame
+       pointer and the SP are often the same, so we can't pop the frame
+       by setting the SP to the FP; we need to get the old SP from
+       saved_regs.
+
        * s390-tdep.c (s390_extract_return_value): Returned `float' values
        can simply be copied bitwise from the registers into the value
        object's buffer.
index 632261ed1f1e5e8024467c0f9aa02d12e7f225ca..d2fa1a0f5a6fdb6e4269ed7fc1c20b7dab55be4b 100644 (file)
@@ -1169,8 +1169,10 @@ s390_pop_frame_regular (struct frame_info *frame)
         write_register (regnum, value);
       }
 
-  /* Actually cut back the stack.  */
-  write_register (S390_SP_REGNUM, FRAME_FP (frame));
+  /* Actually cut back the stack.  Remember that the SP's element of
+     saved_regs is the old SP itself, not the address at which it is
+     saved.  */
+  write_register (S390_SP_REGNUM, frame->saved_regs[S390_SP_REGNUM]);
 
   /* Throw away any cached frame information.  */
   flush_cached_frames ();