[Patch] Automatically substitute sections name in testcase
Tristan Gingold
gingold@adacore.com
Mon Jun 28 12:30:00 GMT 2010
More information about the Binutils mailing list
Mon Jun 28 12:30:00 GMT 2010
- Previous message (by thread): PowerPC64 ld segfault on R_PPC64_TOC16_LO absolute symbol
- Next message (by thread): [RFA] [ARM] Fix reporting of undefined and deprecated mov rd, rm instructions
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi, this issue has already been discussed here and here is my patch. While the name of the standard section .text, .data and .bss is very common, some targets (rx-elf, hppa-som, vms and maybe others) use different names. To avoid rewritten some tests, I propose that the driver for the gas tests automatically makes the substitution. This is done only for run_dump_test and only for the objdump analyzer. It is also possible to disable this with a new option (section-subst: no) in the .d file. There is a new procedure, get_standard_section_names which gives the list of sections name. This list - if not empty - is then used to build substitution patterns. This is done both for the objdump command line (to handle options like -j .text) and in the output of the objdump result. No regressions on i386-pc-gnu-linux. The number of unexpected failures for the gas testsuite for rx-elf is now 6. Tristan. 2010-06-28 Tristan Gingold <gingold@adacore.com> * lib/gas-defs.exp (get_standard_section_names): New function. (run_dump_tests): Document the new behavior for objdump, document to new section-subst option. Automatically perform substitutions for objdump. (objdump_finish): Add REF_SUBST argument. (run_list_test): Adjust call of regexp_diff. (run_list_test_stdin): Ditto. * gas/all/gas.exp (test_cond): Adjust call of regexp_diff. * gas/symver/symver.exp (run_error_test): Ditto. * gas/mt/relocs.exp (regexp_test): Ditto. * gas/mep/complex-relocs.exp (regexp_test): Ditto. * gas/m68k/all.exp: Ditto. * gas/elf/elf.exp (run_elf_list_test): Ditto. * gas/rx/rx-asm-good.d: Set section-subst to no. diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 51d7a58..77c9be5 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -287,7 +287,7 @@ proc test_cond {} { send_log "$comp_output\n" fail $testname } else { - if { [regexp_diff dump.out $srcdir/$subdir/cond.l] } { + if { [regexp_diff dump.out $srcdir/$subdir/cond.l ""] } { fail $testname } else { pass $testname diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index 9771a86..9f4e229 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -9,7 +9,7 @@ proc run_elf_list_test { name suffix opts readelf_opts readelf_pipe } { set file $srcdir/$subdir/$name gas_run ${name}.s "$opts -o dump.o" ">&dump.out" if { ![string match "" $opts] - && [regexp_diff "dump.out" "${file}.l"] } then { + && [regexp_diff "dump.out" "${file}.l" ""] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return @@ -28,7 +28,7 @@ proc run_elf_list_test { name suffix opts readelf_opts readelf_pipe } { return } verbose_eval {[file_contents "dump.out"]} 3 - if { [regexp_diff "dump.out" "${file}.e${suffix}"] } then { + if { [regexp_diff "dump.out" "${file}.e${suffix}" ""] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return diff --git a/gas/testsuite/gas/m68k/all.exp b/gas/testsuite/gas/m68k/all.exp index feb33a4..53fa62c 100644 --- a/gas/testsuite/gas/m68k/all.exp +++ b/gas/testsuite/gas/m68k/all.exp @@ -83,7 +83,7 @@ if { [istarget m68*-*-*] || [istarget fido*-*-*] } then { verbose "$comp_output" 3 fail $testname } else { - if [regexp_diff "err.out" "$srcdir/$subdir/op68000.d"] then { + if [regexp_diff "err.out" "$srcdir/$subdir/op68000.d" ""] then { fail $testname } else { pass $testname diff --git a/gas/testsuite/gas/mep/complex-relocs.exp b/gas/testsuite/gas/mep/complex-relocs.exp index 83d89bb..a5a3127 100644 --- a/gas/testsuite/gas/mep/complex-relocs.exp +++ b/gas/testsuite/gas/mep/complex-relocs.exp @@ -18,7 +18,7 @@ proc objdump_test { exec flags dest test } { } proc regexp_test { file1 file2 test } { - if [regexp_diff $file1 $file2] then { fail $test } else { pass $test } + if [regexp_diff $file1 $file2 ""] then { fail $test } else { pass $test } } diff --git a/gas/testsuite/gas/mt/relocs.exp b/gas/testsuite/gas/mt/relocs.exp index 076f428..d47742e 100644 --- a/gas/testsuite/gas/mt/relocs.exp +++ b/gas/testsuite/gas/mt/relocs.exp @@ -15,7 +15,7 @@ proc objdump_test { exec flags dest test } { } proc regexp_test { file1 file2 test } { - if [regexp_diff $file1 $file2] then { fail $test } else { pass $test } + if [regexp_diff $file1 $file2 ""] then { fail $test } else { pass $test } } diff --git a/gas/testsuite/gas/rx/rx-asm-good.d b/gas/testsuite/gas/rx/rx-asm-good.d index d515f24..c74a14a 100644 --- a/gas/testsuite/gas/rx/rx-asm-good.d +++ b/gas/testsuite/gas/rx/rx-asm-good.d @@ -1,5 +1,6 @@ # name: Compatibility with Renesas's own assembler # objdump: -D --prefix-addresses --show-raw-insn +# section-subst: no .*: +file format elf32-rx-.* diff --git a/gas/testsuite/gas/symver/symver.exp b/gas/testsuite/gas/symver/symver.exp index 075d93f..737bc85 100644 --- a/gas/testsuite/gas/symver/symver.exp +++ b/gas/testsuite/gas/symver/symver.exp @@ -6,7 +6,7 @@ proc run_error_test { name opts } { set testname "symver $name" set file $srcdir/$subdir/$name gas_run ${name}.s $opts ">&dump.out" - if { [regexp_diff "dump.out" "${file}.l"] } then { + if { [regexp_diff "dump.out" "${file}.l" ""] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return diff --git a/gas/testsuite/lib/gas-defs.exp b/gas/testsuite/lib/gas-defs.exp index fd2f179..07e3f1c 100644 --- a/gas/testsuite/lib/gas-defs.exp +++ b/gas/testsuite/lib/gas-defs.exp @@ -341,6 +341,15 @@ proc is_pecoff_format {} { return 1 } +# Internal procedure: return the names of the standard sections +# +proc get_standard_section_names {} { + if [istarget "rx-*-*"] { + return { "P" "D_1" "B_1" } + } + return +} + # run_dump_tests TESTCASES EXTRA_OPTIONS # Wrapper for run_dump_test, which is suitable for invoking as # run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]] @@ -411,7 +420,12 @@ proc run_dump_tests { testcases {extra_options {}} } { # with LC_ALL=C in the environment to give consistent sorting # of symbols. If no FLAGS are needed then use: # PROG: [nm objcopy objdump readelf] -# instead. +# instead. +# Note: for objdump, we automatically replaces the standard section +# names (.text, .data and .bss) by target ones if any (eg. rx-elf +# uses "P" instead of .text). The substition is done for both +# the objdump options (eg: "-j .text" is replaced by "-j P") and the +# reference file. # # source: SOURCE # Assemble the file SOURCE.s. If omitted, this defaults to FILE.s. @@ -457,6 +471,9 @@ proc run_dump_tests { testcases {extra_options {}} } { # is expected to exit unsuccessfully (therefore PROG, objdump, nm, # and objcopy have no meaning and should not be supplied). # +# section-subst: no +# Means that the section substitution for objdump is disabled. +# # Each option may occur at most once. # # After the option lines come regexp lines. `run_dump_test' calls @@ -499,6 +516,7 @@ proc run_dump_test { name {extra_options {}} } { set opts(not-target) {} set opts(skip) {} set opts(not-skip) {} + set opts(section-subst) {} foreach i $opt_array { set opt_name [lindex $i 0] @@ -702,7 +720,7 @@ proc run_dump_test { name {extra_options {}} } { } set stderrfile $srcdir/$subdir/$opts(stderr) verbose "wrote pruned stderr to dump.stderr" 3 - if { [regexp_diff "dump.stderr" "$stderrfile"] } then { + if { [regexp_diff "dump.stderr" "$stderrfile" ""] } then { if { $opts(error) != "" } { verbose -log "$exitstat with: <$comp_output>, expected: <$opts(error)>" if [regexp $opts(error) $comp_output] { @@ -736,6 +754,15 @@ proc run_dump_test { name {extra_options {}} } { return } + # For objdump, automatically translate standard section names to the targets one, + # if they are different. + set sect_names [get_standard_section_names] + if { $sect_names != "" && $program == "objdump" && $opts(section-subst) == ""} { + regsub -- "-j \\.text" $progopts1 "-j [lindex $sect_names 0]" progopts1 + regsub -- "-j \\.data" $progopts1 "-j [lindex $sect_names 1]" progopts1 + regsub -- "-j \\.bss" $progopts1 "-j [lindex $sect_names 2]" progopts1 + } + if { $progopts1 == "" } { set $progopts1 "-r" } verbose "running $binary $progopts $progopts1" 3 @@ -768,8 +795,18 @@ proc run_dump_test { name {extra_options {}} } { return } + # Create the substition list only for objdump reference. + if { $sect_names != "" && $program == "objdump" } { + # Some testcases use ".text" while others use "\.text". + set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \ + "\\\\?\\.data" [lindex $sect_names 1] \ + "\\\\?\\.bss" [lindex $sect_names 2] ] + } else { + set regexp_subst "" + } + verbose_eval {[file_contents "dump.out"]} 3 - if { [regexp_diff "dump.out" "${file}.d"] } then { + if { [regexp_diff "dump.out" "${file}.d" $regexp_subst] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return @@ -843,13 +880,14 @@ expect_after -i { eof { perror "eof" } } -# regexp_diff, based on simple_diff taken from ld test suite -# compares two files line-by-line -# file1 contains strings, file2 contains regexps and #-comments -# blank lines are ignored in either file -# returns non-zero if differences exist +# regexp_diff, based on simple_diff taken from ld test suite. +# Compares two files line-by-line. +# FILE_1 contains strings, FILE_2 contains regexps and #-comments +# Blank lines are ignored in either file. +# Subsitutions in REF_SUBST are applied on FILE_2 lines. +# Returns non-zero if differences exist. # -proc regexp_diff { file_1 file_2 } { +proc regexp_diff { file_1 file_2 ref_subst} { set eof -1 set end_1 0 @@ -878,6 +916,7 @@ proc regexp_diff { file_1 file_2 } { set line_a "" set line_b "" while { [string length $line_a] == 0 } { + # Ignore blank line in FILE_1. if { [gets $file_a line_a] == $eof } { set end_1 1 break @@ -894,6 +933,10 @@ proc regexp_diff { file_1 file_2 } { set diff_pass 1 break } + # Substitute on the reference. + foreach {name value} $ref_subst { + regsub -- $name $line_b $value line_b + } verbose "looking for \"^$line_b$\"" 3 while { ![regexp "^$line_b$" "$line_a"] } { verbose "skipping \"$line_a\"" 3 @@ -925,6 +968,10 @@ proc regexp_diff { file_1 file_2 } { set differences 1 break } else { + # Substitute on the reference. + foreach {name value} $ref_subst { + regsub -- $name $line_b $value line_b + } verbose "regexp \"^$line_b$\"\nline \"$line_a\"" 3 if ![regexp "^$line_b$" "$line_a"] { send_log "regexp_diff match failure\n" @@ -1002,7 +1049,7 @@ proc run_list_test { name {opts {}} {testname {}} } { } set file $srcdir/$subdir/$name gas_run ${name}.s $opts ">&dump.out" - if { [regexp_diff "dump.out" "${file}.l"] } then { + if { [regexp_diff "dump.out" "${file}.l" ""] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return @@ -1021,7 +1068,7 @@ proc run_list_test_stdin { name {opts {}} {testname {}} } { } set file $srcdir/$subdir/$name gas_run_stdin ${name}.s $opts ">&dump.out" - if { [regexp_diff "dump.out" "${file}.l"] } then { + if { [regexp_diff "dump.out" "${file}.l" ""] } then { fail $testname verbose "output is [file_contents "dump.out"]" 2 return
- Previous message (by thread): PowerPC64 ld segfault on R_PPC64_TOC16_LO absolute symbol
- Next message (by thread): [RFA] [ARM] Fix reporting of undefined and deprecated mov rd, rm instructions
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list