[binutils-gdb] gdb/testsuite: modernise the gdb.python/py-section-script.exp test

Andrew Burgess via Gdb-cvs <[email protected]>
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=998b27baa56e0a9480a5936d5fa8b7293cce156b

commit 998b27baa56e0a9480a5936d5fa8b7293cce156b
Author: Andrew Burgess <[email protected]>
Date:   Wed Mar 25 16:28:05 2026 +0000

    gdb/testsuite: modernise the gdb.python/py-section-script.exp test
    
    I want to add more test cases to gdb.python/py-section-script.exp, so
    this commit is an initial cleanup of the test script.
    
    The primary change here is that we no longer overwrite the test
    executable.  The test has a loop, previously we'd overwrite the test
    executable on each iteration, now we create a new test executable on
    each iteration.
    
    Additionally, at the end of the loop we strip the debug from the
    executable and run some additional tests, I now create a copy of the
    executable and strip the debug from that instead, this leaves the
    unstripped executable around if we need to rerun tests outside of the
    testsuite.
    
    Then I've made some other small clean ups, making use of
    $gdb_test_name, and the -wrap flag within gdb_test_multiple.
    
    I've made use of require is_elf_target.
    
    And I've factored out some code to set the auto-load safe path as in
    some places we were switching the path separator, but in others we
    just assumed ":".  The helper proc always uses ";" for mingw.
    
    I also added a full 'info auto-load python-scripts' check after
    loading the stripped binary.  Previously we only actually checked one
    of the scripts had been loaded correctly.
    
    Approved-By: Kevin Buettner <[email protected]>

Diff:
---
 gdb/testsuite/gdb.python/py-section-script.exp | 126 +++++++++++++------------
 1 file changed, 68 insertions(+), 58 deletions(-)

diff --git a/gdb/testsuite/gdb.python/py-section-script.exp b/gdb/testsuite/gdb.python/py-section-script.exp
index f5f85b5202a..a3b9631ade7 100644
--- a/gdb/testsuite/gdb.python/py-section-script.exp
+++ b/gdb/testsuite/gdb.python/py-section-script.exp
@@ -16,18 +16,7 @@
 # This file is part of the GDB testsuite.  It tests automagic loading of
 # scripts specified in the .debug_gdb_scripts section.
 
-# This test can only be run on targets which support ELF and use gas.
-# For now pick a sampling of likely targets.
-if {![istarget *-*-linux*]
-    && ![istarget *-*-gnu*]
-    && ![istarget *-*-elf*]
-    && ![istarget *-*-openbsd*]
-    && ![istarget arm*-*-eabi*]
-    && ![istarget powerpc-*-eabi*]} {
-    verbose "Skipping py-section-script.exp because of lack of support."
-    return
-}
-
+require is_elf_target
 require allow_python_tests
 
 standard_testfile
