This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

PATCH: gdbarchify pop_frame



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 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]