From b91919ac8b5550451093f232a596dfe52a71536c Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Fri, 19 Feb 2021 16:57:05 +0000 Subject: [PATCH] gdb/testsuite: enable gdb.base/sect-cmd.exp test for all targets During review of the next patch (which changes the 'section' command), a bug was pointed out. I wondered why no tests spotted this bug and I found that the 'section' command test (sect-cmd.exp) is only run on hppa targets! In this commit I have given this test script a bit of a spring clean, bringing it up to date with current testsuite style. I have made some of the patterns a little more robust, but in general my intention was not to change the underlying meaning of any of these tests. gdb/testsuite/ChangeLog: * gdb.base/sect-cmd.exp: Rewrite using modern testsuite techniques. Enable the test for all targets. --- gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.base/sect-cmd.exp | 136 +++++++++++----------------- 2 files changed, 56 insertions(+), 85 deletions(-) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ddc7c183bd0..109ede33acc 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2021-02-24 Andrew Burgess + + * gdb.base/sect-cmd.exp: Rewrite using modern testsuite + techniques. Enable the test for all targets. + 2021-02-24 Andrew Burgess * gdb.base/maint-info-sections.exp: Add new tests. diff --git a/gdb/testsuite/gdb.base/sect-cmd.exp b/gdb/testsuite/gdb.base/sect-cmd.exp index 4dbbc09b39c..e42f46d38ca 100644 --- a/gdb/testsuite/gdb.base/sect-cmd.exp +++ b/gdb/testsuite/gdb.base/sect-cmd.exp @@ -13,99 +13,70 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ -# -# test running programs -# +# Test the 'section NAME ADDRESS' command. -# This test exists solely to exercise the "section" command for -# code-coverage on HP-UX. (So far as I can tell, the "section" -# command isn't needed on HP-UX, but probably is for embedded -# apps.) -# -if ![istarget "hppa*-*-hpux*"] then { - return +if { [prepare_for_testing "failed to prepare" "sect-cmd" \ + {break.c break1.c} {debug nowarnings}] } { + return -1 } - -set testfile "sect-cmd" set srcfile break.c set srcfile1 break1.c -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } { - untested "failed to compile" - return -1 +if ![runto_main] then { + fail "couldn't run to main" + return } -if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } { - untested "failed to compile" - return -1 -} +# Get the address of an executable section. This test was originally +# written for (and only run on) hppa targets. For PA32 programs using +# the SOM file format the code section is (apparently) called $CODE$, +# hence why the patterns here include that as a choice. +# +set address1 "" +set address2 "" +set section_name "" -if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } { - untested "failed to compile" - return -1 +gdb_test_multiple "info files" "" { + -re -wrap "\\s+($hex) - ($hex) is (\\\$CODE\\\$|\\.text\\S*) in .*" { + set address1 $expect_out(1,string) + set address2 $expect_out(2,string) + set section_name $expect_out(3,string) + pass $gdb_test_name + } } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if ![runto_main] then { fail "section command tests suppressed" } - -# Get the $CODE$ section's starting address. +# If we don't have the details we need then we can't continue. # -# (Note that this works for PA32 programs, which use the SOM file -# format. PA64 uses ELF, and when support for that is added, it's -# not clear that there'll be a section named "$CODE$" in such -# programs.) -# - -set address1 "" -set address2 "" -send_gdb "info files\n" -gdb_expect { - -re ".*(0x\[0-9a-fA-F\]*) - (0x\[0-9a-fA-F\]*) is .(CODE|text).*$gdb_prompt $"\ - {pass "info files" - set address1 $expect_out(1,string) - set address2 $expect_out(2,string)} - -re "$gdb_prompt $"\ - {fail "info files"} - timeout {fail "(timeout) info files"} +if { $address1 == "" || $address2 == "" || $section_name == "" } { + unresolved "failed to find required section details" + return } # Reset the section to that same starting address, which should be # harmless (i.e., we just want to exercise the section command). # -if [istarget "hppa2.0w-*-*"] then { - send_gdb "section \.text $address1\n" - gdb_expect { - -re ".*$address1 \- $address2 is .text.*$gdb_prompt $"\ - {pass "set section command"} - -re "$gdb_prompt $"\ - {fail "set section command"} - timeout {fail "(timeout) set section command"} - } -} else { - send_gdb "section \$CODE\$ $address1\n" - gdb_expect { - -re ".*$address1 \- $address2 is .CODE..*$gdb_prompt $"\ - {pass "set section command"} - -re "$gdb_prompt $"\ - {fail "set section command"} - timeout {fail "(timeout) set section command"} - } -} +set saw_section_address_line false +gdb_test_multiple "section $section_name $address1" \ + "set section $section_name to original address" { + -re ".*$address1 \- $address2 is $section_name.*" { + set saw_section_address_line true + exp_continue + } + -re "Section \[^\r\n\]+ not found\r\n" { + fail "$gdb_test_name, saw not found marker" + exp_continue + } + -re "$gdb_prompt $" { + gdb_assert { $saw_section_address_line } $gdb_test_name + } + } # Verify that GDB responds gracefully to a non-existent section name. # -send_gdb "section FOOBARBAZ 0x1234\n" -gdb_expect { - -re "Section FOOBARBAZ not found\r\n$gdb_prompt $"\ - {pass "non-existent section disallowed"} - -re "$gdb_prompt $"\ - {fail "non-existent section disallowed"} - timeout {fail "(timeout) non-existent section disallowed"} +gdb_test_multiple "section FOOBARBAZ 0x1234" "" { + -re -wrap "Section FOOBARBAZ not found" { + pass $gdb_test_name + } } # We "happen to know" that GDB uses a fixed size character buffer to @@ -113,14 +84,9 @@ gdb_expect { # characters in length. Verify that GDB gracefully handles section # names longer than that. (The section is also non-existent.) # -send_gdb "section A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 0x1234\n" -gdb_expect { - -re "Section A23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 not found\r\n$gdb_prompt $"\ - {pass "non-existent too-long section disallowed"} - -re "$gdb_prompt $"\ - {fail "non-existent too-long section disallowed"} - timeout {fail "(timeout) non-existent too-long section disallowed"} -} - -gdb_exit -return 0 +gdb_test_multiple "section A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 0x1234" \ + "non-existent too-long section disallowed" { + -re -wrap "Section A23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 not found" { + pass $gdb_test_name + } + } -- 2.30.2