@@ -39,7 +28,25 @@ set remote_python_file [gdb_remote_download host \
 
 set quoted_name "\"$remote_python_file\""
 
+# Helper proc to 'set auto-load safe-path ...'.  Build the new path value by
+# joining ARGS together with an appropriate path separator character.
+proc set_auto_load_safe_path { args } {
+    if {[ishost *-*-mingw*]} {
+	set remote_pathsep ";"
+    } else {
+	set remote_pathsep ":"
+    }
+
+    set safe_path [join $args $remote_pathsep]
+
+    gdb_test_no_output "set auto-load safe-path $safe_path" \
+	"set auto-load safe-path"
+}
+
 foreach_with_prefix variant {plain compressed} {
+    set the_testfile $testfile-$variant
+    set the_binfile [standard_output_file $the_testfile]
+
     set flags [list debug \
 		   additional_flags=-I${srcdir}/../../include \
 		   additional_flags=-DSCRIPT_FILE=$quoted_name]
@@ -48,18 +55,18 @@ foreach_with_prefix variant {plain compressed} {
 	lappend flags additional_flags=-Wl,--compress-debug-sections=zlib-gabi
     }
 
-    if {[build_executable $testfile.exp $testfile $srcfile $flags] == -1} {
+    if {[build_executable "build executable" $the_testfile $srcfile $flags] == -1} {
 	return
     }
 
     if {$variant == "compressed"} {
 	set objdump_program [gdb_find_objdump]
-	set debug_sect [exec $objdump_program -j .debug_gdb_scripts -s "$binfile"]
+	set debug_sect [exec $objdump_program -j .debug_gdb_scripts -s "$the_binfile"]
 	set debug_sect_decompressed [exec $objdump_program -j .debug_gdb_scripts \
-			    -s "$binfile" --decompress]
+			    -s "$the_binfile" --decompress]
 
 	if {$debug_sect == $debug_sect_decompressed} {
-	    fail ".debug_gdb_scripts in $binfile is not compressed"
+	    fail ".debug_gdb_scripts in $the_binfile is not compressed"
 	}
     }
 
@@ -69,16 +76,15 @@ foreach_with_prefix variant {plain compressed} {
 
     gdb_test_no_output "set auto-load safe-path /restricted" \
 	"set restricted auto-load safe-path"
-    gdb_load ${binfile}
+    gdb_load ${the_binfile}
 
     # Verify gdb did not load the scripts.
-    set test_name "verify scripts not loaded"
-    gdb_test_multiple "info auto-load python-scripts" "$test_name" {
-	-re "Yes.*${testfile}.py.*Yes.*inlined-script.*$gdb_prompt $" {
-	    fail "$test_name"
+    gdb_test_multiple "info auto-load python-scripts" "verify scripts not loaded" {
+	-re -wrap "Yes.*${testfile}.py.*Yes.*inlined-script.*" {
+	    fail $gdb_test_name
 	}
-	-re "No.*${testfile}.py.*No.*inlined-script.*$gdb_prompt $" {
-	    pass "$test_name"
+	-re -wrap "No.*${testfile}.py.*No.*inlined-script.*" {
+	    pass $gdb_test_name
 	}
     }
 
@@ -89,31 +95,23 @@ foreach_with_prefix variant {plain compressed} {
     # Get the name of the binfile on the host; on a remote host this means
     # stripping off any directory prefix.
     if {[is_remote host]} {
-	set remote_binfile [file tail ${binfile}]
-    } else {
-	set remote_binfile ${binfile}
-    }
-
-    if {[ishost *-*-mingw*]} {
-	set remote_pathsep ";"
+	set remote_binfile [file tail ${the_binfile}]
     } else {
-	set remote_pathsep ":"
+	set remote_binfile ${the_binfile}
     }
-    gdb_test_no_output "set auto-load safe-path ${remote_python_file}${remote_pathsep}${remote_binfile}" \
-	"set auto-load safe-path"
-    gdb_load ${binfile}
 
+    set_auto_load_safe_path $remote_python_file $remote_binfile
+    gdb_load ${the_binfile}
     # Verify gdb loaded each script and they appear once in the list.
-    set test_name "verify scripts loaded"
-    gdb_test_multiple "info auto-load python-scripts" "$test_name" {
-	-re "Yes.*${testfile}.py.*Yes.*inlined-script.*$gdb_prompt $" {
-	    pass "$test_name"
+    gdb_test_multiple "info auto-load python-scripts" "verify scripts loaded" {
+	-re -wrap "Yes.*${testfile}.py.*Yes.*inlined-script.*" {
+	    pass $gdb_test_name
 	}
-	-re "${testfile}.py.*${testfile}.py.*$gdb_prompt $" {
-	    fail "$test_name"
+	-re -wrap "${testfile}.py.*${testfile}.py.*" {
+	    fail $gdb_test_name
 	}
-	-re "inlined-script.*inlined-script.*$gdb_prompt $" {
-	    fail "$test_name"
+	-re -wrap "inlined-script.*inlined-script.*" {
+	    fail $gdb_test_name
 	}
     }
 
@@ -128,7 +126,7 @@ foreach_with_prefix variant {plain compressed} {
 	return
     }
 
-    gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
+    gdb_test "b [gdb_get_line_number {break to inspect}]" \
 	".*Breakpoint.*"
     gdb_test "continue" ".*Breakpoint.*"
 
@@ -137,13 +135,17 @@ foreach_with_prefix variant {plain compressed} {
     gdb_test "test-cmd 1 2 3" "test-cmd output, arg = 1 2 3"
 
 
-    # eu-strip creates NOBITS .debug_gdb_scripts sections in the debug files.
-    # Make sure those are ignored silently.
+    # eu-strip creates NOBITS .debug_gdb_scripts sections in the debug
+    # files, and leaves a useful copy of .debug_gdb_scripts in the
+    # executable.  Make sure the NOBITS copy in the separate debug file is
+    # ignored silently.
+    with_test_prefix "sepdebug from eu-strip" {
+	clean_restart
 
-    with_test_prefix "sepdebug" {
-	gdb_exit
+	set eu_strip_binfile [standard_output_file ${the_testfile}-eu-strip]
+	file copy -force $the_binfile $eu_strip_binfile
 
-	set result [catch {exec eu-strip -g -f ${binfile}.debug ${binfile}} output]
+	set result [catch {exec eu-strip -g -f ${eu_strip_binfile}.debug ${eu_strip_binfile}} output]
 	verbose "result is $result"
 	verbose "output is $output"
 	if {$result != 0 || $output != ""} {
@@ -151,18 +153,26 @@ foreach_with_prefix variant {plain compressed} {
 	    return
 	}
 
-	gdb_start
-	gdb_reinitialize_dir $srcdir/$subdir
+	set_auto_load_safe_path $remote_python_file $eu_strip_binfile
+	gdb_test_multiple "file $eu_strip_binfile" "load sepdebug" {
+	    -re -wrap "\r\nwarning: Invalid entry in \\.debug_gdb_scripts section.*" {
+		fail $gdb_test_name
+	    }
+	    -re -wrap "" {
+		pass $gdb_test_name
+	    }
+	}
 
-	gdb_test_no_output "set auto-load safe-path ${remote_python_file}:${binfile}" \
-	    "set auto-load safe-path"
-	set test "load sepdebug"
-	gdb_test_multiple "file $binfile" $test {
-	    -re "\r\nwarning: Invalid entry in \\.debug_gdb_scripts section.*\r\n$gdb_prompt $" {
-		fail $test
+	# Verify gdb loaded each script and they appear once in the list.
+	gdb_test_multiple "info auto-load python-scripts" "verify scripts loaded" {
+	    -re -wrap "Yes.*${testfile}.py.*Yes.*inlined-script.*" {
+		pass $gdb_test_name
+	    }
+	    -re -wrap "${testfile}.py.*${testfile}.py.*" {
+		fail $gdb_test_name
 	    }
-	    -re "\r\n$gdb_prompt $" {
-		pass $test
+	    -re -wrap "inlined-script.*inlined-script.*" {
+		fail $gdb_test_name
 	    }
 	}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.