This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH: S/390: pop generic dummy frames and normal frames correctly
- To: gdb-patches at sources dot redhat dot com
- Subject: PATCH: S/390: pop generic dummy frames and normal frames correctly
- From: Jim Blandy <jimb at zwingli dot cygnus dot com>
- Date: Tue, 13 Nov 2001 12:41:29 -0500 (EST)
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.
Index: gdb/s390-tdep.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/s390-tdep.c,v
retrieving revision 2.10
diff -c -r2.10 s390-tdep.c
*** gdb/s390-tdep.c 2001/11/13 17:25:17 2.10
--- gdb/s390-tdep.c 2001/11/13 17:33:48
***************
*** 1159,1177 ****
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 ()
{
! CORE_ADDR new_sp = read_register (S390_SP_REGNUM), orig_sp;
! void *saved_regs = alloca (REGISTER_BYTES);
! read_memory (new_sp + S390_GPR_SIZE, (char *) saved_regs, REGISTER_BYTES);
! write_register_bytes (0, (char *) &saved_regs, REGISTER_BYTES);
}
/* used by call function by hand
struct_return indicates that this function returns a structure &
--- 1159,1203 ----
write_register (S390_SP_REGNUM, new_sp);
}
!
! static void
! s390_pop_frame_regular (struct frame_info *frame)
{
! 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));
!
! /* 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 &