[GCC,PR55056] Re: [RFC patch] testsuite: Workaround issues with GCC 4.8.0pre + gdb.trace new KFAIL

Message ID 21519.28248.577451.227482@ruffy2.mtv.corp.google.com
State New, archived
Headers

Commit Message

Doug Evans Sept. 9, 2014, 9:17 p.m. UTC
  [- gcc]

Jan Kratochvil writes:
 > On Fri, 14 Jun 2013 15:02:47 +0200, Thomas Schwinge wrote:
 > > On Sun, 3 Feb 2013 18:27:21 +0100, Jan Kratochvil <jan.kratochvil@redhat.com> wrote:
 > > > gdb/testsuite/
 > > > 2013-02-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
 > > > 
 > > > 	Workaround GCC PR debug/55056 and GDB PR server/15081.
 > > > 	* gdb.base/restore.c (caller3): Protect l1 by GCC_PR_55056 #ifdef.
 > > > 	(caller4): Protect l1 and l2 by GCC_PR_55056 #ifdef.
 > > > 	(caller5): Protect l1, l2 and l3 by GCC_PR_55056 #ifdef.
 > > > 	* gdb.base/restore.exp: New variable opts.  Test caller3, caller4 and
 > > > 	caller5 for l1, l2 and l3.  New prepare_for_testing.
 > > > 	* gdb.base/store.c (wack_longest, wack_float, wack_double)
 > > > 	(wack_doublest): Protect l and r by GCC_PR_55056 #ifdef.
 > > > 	* gdb.base/store.exp: New variable opts.  Test longest, float, double
 > > > 	and doublest functions for l and r.  New prepare_for_testing.
 > > > 	* gdb.trace/collection.c (reglocal_test_func): Protect locf and locd by
 > > > 	GCC_PR_55056 #ifdef.  Protect locar by GDB_PR_15081 #ifdef.
 > > > 	* gdb.trace/unavailable.c: Likewise.
 > > > 	* gdb.trace/collection.exp: New variable opts.  Test reglocal_test_func
 > > > 	for locf, locd and locar.  New prepare_for_testing.
 > > > 	(gdb_collect_locals_test): Increase list size to 43.
 > > > 	* gdb.trace/unavailable.exp: Likewise.
 > > 
 > > As far as I can tell, no consensus has yet been reached about the
 > > approach to fix this issue discussed in this thread.  (I have not looked
 > > at the proposed patch in detail.)
 > 
 > I have found now I posted the testsuite workaround for GDB
 > 	http://sourceware.org/ml/gdb-patches/2013-01/msg00688.html
 > but it has never been checked-in (neither in Fedora) which explains why you
 > see PASS->FAIL (which I also see on Fedora 19).

Hi.

The patch kinda died at this point.
Have you thought of how you might do it differently now?
If not, any objections to committing it?

[rebased on top of current head]

gdb/testsuite/
2013-01-26  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Workaround GCC PR debug/55056 and GDB PR server/15081.
	* gdb.base/restore.c (caller3): Protect l1 by GCC_PR_55056 #ifdef.
	(caller4): Protect l1 and l2 by GCC_PR_55056 #ifdef.
	(caller5): Protect l1, l2 and l3 by GCC_PR_55056 #ifdef.
	* gdb.base/restore.exp: New variable opts.  Test caller3, caller4 and
	caller5 for l1, l2 and l3.  New prepare_for_testing.
	* gdb.base/store.c (wack_longest, wack_float, wack_double)
	(wack_doublest): Protect l and r by GCC_PR_55056 #ifdef.
	* gdb.base/store.exp: New variable opts.  Test longest, float, double
	and doublest functions for l and r.  New prepare_for_testing.
	* gdb.trace/collection.c (reglocal_test_func): Protect locf and locd by
	GCC_PR_55056 #ifdef.  Protect locar by GDB_PR_15081 #ifdef.
	* gdb.trace/collection.exp: New variable opts.  Test reglocal_test_func
	for locf, locd and locar.  New prepare_for_testing.
	(gdb_collect_locals_test): Increase list size to 43.
  

Comments

Jan Kratochvil Sept. 10, 2014, 8:06 p.m. UTC | #1
On Tue, 09 Sep 2014 23:17:12 +0200, Doug Evans wrote:
> Have you thought of how you might do it differently now?

gcc-4.4.7-4.el6.x86_64 at least for restore.exp produces with line 75:
	gdb_test "info addr l$var"
only patterns:
	Symbol "l\d+" is a variable in $r\d+.

While gcc-4.9.1-7.fc21.x86_64 with the patch of mine we discuss here produces
in half the cases:
	Symbol "l1" is a complex DWARF expression: 0: DW_OP_fbreg -44
