[RFA] Handle sh-elf-gcc scheduling code into a prologue when no debug info present

Fred Fish fnf@ninemoons.com
Thu Feb 19 23:10:00 GMT 2004


On Monday 16 February 2004 11:14, Fred Fish wrote:
> I'll post an updated patch when I have a test ready to go with it, and
> then check them in.

Committed.

Here is the pair of patches, one to the testsuite and one to the main
gdb directory.

-Fred

############################################################################

2004-02-19  Fred Fish  <fnf@redhat.com>

	New testcase for PR breakpoint/1558.
	* gdb.arch/gdb1558.exp: New file.
	* gdb.arch/gdb1558.c: New file.

Index: testsuite/gdb.arch/gdb1558.c
===================================================================
RCS file: testsuite/gdb.arch/gdb1558.c
diff -N testsuite/gdb.arch/gdb1558.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gdb.arch/gdb1558.c	19 Feb 2004 22:49:44 -0000
***************
*** 0 ****
--- 1,36 ----
+ /* Copyright 2004 Free Software Foundation, Inc.
+  
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+  
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+  
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+  
+    Please email any bugs, comments, and/or additions to this file to:
+    bug-gdb@gnu.org
+  
+    This file is part of the gdb testsuite.  */
+ 
+ sub1 ()
+ {
+   printf ("In sub1\n");
+ }
+   
+ sub2 ()
+ {
+   printf ("In sub2\n");
+ }
+   
+ main ()
+ {
+   sub1 ();
+   sub2 ();
+ }
Index: testsuite/gdb.arch/gdb1558.exp
===================================================================
RCS file: testsuite/gdb.arch/gdb1558.exp
diff -N testsuite/gdb.arch/gdb1558.exp
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gdb.arch/gdb1558.exp	19 Feb 2004 22:49:44 -0000
***************
*** 0 ****
--- 1,72 ----
+ # Copyright 2004 Free Software Foundation, Inc.
+ 
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, write to the Free Software
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+ 
+ # Please email any bugs, comments, and/or additions to this file to:
+ # bug-gdb@gnu.org
+ 
+ # This file is part of the gdb testsuite.
+ 
+ # Tests for PR:1558.  Hits breakpoint at main after function called
+ # from main.
+ 
+ if $tracelevel {
+     strace $tracelevel
+ }
+ 
+ set prms_id 0
+ set bug_id 0
+ 
+ if ![istarget "sh-*-*"] then {
+     verbose "Skipping SH breakpoint test."
+     return
+ }
+ 
+ set testfile "gdb1558"
+ set srcfile ${testfile}.c
+ set binfile ${objdir}/${subdir}/${testfile}
+ # Note we have to compile WITH optimization and WITHOUT debugging information to expose the bug.
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {"additional_flags=-O2"}] != "" } {
+     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+ }
+ 
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+ 
+ gdb_test "b main" "Breakpoint 1.*" "set breakpoint at main"
+ gdb_test "b sub1" "Breakpoint 2.*" "set breakpoint at sub1"
+ gdb_test "b sub2" "Breakpoint 3.*" "set breakpoint at sub2"
+ 
+ # We can't use "runto_main" because that is exactly the problem
+ # we are trying to detect, stopping somewhere before main.
+ 
+ gdb_run_cmd
+ 
+ gdb_expect 30 {
+     -re "Breakpoint 1.*main .*$gdb_prompt $" {
+ 	pass "Hits breakpoint at main after function called from main"
+     }
+     -re "Breakpoint 2.*sub1 .*$gdb_prompt $" {
+ 	kfail "gdb/1558" "Hits breakpoint at main after function called from main"
+     }
+     -re "$gdb_prompt $" { 
+ 	fail "Hits breakpoint at main after function called from main"
+     }
+     timeout { 
+ 	fail "Hits breakpoint at main after function called from main (timeout)"
+     }
+ }

############################################################################

2004-02-19  Fred Fish  <fnf@redhat.com>

	Fix for PR breakpoint/1558.
	* sh-tdep.c (IS_JSR): New macro.
	(sh_analyze_prologue): Use IS_JSR to terminate prologue scan.

Index: sh-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sh-tdep.c,v
retrieving revision 1.163
diff -c -p -r1.163 sh-tdep.c
*** sh-tdep.c	17 Feb 2004 16:04:19 -0000	1.163
--- sh-tdep.c	19 Feb 2004 22:49:39 -0000
*************** sh_breakpoint_from_pc (CORE_ADDR *pcptr,
*** 311,316 ****
--- 311,319 ----
  #define GET_SOURCE_REG(x)  	(((x) >> 4) & 0xf)
  #define GET_TARGET_REG(x)  	(((x) >> 8) & 0xf)
  
+ /* JSR @Rm         0100mmmm00001011 */
+ #define IS_JSR(x)		(((x) & 0xf0ff) == 0x400b)
+ 
  /* STS.L PR,@-r15  0100111100100010
     r15-4-->r15, PR-->(r15) */
  #define IS_STS(x)  		((x) == 0x4f22)
*************** sh_analyze_prologue (CORE_ADDR pc, CORE_
*** 508,513 ****
--- 511,530 ----
  	      else
  		break;
  	    }
+ 	  break;
+ 	}
+       else if (IS_JSR (inst))
+ 	{
+ 	  /* We have found a jsr that has been scheduled into the prologue.
+ 	     If we continue the scan and return a pc someplace after this,
+ 	     then setting a breakpoint on this function will cause it to
+ 	     appear to be called after the function it is calling via the
+ 	     jsr, which will be very confusing.  Most likely the next
+ 	     instruction is going to be IS_MOV_SP_FP in the delay slot.  If
+ 	     so, note that before returning the current pc. */
+ 	  inst = read_memory_integer (pc + 2, 2);
+ 	  if (IS_MOV_SP_FP (inst))
+ 	    cache->uses_fp = 1;
  	  break;
  	}
  #if 0				/* This used to just stop when it found an instruction that

############################################################################




More information about the Gdb-patches mailing list