This is the mail archive of the gdb-prs@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]
Other format: [Raw text]

Re: breakpoints/1558: Hits breakpoint at main after function called from main


The following reply was made to PR breakpoints/1558; it has been noted by GNATS.

From: Fred Fish <fnf@ninemoons.com>
To: gdb-gnats@sources.redhat.com
Cc: fnf@redhat.com
Subject: Re: breakpoints/1558: Hits breakpoint at main after function called from main
Date: Thu, 19 Feb 2004 16:30:26 -0700

 Here is a patch that fixes the problem.  It's been checked into
 the gdb main source tree.
 
 Reviewed and approved by ezannoni@redhat.com.
 
 Index: ChangeLog
 ===================================================================
 RCS file: /cvs/src/src/gdb/ChangeLog,v
 retrieving revision 1.5416
 diff -c -p -r1.5416 ChangeLog
 *** ChangeLog	19 Feb 2004 19:01:24 -0000	1.5416
 --- ChangeLog	19 Feb 2004 22:49:39 -0000
 ***************
 *** 1,3 ****
 --- 1,9 ----
 + 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.
 + 
   2004-02-19  Joel Brobecker  <brobecker@gnat.com>
   
   	Committed by Elena Zannoni  <ezannoni@redhat.com>
 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
 Index: testsuite/ChangeLog
 ===================================================================
 RCS file: /cvs/src/src/gdb/testsuite/ChangeLog,v
 retrieving revision 1.805
 diff -c -p -r1.805 ChangeLog
 *** testsuite/ChangeLog	19 Feb 2004 16:43:19 -0000	1.805
 --- testsuite/ChangeLog	19 Feb 2004 22:49:44 -0000
 ***************
 *** 1,3 ****
 --- 1,9 ----
 + 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.
 + 
   2004-02-19  Elena Zannoni  <ezannoni@redhat.com>
   
   	* gdb.base/nodebug.exp: Fix typo.
 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)"
 +     }
 + }
 
 


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