And therefore the testcase no longer really tests the GDB feature.

Therefore proposing to make it x86_64 arch specific testcase with
gcc-4.4.7-4.el6.x86_64-precompiled .S file.

For the test I tried only restore.exp now, I will check more the others.

Another possibility would be to make the testcase -Og compatible as GCC
hackers in
	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55056
say that the variables then should not be <optimized out>.
I have tested that with -Og the testcase currently FAILs already on various
line-matching issues.  But I find the arch-specific .S file safer.


Jan
  

Patch

diff --git a/gdb/testsuite/gdb.base/restore.c b/gdb/testsuite/gdb.base/restore.c
index 2ef0d36..70682da 100644
--- a/gdb/testsuite/gdb.base/restore.c
+++ b/gdb/testsuite/gdb.base/restore.c
@@ -205,6 +205,10 @@  caller2 (void)
 int
 caller3 (void)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register int l1 = increment (0x7eeb);  /* caller3 prologue */
   register int l2 = increment (l1);
   register int l3 = increment (l2);
@@ -221,7 +225,15 @@  caller3 (void)
 int
 caller4 (void)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register int l1 = increment (0x7eeb);  /* caller4 prologue */
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register int l2 = increment (l1);
   register int l3 = increment (l2);
   register int l4 = increment (l3);
@@ -238,8 +250,20 @@  caller4 (void)
 int
 caller5 (void)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register int l1 = increment (0x7eeb);  /* caller5 prologue */
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register int l2 = increment (l1);
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register int l3 = increment (l2);
   register int l4 = increment (l3);
   register int l5 = increment (l4);
diff --git a/gdb/testsuite/gdb.base/restore.exp b/gdb/testsuite/gdb.base/restore.exp
index 9bba535..65ef4b9 100644
--- a/gdb/testsuite/gdb.base/restore.exp
+++ b/gdb/testsuite/gdb.base/restore.exp
@@ -24,7 +24,37 @@ 
 standard_testfile
 set executable $testfile
 
