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: doc fixes for mn10300 prologue analyzer



I've committed this.

2001-10-10  Jim Blandy  <jimb@redhat.com>

	* mn10300-tdep.c (mn10300_analyze_prologue): Doc fixes.

Index: gdb/mn10300-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mn10300-tdep.c,v
retrieving revision 1.21
diff -c -r1.21 mn10300-tdep.c
*** gdb/mn10300-tdep.c	2001/08/12 03:39:11	1.21
--- gdb/mn10300-tdep.c	2001/10/10 21:11:58
***************
*** 291,307 ****
  /* The main purpose of this file is dealing with prologues to extract
     information about stack frames and saved registers.
  
!    For reference here's how prologues look on the mn10300:
  
-    With frame pointer:
-    movm [d2,d3,a2,a3],sp
-    mov sp,a3
-    add <size>,sp
- 
-    Without frame pointer:
-    movm [d2,d3,a2,a3],sp (if needed)
-    add <size>,sp
- 
     One day we might keep the stack pointer constant, that won't
     change the code for prologues, but it will make the frame
     pointerless case much more common.  */
--- 291,350 ----
  /* The main purpose of this file is dealing with prologues to extract
     information about stack frames and saved registers.
  
!    In gcc/config/mn13000/mn10300.c, the expand_prologue prologue
!    function is pretty readable, and has a nice explanation of how the
!    prologue is generated.  The prologues generated by that code will
!    have the following form:
! 
!    + If this is an old-style varargs function, then its arguments
!      need to be flushed back to the stack:
!      
!         mov d0,(4,sp)
!         mov d1,(4,sp)
! 
!    + If we use any of the callee-saved registers, save them now.
!      
!         movm [some callee-saved registers],(sp)
! 
!    + If we have any floating-point registers to save:
! 
!      - Decrement the stack pointer to reserve space for the registers.
!        If the function doesn't need a frame pointer, we may combine
!        this with the adjustment that reserves space for the frame.
! 
!         add -SIZE, sp
! 
!      - Save the floating-point registers.  We have two possible
!        strategies:
! 
!        . Save them at fixed offset from the SP:
! 
!         fmov fsN,(OFFSETN,sp)
!         fmov fsM,(OFFSETM,sp)
!         ...
! 
!        . Or, set a0 to the start of the save area, and then use
!        post-increment addressing to save the FP registers.
! 
!         mov sp, a0
!         add SIZE, a0
!         fmov fsN,(a0+)
!         fmov fsM,(a0+)
!         ...
! 
!    + If the function needs a frame pointer, we set it here.
! 
!         mov sp, a3
! 
!    + Now we reserve space for the stack frame proper.  This could be
!      merged into the `add -SIZE, sp' instruction for FP saves up
!      above, unless we needed to set the frame pointer in the previous
!      step, or the frame is so large that allocating the whole thing at
!      once would put the FP register save slots out of reach of the
!      addressing mode (128 bytes).
!       
!         add -SIZE, sp        
  
     One day we might keep the stack pointer constant, that won't
     change the code for prologues, but it will make the frame
     pointerless case much more common.  */
***************
*** 330,336 ****
     save instructions.
  
     MY_FRAME_IN_FP: The base of the current frame is in the
!    frame pointer register ($a2).
  
     NO_MORE_FRAMES: Set this if the current frame is "start" or
     if the first instruction looks like mov <imm>,sp.  This tells
--- 373,379 ----
     save instructions.
  
     MY_FRAME_IN_FP: The base of the current frame is in the
!    frame pointer register ($a3).
  
     NO_MORE_FRAMES: Set this if the current frame is "start" or
     if the first instruction looks like mov <imm>,sp.  This tells
***************
*** 416,423 ****
        return addr;
      }
  
!   /* First see if this insn sets the stack pointer; if so, it's something
!      we won't understand, so quit now.   */
    if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
      {
        if (fi)
--- 459,467 ----
        return addr;
      }
  
!   /* First see if this insn sets the stack pointer from a register; if
!      so, it's probably the initialization of the stack pointer in _start,
!      so mark this as the bottom-most frame.  */
    if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
      {
        if (fi)


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