* s390-tdep.c (s390_get_frame_info): Recognize spills of reg
authorJim Blandy <jimb@codesourcery.com>
Wed, 5 Dec 2001 00:20:37 +0000 (00:20 +0000)
committerJim Blandy <jimb@codesourcery.com>
Wed, 5 Dec 2001 00:20:37 +0000 (00:20 +0000)
arguments into their stack slots.

gdb/ChangeLog
gdb/s390-tdep.c

index d6dbbae65f4bd922c9d8d7c4ca6e3061f89be3b3..94d43f930740aed36bfae48778016c99686bf740 100644 (file)
@@ -1,5 +1,8 @@
 2001-12-04  Jim Blandy  <jimb@redhat.com>
 
+       * s390-tdep.c (s390_get_frame_info): Recognize spills of reg
+       arguments into their stack slots.
+
        * s390-tdep.c (s390_get_frame_info): More doc fixes.
 
        * s390-tdep.c (s390_get_frame_info): Doc fixes.
index 2d28d9c0ae70fed9921d9bb87b8b633d6f002c05..cefa9b7e16e418127a444ce4abf3ac7bc6735f93 100644 (file)
@@ -405,6 +405,23 @@ s390_get_frame_info (CORE_ADDR pc, struct frame_extra_info *fextra_info,
          continue;
        }
 
+      /* Check for an fp-relative STG or ST.  This is probably
+          spilling an argument from a register out into a stack slot.
+          This could be a user instruction, but if we haven't included
+          any other suspicious instructions in the prologue, this
+          could only be an initializing store, which isn't too bad to
+          skip.  The consequences of not including arg-to-stack spills
+          are more serious, though --- you don't see the proper values
+          of the arguments.  */
+      if ((save_link_state == 3 || save_link_state == 4)
+          && instr[0] == 0x50      /* st %rA, D(%rX,%rB) */
+          && (instr[1] & 0xf) == 0 /* %rX is zero, no index reg */
+          && ((instr[2] >> 4) & 0xf) == frame_pointer_regidx)
+        {
+          valid_prologue = 1;
+          continue;
+        }
+
       /* check for STD */
       if (instr[0] == 0x60 && (instr[2] >> 4) == 0xf)
        {