This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH: gdbarchify pop_frame
- To: gdb-patches at sources dot redhat dot com
- Subject: PATCH: gdbarchify pop_frame
- From: Jim Blandy <jimb at zwingli dot cygnus dot com>
- Date: Fri, 4 May 2001 19:07:22 -0500 (EST)
2001-05-04 Jim Blandy <jimb@redhat.com>
* mn10300-tdep.c (mn10300_pop_frame): Split the mn10300-specific
stuff out into mn10300_pop_frame_regular, and use
generic_pop_current_frame. This lets us share code, and also
makes this function's prototype match that expected by gdbarch.
Make this function static.
(mn10300_pop_frame_regular): New function.
(mn10300_gdbarch_init): Register mn10300_pop_frame as the
gdbarch's pop_frame method.
* config/mn10300/tm-mn10300.h (POP_FRAME): Delete definition.
(mn10300_pop_frame): Delete declaration.
*** gdb/mn10300-tdep.c.base Fri May 4 14:41:01 2001
--- gdb/mn10300-tdep.c Fri May 4 14:46:28 2001
***************
*** 611,648 ****
return mn10300_analyze_prologue (NULL, pc);
}
!
! /* Function: pop_frame
! This routine gets called when either the user uses the `return'
! command, or the call dummy breakpoint gets hit. */
!
! void
! mn10300_pop_frame (struct frame_info *frame)
{
int regnum;
! if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
! generic_pop_dummy_frame ();
! else
! {
! write_register (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 (SP_REGNUM, FRAME_FP (frame));
! /* Don't we need to set the PC?!? XXX FIXME. */
! }
/* Throw away any cached frame information. */
flush_cached_frames ();
--- 611,651 ----
return mn10300_analyze_prologue (NULL, pc);
}
! /* generic_pop_current_frame calls this function if the current
! frame isn't a dummy frame. */
! static void
! mn10300_pop_frame_regular (struct frame_info *frame)
{
int regnum;
! write_register (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 (SP_REGNUM, FRAME_FP (frame));
! /* Don't we need to set the PC?!? XXX FIXME. */
! }
!
! /* Function: pop_frame
! This routine gets called when either the user uses the `return'
! command, or the call dummy breakpoint gets hit. */
! static void
! mn10300_pop_frame (void)
! {
! /* This function checks for and handles generic dummy frames, and
! calls back to our function for ordinary frames. */
! generic_pop_current_frame (mn10300_pop_frame_regular);
/* Throw away any cached frame information. */
flush_cached_frames ();
***************
*** 1058,1063 ****
--- 1061,1067 ----
(gdbarch, mn10300_extract_struct_value_address);
set_gdbarch_store_return_value (gdbarch, mn10300_store_return_value);
set_gdbarch_store_struct_return (gdbarch, mn10300_store_struct_return);
+ set_gdbarch_pop_frame (gdbarch, mn10300_pop_frame);
set_gdbarch_skip_prologue (gdbarch, mn10300_skip_prologue);
set_gdbarch_frame_args_skip (gdbarch, 0);
set_gdbarch_frame_args_address (gdbarch, default_frame_address);
*** gdb/config/mn10300/tm-mn10300.h.base Fri May 4 14:05:17 2001
--- gdb/config/mn10300/tm-mn10300.h Fri May 4 14:48:16 2001
***************
*** 60,68 ****
#define INIT_FRAME_PC /* Not necessary */
- extern void mn10300_pop_frame (struct frame_info *);
- #define POP_FRAME mn10300_pop_frame (get_current_frame ())
-
/* Cons up virtual frame pointer for trace */
extern void mn10300_virtual_frame_pointer (CORE_ADDR, long *, long *);
#define TARGET_VIRTUAL_FRAME_POINTER(PC, REGP, OFFP) \
--- 60,65 ----