* s390-tdep.c (s390_pop_frame): Call generic_pop_current_frame, to
authorJim Blandy <jimb@codesourcery.com>
Tue, 13 Nov 2001 17:38:49 +0000 (17:38 +0000)
committerJim Blandy <jimb@codesourcery.com>
Tue, 13 Nov 2001 17:38:49 +0000 (17:38 +0000)
interact correctly with generic dummy frames.
(s390_pop_frame_regular): Move the guts of the frame-popping code
to here, to be called by generic_pop_current_frame.  Use the
frame's saved_regs array; this works for `return' as well as
inferior function calls.

gdb/ChangeLog
gdb/s390-tdep.c

index 5e7641c..e6bdf29 100644 (file)
@@ -1,5 +1,12 @@
 2001-11-13  Jim Blandy  <jimb@redhat.com>
 
+       * s390-tdep.c (s390_pop_frame): Call generic_pop_current_frame, to
+       interact correctly with generic dummy frames.
+       (s390_pop_frame_regular): Move the guts of the frame-popping code
+       to here, to be called by generic_pop_current_frame.  Use the
+       frame's saved_regs array; this works for `return' as well as
+       inferior function calls.
+
        * s390-tdep.c (s390_gdbarch_init): Register the function
        `standard_coerce_float_to_double', since GCC for the S/390 follows
        the standard rules for passing floats.
index e682880..32e5ef1 100644 (file)
@@ -1159,20 +1159,46 @@ s390_push_dummy_frame ()
   write_register (S390_SP_REGNUM, new_sp);
 }
 
-/* pop the innermost frame, go back to the caller.
-    Used in `call_function_by_hand' to remove an artificial stack
-     frame.  */
-void
-s390_pop_frame ()
+
+static void
+s390_pop_frame_regular (struct frame_info *frame)
 {
-  CORE_ADDR new_sp = read_register (S390_SP_REGNUM), orig_sp;
-  void *saved_regs = alloca (REGISTER_BYTES);
+  int regnum;
+
+  write_register (S390_PC_REGNUM, FRAME_SAVED_PC (frame));
+
+  /* Restore any saved registers.  */
+  for (regnum = 0; regnum < NUM_REGS; regnum++)
+    if (frame->saved_regs[regnum] != 0)
+      {
+        ULONGEST value;
+
+        value = read_memory_unsigned_integer (frame->saved_regs[regnum],
+                                              REGISTER_RAW_SIZE (regnum));
+        write_register (regnum, value);
+      }
 
+  /* Actually cut back the stack.  */
+  write_register (S390_SP_REGNUM, FRAME_FP (frame));
 
-  read_memory (new_sp + S390_GPR_SIZE, (char *) saved_regs, REGISTER_BYTES);
-  write_register_bytes (0, (char *) &saved_regs, REGISTER_BYTES);
+  /* Throw away any cached frame information.  */
+  flush_cached_frames ();
 }
 
+
+/* Destroy the innermost (Top-Of-Stack) stack frame, restoring the 
+   machine state that was in effect before the frame was created. 
+   Used in the contexts of the "return" command, and of 
+   target function calls from the debugger.  */
+void
+s390_pop_frame ()
+{
+  /* This function checks for and handles generic dummy frames, and
+     calls back to our function for ordinary frames.  */
+  generic_pop_current_frame (s390_pop_frame_regular);
+}
+
+
 /* used by call function by hand
   struct_return indicates that this function returns a structure &
   therefore gpr2 stores a pointer to the structure to be returned as