[gdb/testsuite] Clean or check standard_output_file dir in gdb_init
authorTom de Vries <tdevries@suse.de>
Thu, 22 Jun 2023 17:15:23 +0000 (19:15 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 22 Jun 2023 17:15:23 +0000 (19:15 +0200)
In commit e2adba909e7 ("[gdb/testsuite] Clean up before compilation in
gdb.ada/call-no-debug.exp") I added some code in the test-case to remove some
files at the start of the test-case:
...
remote_file host delete [standard_output_file prog.o]
remote_file host delete [standard_output_file prog.ali]
...

Then in commit b7b77500dc5 ("[gdb/testsuite] Clean standard_output_file dir in
gdb_init") I tried to do this more structurally, by cleaning up the entire
standard_output_file directory, for all test-cases.

This caused a regression when using "make check -j 2", due to the cleanup
removing the active gdb.log, so I reverted the commit.

Try again, this time handling the two cases separately.

If the standard_output_file directory contains an active gdb.log, check that
the directory contains no files other than gdb.log and gdb.sum.  This puts
the reponsibility for the cleanup at the callers in gdb/testsuite/Makefile.in
which use --outdir.

If the standard_output_file directory doesn't contain an active gdb.log, clean
it by removing the entire directory.

An exception is made for performance tests, where cleaning up the
standard_output_file dir is the wrong thing to do, because an invocation with
GDB_PERFTEST_MODE == run is intended to reuse binaries left there by an
earlier invocation with GDB_PERFTEST_MODE == compile.

Tested on x86_64-linux.

Suggested-By: Tom Tromey <tom@tromey.com>
Reviewed-By: Tom Tromey <tom@tromey.com>
Tested-By: Luis Machado <luis.machado@arm.com>
gdb/testsuite/gdb.ada/call-no-debug.exp
gdb/testsuite/lib/gdb.exp

index df81c87ade2c000a29ea125ce354e91d340191fe..422b83761d91b6b4bf10cd5c4434766959979aed 100644 (file)
@@ -21,11 +21,6 @@ require allow_ada_tests
 
 standard_ada_testfile prog
 
-# Since we use no-force to compile prog, make sure we don't pick up files
-# from a previous compilation.
-remote_file host delete [standard_output_file prog.o]
-remote_file host delete [standard_output_file prog.ali]
-
 # Compile pck without debuginfo but prog with it.
 if {[gdb_compile_ada $srcdir/$subdir/$testdir/pck.adb \
         [standard_output_file pck.o] object {}] != ""} {
index 50fcb844183e8eda3efb46bbbdb50b4b0e37a1c3..b4900ae25a66dbdbca7d4efa553f70b998c654c4 100644 (file)
@@ -6286,6 +6286,45 @@ proc gdb_continue { function } {
     return [gdb_test "continue" ".*Breakpoint $decimal, $function .*" "continue to $function"]
 }
 
+# Clean the directory containing the standard output files.
+
+proc clean_standard_output_dir {} {
+    if { [info exists ::GDB_PERFTEST_MODE] && $::GDB_PERFTEST_MODE == "run" } {
+       # Don't clean, use $GDB_PERFTEST_MODE == compile results.
+       return
+    }
+
+    # Directory containing the standard output files.
+    set standard_output_dir [file normalize [standard_output_file ""]]
+
+    # Ensure that standard_output_dir is clean, or only contains
+    # gdb.log / gdb.sum.
+    set log_file_info [split [log_file -info]]
+    set log_file [file normalize [lindex $log_file_info end]]
+    if { $log_file == [file normalize [standard_output_file gdb.log]] } {
+       # Dir already contains active gdb.log.  Don't remove the dir, but
+       # check that it's clean otherwise.
+       set res [glob -directory $standard_output_dir -tails *]
+       set ok 1
+       foreach f $res {
+           if { $f == "gdb.log" } {
+               continue
+           }
+           if { $f == "gdb.sum" } {
+               continue
+           }
+           set ok 0
+       }
+       if { !$ok } {
+           error "standard output dir not clean"
+       }
+    } else {
+       # Start with a clean dir.
+       remote_exec build "rm -rf $standard_output_dir"
+    }
+
+}
+
 # Default implementation of gdb_init.
 proc default_gdb_init { test_file_name } {
     global gdb_wrapper_initialized
@@ -6420,6 +6459,8 @@ proc default_gdb_init { test_file_name } {
 
     set gdb_test_file_name [file rootname [file tail $test_file_name]]
 
+    clean_standard_output_dir
+
     # Make sure that the wrapper is rebuilt
     # with the appropriate multilib option.
     if { $gdb_wrapper_target != [current_target_name] } {