[GCC,PR55056] Re: [RFC patch] testsuite: Workaround issues with GCC 4.8.0pre + gdb.trace new KFAIL
Commit Message
[- 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
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
@@ -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);
@@ -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
}
@@ -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;
@@ -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
}
@@ -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;
@@ -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"