This is the mail archive of the gdb-patches@sourceware.org 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: [RFA/commit] ia64: incorrect breakpoint save/restore with L-type instruction at slot 1


On Tue, 29 Sep 2009 02:16:41 +0200, Joel Brobecker wrote:
> So I checked it in both HEAD and branch (I want to add some comments
> as discussed on IRC).

Yes, I agree, thanks for all the work.


> However, even if the logical way of storing the new value for our long
> is to use an L+X instruction on ia64, I am wondering if we wouldn't be
> better off building our executable from assembly instead of from source,

Yes, I agree the file gdb.base/breakpoint-shadow.exp now became the same as
its former ia64-less revision 1.1.


> If we go for the gdb.arch approach, we can then remove the who section
> specific to ia64 from breakpoint-shadow.exp.

Done.


OK to check-in?  Even on branch?


Thanks,
Jan


gdb/testsuite/
2009-09-29  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/breakpoint-shadow.exp: Move the ia64 part into ...
	* gdb.arch/ia64-breakpoint-shadow.exp, ... a new file, with new tests.
	* gdb.arch/ia64-breakpoint-shadow.S: New file.

--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gdb/testsuite/gdb.arch/ia64-breakpoint-shadow.S	29 Sep 2009 18:50:29 -0000
@@ -0,0 +1,44 @@
+/* Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+   This file is part of the gdb testsuite.
+   It tests displaced stepping over various insns that require special
+   handling.  */
+
+	.text
+	.align 16
+	.global main
+	.proc main
+main:
+	mov r2=r12
+	mov r14=1
+	;;
+bundle:
+	/* Store value 1 into `long' variable on stack.  */
+	st8.rel [r2]=r14
+	/* This long constant requires L-X slot in this bundle.  */
+	movl r14=0x7fffffff
+	;;
+	/* Store value 0x7fffffff into `long' variable on stack.  */
+	st8.rel [r2]=r14
+	mov r14=r0
+	;;
+	mov r8=r14
+	mov r12=r2
+	br.ret.sptk.many b0
+
+	.endp main
+
+	.section	.note.GNU-stack,"",@progbits
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gdb/testsuite/gdb.arch/ia64-breakpoint-shadow.exp	29 Sep 2009 18:50:29 -0000
@@ -0,0 +1,80 @@
+# Copyright 2009 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 3 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, see <http://www.gnu.org/licenses/>.
+
+if ![istarget "ia64-*-*"] {
+    verbose "Skipping ia64-breakpoint-shadow test."
+    return
+}
+
+set testfile ia64-breakpoint-shadow
+set srcfile ${testfile}.S
+set binfile ${objdir}/${subdir}/${testfile}
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+    untested "Couldn't compile test program"
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# We need to start the inferior to place the breakpoints in the memory at all.
+if ![runto_main] {
+    untested start
+    return -1
+}
+
+# The default "auto" mode removes all the breakpoints when we stop (and not
+# running the nonstop mode).  We would not be able to test the shadow.
+gdb_test "set breakpoint always-inserted on"
+gdb_test "show breakpoint always-inserted" "Always inserted breakpoint mode is on."
+
+set match "\nDump of assembler code for function main:\r\n(.*)End of assembler dump.\r\n$gdb_prompt $"
+
+set test "disassembly without breakpoints"
+gdb_test_multiple "disass main" $test {
+    -re $match {
+    	set orig $expect_out(1,string)
+	pass $test
+    }
+}
+
+set test "slot 0 breakpoint placed"
+gdb_test_multiple "b bundle" $test {
+    -re "Breakpoint \[0-9\] at (0x\[0-9a-f\]*0):.*$gdb_prompt $" {
+	pass $test
+	set bpt2address $expect_out(1,string)
+    }
+}
+
+if ![info exists bpt2address] {
+    return -1
+}
+
+gdb_test "b *($bpt2address + 1)" "Breakpoint \[0-9\] at .*" "slot 1 breakpoint placed"
+gdb_test "b *($bpt2address + 2)" "Can't insert breakpoint for non-existing slot X" "slot 2 (slot X) breakpoint refusal"
+
+set test "disassembly with breakpoints"
+gdb_test_multiple "disass main" $test {
+    -re $match {
+    	set got $expect_out(1,string)
+	if [string equal -nocase $orig $got] {
+	    pass $test
+	} else {
+	    fail $test
+	}
+    }
+}
--- gdb/testsuite/gdb.base/breakpoint-shadow.exp	10 Sep 2009 22:26:51 -0000	1.4
+++ gdb/testsuite/gdb.base/breakpoint-shadow.exp	29 Sep 2009 18:50:29 -0000
@@ -48,29 +48,7 @@ gdb_test_multiple "disass main" $test {
 }
 
 gdb_test "b [gdb_get_line_number "break-first"]" "Breakpoint \[0-9\] at .*" "First breakpoint placed"
-set test "Second breakpoint placed"
-gdb_test_multiple "b [gdb_get_line_number "break-second"]" $test {
-    -re "Breakpoint \[0-9\] at (0x\[0-9a-f\]*):.*$gdb_prompt $" {
-	pass $test
-	set bpt2address $expect_out(1,string)
-    }
-}
-
-if [istarget "ia64-*-*"] then {
-    # Unoptimized code should not use the 3rd slot for the first instruction of
-    # a source line.  This is important for our test, because we want both
-    # breakpoints ("Second breakpoint" and the following one) to be in the same
-    # bundle.
-
-    set test "Second breakpoint address is valid on ia64"
-    if [string match "*\[01\]" $bpt2address] {
-	pass $test
-
-	gdb_test "b *($bpt2address + 1)" "Breakpoint \[0-9\] at .*" "Third breakpoint on ia64 in the Second breakpoint's bundle"
-    } else {
-	unresolved $test
-    }
-}
+gdb_test "b [gdb_get_line_number "break-second"]" "Breakpoint \[0-9\] at .*" "Second breakpoint placed"
 
 set test "disassembly with breakpoints"
 gdb_test_multiple "disass main" $test {


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