gdb/testsuite: make gdb_unload use gdb_test_multiple
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 21 Nov 2022 14:30:55 +0000 (09:30 -0500)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 29 Nov 2022 16:43:54 +0000 (11:43 -0500)
In the failure seen by Philippe here:

  https://inbox.sourceware.org/gdb-patches/20221120173024.3647464-1-philippe.waroquiers@skynet.be/

gdb_unload crashed GDB, leaving no trace in the test results.  Change it
to use gdb_test_multiple, so that it leaves an UNRESOLVED result.  I
think it is good practice anyway.

Make it return the result of gdb_test_multiple directly, change
gdb.python/py-objfile.exp accordingly.

Change gdb.base/endian.exp as well to avoid duplicate test names.

Change gdb.base/gnu-debugdata.exp to avoid recording a test result,
since gdb_unload does it already now.

Change-Id: I59a1e4947691330797e6ce23277942547c437a48
Approved-By: Tom de Vries <tdevries@suse.de>
gdb/testsuite/gdb.base/endian.exp
gdb/testsuite/gdb.base/gnu-debugdata.exp
gdb/testsuite/gdb.python/py-objfile.exp
gdb/testsuite/lib/gdb.exp

index 05cf1280bad0459ea8b6a4c7aedae9e56241a015..daa49b5165454df2cd784e3427925ddaf3c7b6da 100644 (file)
@@ -59,7 +59,7 @@ if { [gdb_test_multiple "show endian" "$test" {
 
 # Now check that the automatic endianness is updated
 # according to the executable selected.
-gdb_unload
+gdb_unload "unload 1"
 gdb_test "set endian big" "$en_set big endian\\." \
     "override target endianness big"
 gdb_test "set endian auto" "$en_auto \\\(currently big endian\\\)\\." \
@@ -69,7 +69,7 @@ gdb_file_cmd $binfile
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously big default executable endianness"
 
-gdb_unload
+gdb_unload "unload 2"
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously big default no executable endianness"
 gdb_test "set endian little" "$en_set little endian\\." \
@@ -81,6 +81,6 @@ gdb_file_cmd $binfile
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously little default executable endianness"
 
-gdb_unload
+gdb_unload "unload 3"
 gdb_test "show endian" "$en_auto \\\(currently $endian endian\\\)\\." \
     "previously little default no executable endianness"
index 732eadcbd306acb3f331ade4a4150d27573f2175..0900e2fc2d86f086177255addb7430c647c67349 100644 (file)
@@ -150,10 +150,7 @@ if {$gdb_file_cmd_debug_info == "lzma"} {
 }
 
 # Be sure to test the 'close' method on the MiniDebugInfo BFD.
-if {[gdb_unload]} {
-    fail "unload MiniDebugInfo"
-} else {
-    pass "unload MiniDebugInfo"
-}
+# gdb_unload records a pass/fail.
+gdb_unload
 
 gdb_exit
index 80f2e7949477be7b40f9e74e692e135a8bfa23da..9af841c60db1afd8f4b982dffebe02c04b6b007f 100644 (file)
@@ -92,7 +92,9 @@ gdb_test "python print (objfile.progspace)" "<gdb\.Progspace object at .*>" \
   "Get objfile program space"
 gdb_test "python print (objfile.is_valid())" "True" \
   "Get objfile validity"
-gdb_unload
+
+gdb_unload "unload 1"
+
 gdb_test "python print (objfile.is_valid())" "False" \
   "Get objfile validity after unload"
 
@@ -103,9 +105,8 @@ gdb_test "python print (objfile.random_attribute)" "42" \
 
 # Verify invalid objfile handling.
 
-if { [gdb_unload] < 0 } {
-    fail "unload all files"
-    return -1
+if { [gdb_unload "unload 2"] != 0 } {
+    return
 }
 
 gdb_test "python print(objfile.filename)" "None" \
index e193a20768c0ee4641b4084d72781bb1521a0940..23e3cc0c2d436f0baabdcd3145e4f2044eafd67b 100644 (file)
@@ -311,38 +311,32 @@ proc gdb_version { } {
     return [default_gdb_version]
 }
 
-#
 # gdb_unload -- unload a file if one is loaded
-# Return 0 on success, -1 on error.
 #
+# Returns the same as gdb_test_multiple.
 
-proc gdb_unload {} {
+proc gdb_unload { {msg "file"} } {
     global GDB
     global gdb_prompt
-    send_gdb "file\n"
-    gdb_expect 60 {
-       -re "No executable file now\[^\r\n\]*\[\r\n\]" { exp_continue }
-       -re "No symbol file now\[^\r\n\]*\[\r\n\]" { exp_continue }
-       -re "A program is being debugged already.*Are you sure you want to change the file.*y or n. $" {
+    return [gdb_test_multiple "file" $msg {
+       -re "A program is being debugged already.\r\nAre you sure you want to change the file. .y or n. $" {
            send_gdb "y\n" answer
            exp_continue
        }
-       -re "Discard symbol table from .*y or n.*$" {
-           send_gdb "y\n" answer
+
+       -re "No executable file now\\.\r\n" {
            exp_continue
        }
-       -re "$gdb_prompt $" {}
-       -re "A problem internal to GDB has been detected" {
-           perror "Couldn't unload file in $GDB (GDB internal error)."
-           gdb_internal_error_resync
-           return -1
+
+       -re "Discard symbol table from `.*'. .y or n. $" {
+           send_gdb "y\n" answer
+           exp_continue
        }
-       timeout {
-           perror "couldn't unload file in $GDB (timeout)."
-           return -1
+
+       -re -wrap "No symbol file now\\." {
+           pass $gdb_test_name
        }
-    }
-    return 0
+    }]
 }
 
 # Many of the tests depend on setting breakpoints at various places and