[Patch] Automatically substitute sections name in testcase

Tristan Gingold gingold@adacore.com
Mon Jun 28 12:30:00 GMT 2010


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



More information about the Binutils mailing list