This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Ping [Patch] Automatically substitute sections name in testcase


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
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]