This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Ping [Patch] Automatically substitute sections name in testcase
- From: Tristan Gingold <gingold at adacore dot com>
- To: binutils <binutils at sourceware dot org>
- Date: Mon, 19 Jul 2010 10:49:17 +0200
- Subject: Ping [Patch] Automatically substitute sections name in testcase
- References: <4138CDB4-E9CA-4519-9AB8-03A7E0E96BF0@adacore.com>
Ping for this patch.
On Jun 28, 2010, at 2:30 PM, Tristan Gingold wrote:
> 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
>