-if { [prepare_for_testing $testfile.exp $executable $srcfile] } {
+set opts {debug}
+
+if { [prepare_for_testing $testfile.exp $executable $srcfile $opts] } {
+    return -1
+}
+
+if {![runto_main]} {
+    return -1
+}
+
+foreach caller { caller3 caller4 caller5 } { with_test_prefix $caller {
+    gdb_breakpoint $caller
+    gdb_continue_to_breakpoint $caller
+
+    foreach l { l1 l2 l3 } { with_test_prefix $l {
+	set test "info addr $l"
+	gdb_test_multiple $test $test {
+	    -re "\r\nSymbol \"$l\" is optimized out\\.\r\n$gdb_prompt $" {
+		lappend opts additional_flags=-DGCC_PR_55056
+		xfail "$test (register variable has no location)"
+	    }
+	    -re "\r\nSymbol \"$l\" is .*\r\n$gdb_prompt $" {
+		pass $test
+	    }
+	}
+    }}
+}}
+
+set executable ${testfile}opts
+
+if { [prepare_for_testing $testfile.exp $executable $srcfile $opts] } {
     return -1
 }
 
diff --git a/gdb/testsuite/gdb.base/store.c b/gdb/testsuite/gdb.base/store.c
index 545515d..3ac4a1a 100644
--- a/gdb/testsuite/gdb.base/store.c
+++ b/gdb/testsuite/gdb.base/store.c
@@ -98,6 +98,10 @@  wack_long (register long u, register long v)
 long
 wack_longest (register longest u, register longest v)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register longest l = u, r = v;
   l = add_longest (l, r);
   return l + r;
@@ -106,6 +110,10 @@  wack_longest (register longest u, register longest v)
 float
 wack_float (register float u, register float v)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register float l = u, r = v;
   l = add_float (l, r);
   return l + r;
@@ -114,6 +122,10 @@  wack_float (register float u, register float v)
 double
 wack_double (register double u, register double v)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register double l = u, r = v;
   l = add_double (l, r);
   return l + r;
@@ -122,6 +134,10 @@  wack_double (register double u, register double v)
 doublest
 wack_doublest (register doublest u, register doublest v)
 {
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register doublest l = u, r = v;
   l = add_doublest (l, r);
   return l + r;
diff --git a/gdb/testsuite/gdb.base/store.exp b/gdb/testsuite/gdb.base/store.exp
index f0fab90..f235bd2 100644
--- a/gdb/testsuite/gdb.base/store.exp
+++ b/gdb/testsuite/gdb.base/store.exp
@@ -18,7 +18,37 @@ 
 standard_testfile
 set executable $testfile
 
-if { [prepare_for_testing $testfile.exp $executable $srcfile] } {
+set opts {debug}
+
+if { [prepare_for_testing $testfile.exp $executable $srcfile $opts] } {
+    return -1
+}
+
+if {![runto_main]} {
+    return -1
+}
+
+foreach func { longest float double doublest } { with_test_prefix $func {
+    gdb_breakpoint wack_$func
+    gdb_continue_to_breakpoint wack_$func
+
+    foreach var { l r } { with_test_prefix $var {
+	set test "info addr $var"
+	gdb_test_multiple $test $test {
+	    -re "\r\nSymbol \"$var\" is optimized out\\.\r\n$gdb_prompt $" {
+		lappend opts additional_flags=-DGCC_PR_55056
+		xfail "$test (register variable has no location)"
+	    }
+	    -re "\r\nSymbol \"$var\" is .*\r\n$gdb_prompt $" {
+		pass $test
+	    }
+	}
+    }}
+}}
+
+set executable ${testfile}opts
+
+if { [prepare_for_testing $testfile.exp $executable $srcfile $opts] } {
     return -1
 }
 
diff --git a/gdb/testsuite/gdb.trace/collection.c b/gdb/testsuite/gdb.trace/collection.c
index a568c37..9dcadae 100644
--- a/gdb/testsuite/gdb.trace/collection.c
+++ b/gdb/testsuite/gdb.trace/collection.c
@@ -141,10 +141,23 @@  int reglocal_test_func ()		/* test collecting register locals */
 {
   register char        locc = 11;
   register int         loci = 12;
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register float       locf = 13.3;
+  /* volatile is a GCC PR debug/55056 workaround.  */
+#ifdef GCC_PR_55056
+  volatile
+#endif
   register double      locd = 14.4;
   register test_struct locst;
-  register int         locar[4];
+  /* The "register" removal is a GDB PR server/15081 workaround as it cannot
+     handle DW_OP_piece variables occupying more than 64 bits on gcc-4.8.0.  */
+#ifndef GDB_PR_15081
+  register
+#endif
+  int                  locar[4];
   int                  i;
 
   locst.memberc  = 15;
diff --git a/gdb/testsuite/gdb.trace/collection.exp b/gdb/testsuite/gdb.trace/collection.exp
index e0763d9..4fca436 100644
--- a/gdb/testsuite/gdb.trace/collection.exp
+++ b/gdb/testsuite/gdb.trace/collection.exp
@@ -19,7 +19,43 @@  load_lib "trace-support.exp"
 standard_testfile
 set executable $testfile
 
-if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug nowarnings}]} {
+set opts {debug nowarnings}
+
+if {[prepare_for_testing $testfile.exp $executable $srcfile $opts]} {
+    return -1
+}
+
+if {![runto reglocal_test_func]} {
+    return -1
+}
+
+foreach var { locf locd } { with_test_prefix $var {
+    set test "info addr $var"
+    gdb_test_multiple $test $test {
+	-re "\r\nSymbol \"$var\" is optimized out\\.\r\n$gdb_prompt $" {
+	    lappend opts additional_flags=-DGCC_PR_55056
+	    xfail "$test (register variable has no location)"
+	}
+	-re "\r\nSymbol \"$var\" is .*\r\n$gdb_prompt $" {
+	    pass $test
+	}
+    }
+}}
+
+set test "info addr locar"
+gdb_test_multiple $test $test {
+    -re "\r\nSymbol \"locar\" is a variable \[^\r\n\]*\\\[8-byte piece\\\]\[^\r\n\]*\\\[8-byte piece\\\]\[^\r\n\]*\\.\r\n$gdb_prompt $" {
+	lappend opts additional_flags=-DGDB_PR_15081
+	kfail gdb/15081 "$test (GDB cannot handle >64-bit trace data))"
+    }
+    -re "\r\nSymbol \"locar\" is .*\r\n$gdb_prompt $" {
+	pass $test
+    }
+}
+
+set executable ${testfile}opts
+
+if {[prepare_for_testing $testfile.exp $executable $srcfile $opts]} {
     return -1
 }
 
@@ -300,7 +336,7 @@  proc gdb_collect_locals_test { func mylocs msg } {
 
     # Find the comment-identified line for setting this tracepoint.
     set testline 0
-    gdb_test_multiple "list $func, +30" "collect $msg: find tracepoint line" {
+    gdb_test_multiple "list $func, +43" "collect $msg: find tracepoint line" {
 	-re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" {
 	    set testline $expect_out(1,string)
 	    pass "collect $msg: find tracepoint line"