Avoid timeouts in gdb.compile
authorTom Tromey <tromey@adacore.com>
Wed, 30 Nov 2022 18:27:10 +0000 (11:27 -0700)
committerTom Tromey <tromey@adacore.com>
Thu, 1 Dec 2022 15:28:20 +0000 (08:28 -0700)
PR compile/29541 points out that some of the C++ tests in gdb.compile
will time out when the glibc debuginfo is installed.  This was
interfering with my hacking on gdb by making test runs extremely long,
so I looked into it.

Internally the bug seems to be that gdb tries to convert multiple
symbols named "var" via the compiler interface; one such symbol (I
didn't track it down too far) causes the C++ compiler plugin to crash.

Unfortunately, the crash is reported as a timeout, as the gdb side of
the plugin simply hangs.  This seems like a bug in the plugin RPC
mechanism and, worse, apparently when I wrote this stuff I didn't
really consider error reporting very much at all, so gdb can't really
detect failures in the first place.

Anyway... this patch works around the timeout by compiling a simple
test that should provoke this bug, and then using "untested" if it
notices a GCC crash.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29541

17 files changed:
gdb/testsuite/gdb.compile/compile-cplus-anonymous.exp
gdb/testsuite/gdb.compile/compile-cplus-array-decay.exp
gdb/testsuite/gdb.compile/compile-cplus-inherit.exp
gdb/testsuite/gdb.compile/compile-cplus-member.exp
gdb/testsuite/gdb.compile/compile-cplus-method.exp
gdb/testsuite/gdb.compile/compile-cplus-namespace.exp
gdb/testsuite/gdb.compile/compile-cplus-nested.exp
gdb/testsuite/gdb.compile/compile-cplus-print.exp
gdb/testsuite/gdb.compile/compile-cplus-virtual.exp
gdb/testsuite/gdb.compile/compile-cplus.exp
gdb/testsuite/gdb.compile/compile-ifunc.exp
gdb/testsuite/gdb.compile/compile-ops.exp
gdb/testsuite/gdb.compile/compile-print.exp
gdb/testsuite/gdb.compile/compile-setjmp.exp
gdb/testsuite/gdb.compile/compile-tls.exp
gdb/testsuite/gdb.compile/compile.exp
gdb/testsuite/lib/compile-support.exp

index 26a331a2ac8015380b2946ad5b7bbad5cf0db0c1..c3ffeeb93fd281fdfad8feae84614a8d19a1dce3 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 # Reminder, "var" is an integer; all these types get converted to `int'.
 CompileExpression::new "var"
 CompileExpression::test "anon_e" {(3|GHI)}
index 18062a31b9c1f338c5415f01efba70c09121ad5e..2892d2415beaca13f7b0d568c23cb5c5f0149209 100644 (file)
@@ -33,9 +33,7 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index 8f3d282cd49bb16f1612da1e3ebc080e44782635..536a5a45fc22fa095eb6dc27282be5f4c546afa9 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 CompileExpression::new "var"
 CompileExpression::test "d.a_" 1
 CompileExpression::test "d.b_" 2
index 9325863a3bb09a0ffca116253a8b6fd3ca06962a..c18f965c9f33d259a9b80eb4232528f5d5636c6b 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 CompileExpression::new "var"
 CompileExpression::test "a.public_" 1
 CompileExpression::test "a.protected_" {(21|N::NB)}
index 07e4a59bb360bb505a5dfcdcfbecd75dd198c707..2f96f5fb147929000aa56019c5601a4e45c844e2 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 CompileExpression::new "var"
 CompileExpression::test "a->get_var ()" 21
 CompileExpression::test "a->get_var (static_cast<unsigned long> (1))" 100
index 4fc626beb220d8df673fecac7b3d1a893ebcbca1..ec4d009984685965de66b6318982d500774f8e95 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 CompileExpression::new "var"
 CompileExpression::test "N1::N2::N3::N4::n4static" 400
 CompileExpression::test "N1::N2::N3::N4::S4::s4static" 40
index 1d28e3471cbd4e44bb67d4dc1acc4c6d867c4cfb..a5ad87e49f933b2c1a7198e9fb6bf1a612ab36cd 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 CompileExpression::new "var"
 CompileExpression::test "i1.a_" 2
 CompileExpression::test "i2.a_" 3
index 67b39518b74f2da15797f3642ad735b4212fb298..38dd922d27e390554de535921dcecbd81731f5af 100644 (file)
@@ -36,8 +36,7 @@ if ![runto_main] {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index ee1a4d92e38a8d09c8381410f12ef02465d5b3a6..3ccd681ea4668886cddeb1d015a6307ef2287c75 100644 (file)
@@ -33,15 +33,13 @@ if {![runto_main]} {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested \
-       "compile command not supported (could not find libcc1 shared library?)"
-    return -1
-}
-
 gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
 gdb_continue_to_breakpoint "testing location"
 
+if {[skip_compile_feature_untested "var = 0"]} {
+    return -1
+}
+
 CompileExpression::new "var"
 CompileExpression::test "b.doit ()" 2
 CompileExpression::test "c.doit ()" 3
index dbdae5f8bf4b906a80f29e0f818a31b23b367ce9..10e70e4a8e6262ab8f3617c2d01dd6473e2cc977 100644 (file)
@@ -52,8 +52,10 @@ if ![runto_main] {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+gdb_breakpoint [gdb_get_line_number "break-here"]
+gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+
+if {[skip_compile_feature_untested "var = 0"]} {
     return -1
 }
 
@@ -132,9 +134,6 @@ gdb_test "compile code *(volatile int *) 0 = 0;" \
     "The program being debugged was signaled while in a function called from GDB\\.\r\nGDB has restored the context to what it was before the call\\.\r\n.*" \
     "compile code segfault second"
 
-gdb_breakpoint [gdb_get_line_number "break-here"]
-gdb_continue_to_breakpoint "break-here" ".* break-here .*"
-
 # C++ Specific tests.
 ## Public methods and members
 
index 07de52c3f671ce2f0cff1d95410f81d3ddbf15c1..5c51dd173c5e9ce66193c66b04f9b7ffe5a021af 100644 (file)
@@ -43,8 +43,7 @@ with_test_prefix "nodebug" {
     # feature check below will work.
     gdb_test_no_output "set language c" ""
 
-    if {[skip_compile_feature_tests]} {
-       untested "compile command not supported (could not find libcc1 shared library?)"
+    if {[skip_compile_feature_untested]} {
        return -1
     }
 
index cff2f946c93ab368ceb968a68132a8ff8c8eab71..e18f92eaa39b04fc927170ab7564b8cc1ae13379 100644 (file)
@@ -418,8 +418,7 @@ if ![runto func] {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index 5d01c1a53d08d3620a2a809d929884d72546a353..61d13312e3ab5a6d261a5b4c38d75c701aa6b613 100644 (file)
@@ -25,8 +25,7 @@ if ![runto_main] {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index c883b2bd5703402b2840880d889d578faf3c4103..2f9d844c89b4500e31ce84462df34bf6ba78fcfb 100644 (file)
@@ -25,8 +25,7 @@ if ![runto_main] {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index beffe7fd5bebfdcd5b62dc3f9d0dbf95f1e64228..6b349069ec7208ce6662ef58156d01d552493399 100644 (file)
@@ -27,8 +27,7 @@ if {![runto_main]} {
    return 0
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index c712070872aa3e85fb38fb542d090a7204ca94b8..b75ec4bd485aab6f37179e3dda0624f8f5ab1344 100644 (file)
@@ -57,8 +57,7 @@ if ![runto_main] {
     return -1
 }
 
-if {[skip_compile_feature_tests]} {
-    untested "compile command not supported (could not find libcc1 shared library?)"
+if {[skip_compile_feature_untested]} {
     return -1
 }
 
index 16b7c5dbc0dee5db80e038ef01b7ac37bc8aa2ef..b6427337c5b0c55bfc05557b520cbe144997e0f9 100644 (file)
 
 # Generic/oft used support routines for testing GDB's compile feature.
 
-# Return 1 if we should skip tests of the "compile" feature.
-# This must be invoked after the inferior has been started.
+# Helper function for skip_compile_feature_tests.  This does the real
+# work, but should not be called directly.  Returns a failure reason
+# (a string) on failure, or the empty string on success.
 
-proc skip_compile_feature_tests {} {
+proc _do_check_compile {expr} {
     global gdb_prompt
 
-    set result 0
-    gdb_test_multiple "compile code -- ;" "check for working compile command" {
+    set result ""
+    gdb_test_multiple "compile code -- $expr;" "check for working compile command" {
        "Could not load libcc1.*\r\n$gdb_prompt $" {
-           set result 1
+           set result "could not find libcc1"
+       }
+       "Could not load libcp1.*\r\n$gdb_prompt $" {
+           set result "could not find libcp1"
+       }
+       -re "WARNING .* there are active plugins, do not report this" {
+           # Note that the regexp above does not check for the
+           # prompt.  This avoids a gratuitous timeout.
+           set result "GCC crashed"
+       }
+       -re "confused by earlier errors, bailing out" {
+           # This scenario can happen when either GCC or GDB is
+           # confused by some other debuginfo.
+           # See PR compile/29541.
+           set result "confused by glibc debuginfo"
        }
        -re "\r\n$gdb_prompt $" {
        }
@@ -32,6 +47,27 @@ proc skip_compile_feature_tests {} {
     return $result
 }
 
+# Return 1 if we should skip tests of the "compile" feature.
+# This must be invoked after the inferior has been started.
+# EXPR is the expression to test, if any (using the default empty EXPR
+# works fine in most cases).
+
+proc skip_compile_feature_tests {{expr ""}} {
+    return [expr {[string length [_do_check_compile $expr]] > 0}]
+}
+
+# Like skip_compile_feature_tests, but also issue an "untested" when
+# skipping.
+
+proc skip_compile_feature_untested {{expr ""}} {
+    set output [_do_check_compile $expr]
+    if {[string length $output] > 0} {
+       untested "compile command not supported ($output)"
+       return 1
+    }
+    return 0
+}
+
 # This namespace provides some convenience functions for running
 # "compile code" and "compile print" tests.
 #