Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@redhat.com>
To: Richard.Earnshaw@arm.com
Cc: Michael Snyder <msnyder@cygnus.com>,
	gdb-patches@sources.redhat.com, rearnsha@arm.com
Subject: Re: [RFA] arm_scan_prologue: accept strh and strb as well as str
Date: Wed, 08 May 2002 15:36:00 -0000	[thread overview]
Message-ID: <3CD9A561.D79A683D@redhat.com> (raw)
In-Reply-To: <200205081910.UAA08344@cam-mail2.cambridge.arm.com>

[-- Attachment #1: Type: text/plain, Size: 698 bytes --]

Richard Earnshaw wrote:
> 
> > [sorry for the empty reply]
> > OK -- I'd be glad to do that.  Could you possibly
> > provide me an example to work from?
> 
> Below.
> 
> >
> > arm_scan_prologue is easy, since it accepts prologue instructions
> > in any order, but arm_skip_prologue imposes an ordering on them.
> > I would REALLY like to merge these two functions.  In fact I started
> > to, but then got busy with other things.
> 
> Go for it...

OK, how do you like the attached?

Also, Andrew and I have been discussing whether the saved arg regs
should actually be added to the frame-saved-regs.  If we decide that
they should, may I have your pre-approval to make that change?

Thanks,
Michael

[-- Attachment #2: rearnsha.patch --]
[-- Type: text/plain, Size: 10280 bytes --]

2002-04-25  Michael Snyder  <msnyder@redhat.com>

	* arm-tdep.c (arm_scan_prologue): Accept strb r(0123),[r11,#-nn],
	strh r(0123),[r11,#-nn], str r(0123),[r11,#-nn], as well as
	strb r(0123),[sp,#nn], strh r(0123),[sp,#nn] and 
	str r(0123),[sp,#nn].
	(arm_skip_prologue): Ditto.  Also make disassembly 
	order-independent by placing it in a loop.

Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.57
diff -p -r1.57 arm-tdep.c
*** arm-tdep.c	1 May 2002 00:57:51 -0000	1.57
--- arm-tdep.c	8 May 2002 22:31:53 -0000
*************** arm_skip_prologue (CORE_ADDR pc)
*** 417,423 ****
  {
    unsigned long inst;
    CORE_ADDR skip_pc;
!   CORE_ADDR func_addr, func_end;
    char *func_name;
    struct symtab_and_line sal;
  
--- 417,423 ----
  {
    unsigned long inst;
    CORE_ADDR skip_pc;
!   CORE_ADDR func_addr, func_end = 0;
    char *func_name;
    struct symtab_and_line sal;
  
*************** arm_skip_prologue (CORE_ADDR pc)
*** 444,517 ****
  
    /* Can't find the prologue end in the symbol table, try it the hard way
       by disassembling the instructions.  */
-   skip_pc = pc;
-   inst = read_memory_integer (skip_pc, 4);
-   /* "mov ip, sp" is no longer a required part of the prologue.  */
-   if (inst == 0xe1a0c00d)			/* mov ip, sp */
-     {
-       skip_pc += 4;
-       inst = read_memory_integer (skip_pc, 4);
-     }
  
!   /* Some prologues begin with "str lr, [sp, #-4]!".  */
!   if (inst == 0xe52de004)			/* str lr, [sp, #-4]! */
!     {
!       skip_pc += 4;
!       inst = read_memory_integer (skip_pc, 4);
!     }
  
!   if ((inst & 0xfffffff0) == 0xe92d0000)	/* stmfd sp!,{a1,a2,a3,a4} */
      {
-       skip_pc += 4;
        inst = read_memory_integer (skip_pc, 4);
-     }
  
!   if ((inst & 0xfffff800) == 0xe92dd800)	/* stmfd sp!,{fp,ip,lr,pc} */
!     {
!       skip_pc += 4;
!       inst = read_memory_integer (skip_pc, 4);
!     }
  
!   /* Any insns after this point may float into the code, if it makes
!      for better instruction scheduling, so we skip them only if we
!      find them, but still consider the function to be frame-ful.  */
! 
!   /* We may have either one sfmfd instruction here, or several stfe
!      insns, depending on the version of floating point code we
!      support.  */
!   if ((inst & 0xffbf0fff) == 0xec2d0200)	/* sfmfd fn, <cnt>, [sp]! */
!     {
!       skip_pc += 4;
!       inst = read_memory_integer (skip_pc, 4);
!     }
!   else
!     {
!       while ((inst & 0xffff8fff) == 0xed6d0103)	/* stfe fn, [sp, #-12]! */
! 	{
! 	  skip_pc += 4;
! 	  inst = read_memory_integer (skip_pc, 4);
! 	}
!     }
  
!   if ((inst & 0xfffff000) == 0xe24cb000)	/* sub fp, ip, #nn */
!     {
!       skip_pc += 4;
!       inst = read_memory_integer (skip_pc, 4);
!     }
  
!   if ((inst & 0xfffff000) == 0xe24dd000)	/* sub sp, sp, #nn */
!     {
!       skip_pc += 4;
!       inst = read_memory_integer (skip_pc, 4);
!     }
  
!   while ((inst & 0xffffcfc0) == 0xe50b0000)	/* str r(0123), [r11, #-nn] */
!     {
!       skip_pc += 4;
!       inst = read_memory_integer (skip_pc, 4);
      }
  
!   return skip_pc;
  }
  
  /* *INDENT-OFF* */
--- 444,506 ----
  
    /* Can't find the prologue end in the symbol table, try it the hard way
       by disassembling the instructions.  */
  
!   /* Like arm_scan_prologue, stop no later than pc + 64. */
!   if (func_end == 0 || func_end > pc + 64)
!     func_end = pc + 64;
  
!   for (skip_pc = pc; skip_pc < func_end; skip_pc += 4)
      {
        inst = read_memory_integer (skip_pc, 4);
  
!       /* "mov ip, sp" is no longer a required part of the prologue.  */
!       if (inst == 0xe1a0c00d)			/* mov ip, sp */
! 	continue;
  
!       /* Some prologues begin with "str lr, [sp, #-4]!".  */
!       if (inst == 0xe52de004)			/* str lr, [sp, #-4]! */
! 	continue;
  
!       if ((inst & 0xfffffff0) == 0xe92d0000)	/* stmfd sp!,{a1,a2,a3,a4} */
! 	continue;
  
!       if ((inst & 0xfffff800) == 0xe92dd800)	/* stmfd sp!,{fp,ip,lr,pc} */
! 	continue;
  
!       /* Any insns after this point may float into the code, if it makes
! 	 for better instruction scheduling, so we skip them only if we
! 	 find them, but still consider the function to be frame-ful.  */
! 
!       /* We may have either one sfmfd instruction here, or several stfe
! 	 insns, depending on the version of floating point code we
! 	 support.  */
!       if ((inst & 0xffbf0fff) == 0xec2d0200)	/* sfmfd fn, <cnt>, [sp]! */
! 	continue;
! 
!       if ((inst & 0xffff8fff) == 0xed6d0103)	/* stfe fn, [sp, #-12]! */
! 	continue;
! 
!       if ((inst & 0xfffff000) == 0xe24cb000)	/* sub fp, ip, #nn */
! 	continue;
! 
!       if ((inst & 0xfffff000) == 0xe24dd000)	/* sub sp, sp, #nn */
! 	continue;
! 
!       if ((inst & 0xffffc000) == 0xe54b0000 ||	/* strb r(0123),[r11,#-nn] */
! 	  (inst & 0xffffc0f0) == 0xe14b00b0 ||	/* strh r(0123),[r11,#-nn] */
! 	  (inst & 0xffffc000) == 0xe50b0000)	/* str  r(0123),[r11,#-nn] */
! 	continue;
! 
!       if ((inst & 0xffffc000) == 0xe5cd0000 ||	/* strb r(0123),[sp,#nn] */
! 	  (inst & 0xffffc0f0) == 0xe1cd00b0 ||	/* strh r(0123),[sp,#nn] */
! 	  (inst & 0xffffc000) == 0xe58d0000)	/* str  r(0123),[sp,#nn] */
! 	continue;
! 
!       /* Un-recognized instruction; stop scanning.  */
!       break;
      }
  
!   return skip_pc;		/* End of prologue */
  }
  
  /* *INDENT-OFF* */
*************** thumb_scan_prologue (struct frame_info *
*** 597,603 ****
  	     whether to save LR (R14).  */
  	  mask = (insn & 0xff) | ((insn & 0x100) << 6);
  
! 	  /* Calculate offsets of saved R0-R7 and LR. */
  	  for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
  	    if (mask & (1 << regno))
  	      {
--- 586,592 ----
  	     whether to save LR (R14).  */
  	  mask = (insn & 0xff) | ((insn & 0x100) << 6);
  
! 	  /* Calculate offsets of saved R0-R7 and LR.  */
  	  for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
  	    if (mask & (1 << regno))
  	      {
*************** thumb_scan_prologue (struct frame_info *
*** 611,617 ****
        else if ((insn & 0xff00) == 0xb000)	/* add sp, #simm  OR  
  						   sub sp, #simm */
  	{
! 	  if ((findmask & 1) == 0)  		/* before push?  */
  	    continue;
  	  else
  	    findmask |= 4;			/* add/sub sp found */
--- 600,606 ----
        else if ((insn & 0xff00) == 0xb000)	/* add sp, #simm  OR  
  						   sub sp, #simm */
  	{
! 	  if ((findmask & 1) == 0)		/* before push?  */
  	    continue;
  	  else
  	    findmask |= 4;			/* add/sub sp found */
*************** arm_scan_prologue (struct frame_info *fi
*** 857,863 ****
       Be careful, however, and if it doesn't look like a prologue,
       don't try to scan it.  If, for instance, a frameless function
       begins with stmfd sp!, then we will tell ourselves there is
!      a frame, which will confuse stack traceback, as well ad"finish" 
       and other operations that rely on a knowledge of the stack
       traceback.
  
--- 846,852 ----
       Be careful, however, and if it doesn't look like a prologue,
       don't try to scan it.  If, for instance, a frameless function
       begins with stmfd sp!, then we will tell ourselves there is
!      a frame, which will confuse stack traceback, as well as "finish" 
       and other operations that rely on a knowledge of the stack
       traceback.
  
*************** arm_scan_prologue (struct frame_info *fi
*** 870,876 ****
       [Note further: The "mov ip,sp" only seems to be missing in
       frameless functions at optimization level "-O2" or above,
       in which case it is often (but not always) replaced by
!      "str lr, [sp, #-4]!".  - Michael Snyder, 2002-04-23]   */
  
    sp_offset = fp_offset = 0;
  
--- 859,865 ----
       [Note further: The "mov ip,sp" only seems to be missing in
       frameless functions at optimization level "-O2" or above,
       in which case it is often (but not always) replaced by
!      "str lr, [sp, #-4]!".  - Michael Snyder, 2002-04-23]  */
  
    sp_offset = fp_offset = 0;
  
*************** arm_scan_prologue (struct frame_info *fi
*** 904,910 ****
  		fi->saved_regs[regno] = sp_offset;
  	      }
  	}
!       else if ((insn & 0xffffcfc0) == 0xe50b0000)	/* str rx, [r11, -n] */
  	{
  	  /* No need to add this to saved_regs -- it's just an arg reg.  */
  	  continue;
--- 893,908 ----
  		fi->saved_regs[regno] = sp_offset;
  	      }
  	}
!       else if ((insn & 0xffffc000) == 0xe54b0000 ||	/* strb rx,[r11,#-n] */
! 	       (insn & 0xffffc0f0) == 0xe14b00b0 ||	/* strh rx,[r11,#-n] */
! 	       (insn & 0xffffc000) == 0xe50b0000)	/* str  rx,[r11,#-n] */
! 	{
! 	  /* No need to add this to saved_regs -- it's just an arg reg.  */
! 	  continue;
! 	}
!       else if ((insn & 0xffffc000) == 0xe5cd0000 ||	/* strb rx,[sp,#n] */
! 	       (insn & 0xffffc0f0) == 0xe1cd00b0 ||	/* strh rx,[sp,#n] */
! 	       (insn & 0xffffc000) == 0xe58d0000)	/* str  rx,[sp,#n] */
  	{
  	  /* No need to add this to saved_regs -- it's just an arg reg.  */
  	  continue;
*************** arm_scan_prologue (struct frame_info *fi
*** 960,966 ****
  	}
        else if ((insn & 0xf0000000) != 0xe0000000)
  	break;			/* Condition not true, exit early */
!       else if ((insn & 0xfe200000) == 0xe8200000) /* ldm? */
  	break;			/* Don't scan past a block load */
        else
  	/* The optimizer might shove anything into the prologue,
--- 958,964 ----
  	}
        else if ((insn & 0xf0000000) != 0xe0000000)
  	break;			/* Condition not true, exit early */
!       else if ((insn & 0xfe200000) == 0xe8200000)	/* ldm? */
  	break;			/* Don't scan past a block load */
        else
  	/* The optimizer might shove anything into the prologue,
*************** arm_get_next_pc (CORE_ADDR pc)
*** 2050,2056 ****
  static void
  arm_software_single_step (enum target_signal sig, int insert_bpt)
  {
!   static int next_pc;		/* State between setting and unsetting.  */
    static char break_mem[BREAKPOINT_MAX]; /* Temporary storage for mem@bpt */
  
    if (insert_bpt)
--- 2048,2054 ----
  static void
  arm_software_single_step (enum target_signal sig, int insert_bpt)
  {
!   static int next_pc;		 /* State between setting and unsetting.  */
    static char break_mem[BREAKPOINT_MAX]; /* Temporary storage for mem@bpt */
  
    if (insert_bpt)

  reply	other threads:[~2002-05-08 22:36 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-04-25 18:30 Michael Snyder
2002-05-08  8:02 ` Richard Earnshaw
2002-05-08 11:32   ` Michael Snyder
2002-05-08 11:33   ` Michael Snyder
2002-05-08 12:11     ` Richard Earnshaw
2002-05-08 15:36       ` Michael Snyder [this message]
2002-05-08 15:41         ` Michael Snyder
2002-05-09  2:20           ` Richard Earnshaw
2002-05-09 11:02             ` Michael Snyder
2002-05-09  2:18         ` Richard Earnshaw
2002-05-09 11:07           ` Michael Snyder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3CD9A561.D79A683D@redhat.com \
    --to=msnyder@redhat.com \
    --cc=Richard.Earnshaw@arm.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=msnyder@cygnus.com \
    --cc=rearnsha@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox