summaryrefslogtreecommitdiff
path: root/gdb/s390-tdep.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2001-11-13 17:38:49 +0000
committerJim Blandy <jimb@codesourcery.com>2001-11-13 17:38:49 +0000
commit41f683cf68f8d0ded351419e4fefa27d21694e2b (patch)
tree604b2f1bceac1a1d9117eb864452c654d62fb8bc /gdb/s390-tdep.c
parent843312d789c0b51e39b9dcf5e775c58a91464cdb (diff)
downloadgdb-41f683cf68f8d0ded351419e4fefa27d21694e2b.tar.gz
* 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.
Diffstat (limited to 'gdb/s390-tdep.c')
-rw-r--r--gdb/s390-tdep.c44
1 files changed, 35 insertions, 9 deletions
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
index e682880c97b..32e5ef1a7a4 100644
--- a/gdb/s390-tdep.c
+++ b/gdb/s390-tdep.c
@@ -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