diff options
author | Alan Modra <amodra@gmail.com> | 2018-09-13 14:45:47 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-09-15 16:56:55 +0930 |
commit | 8ffb70eb57f527817840ff33982c085b0bec86bc (patch) | |
tree | b719bb10427c20d76496e9b835315cdd22655345 /gas | |
parent | 99bcaeaf0ff692348194ed6f30162c3a0cfb9655 (diff) | |
download | fsf-binutils-gdb-8ffb70eb57f527817840ff33982c085b0bec86bc.zip fsf-binutils-gdb-8ffb70eb57f527817840ff33982c085b0bec86bc.tar.gz fsf-binutils-gdb-8ffb70eb57f527817840ff33982c085b0bec86bc.tar.bz2 |
Consolidate run_dump_test
This merges the three versions of run_dump_test. Improved warning
handling versus the old gas version shows up a number of tests that
need their disassembly updating:
arm-linuxeabi +FAIL: ARM v1 instructions
arm-linuxeabi +FAIL: Accepted v8-a with ARMv8.1 AdvSIMD.
arm-linuxeabi +FAIL: bl local instructions for v4t.
arm-linuxeabi +FAIL: UDF
and some that now fail due to detecting assembly warnings:
h8300-elf +FAIL: binutils-all/strip-13
h8300-elf +FAIL: binutils-all/strip-14
h8300-elf +FAIL: binutils-all/strip-15
I've generally kept the union of all run_dump_test features, except
that the ld target aliases "cfi" and "shared" have disappeared, as has
the binutils substitution of $srcdir as $scrdir/$subdir.
binutils/
* testsuite/binutils-all/add-symbol.d: Add "section_subst: no".
* testsuite/binutils-all/elfedit.exp: Don't set tempfile or copyfile.
* testsuite/binutils-all/symbols-1.d,
* testsuite/binutils-all/symbols-2.d,
* testsuite/binutils-all/symbols-3.d,
* testsuite/binutils-all/symbols-4.d: Quote '*' and '!'.
* testsuite/binutils-all/add-empty-section.d,
* testsuite/binutils-all/add-section.d,
* testsuite/binutils-all/elfedit.exp,
* testsuite/binutils-all/note-1.d,
* testsuite/binutils-all/pr23633.d: Add $subdir after $srcdir.
* testsuite/config/default.exp (AS, ASFLAGS): Define.
* testsuite/config/hppa.sed: Handle all common symbols.
* testsuite/lib/binutils-common.exp (run_dump_test): New proc,
merged from three other versions.
(slurp_options, file_contents, set_file_contents): Likewise.
(big_or_little_endian, get_standard_section_names): Likewise.
* testsuite/lib/utils-lib.exp (run_dump_test): Delete.
(slurp_options, proc file_contents): Delete.
(get_standard_section_names): Delete.
gas/
* testsuite/config/default.exp: Make tmpdir.
* testsuite/lib/gas-defs.exp (run_dump_test): Delete.
(get_standard_section_names, slurp_options): Delete.
ld/
* testsuite/ld-d10v/reloc-007.d,
* testsuite/ld-d10v/reloc-008.d,
* testsuite/ld-d10v/reloc-015.d,
* testsuite/ld-d10v/reloc-016.d: Remove "error:".
* testsuite/ld-elf/eh-frame-hdr.d,
* testsuite/ld-elf/eh5.d,
* testsuite/ld-gc/personality.d: Replace "cfi" and "shared" in
target list with appropriate proc.
* testsuite/ld-elf/frame.exp: Use check_shared_lib_support rather
than "istarget shared".
* testsuite/lib/ld-lib.exp (proc big_or_little_endian): Delete.
(run_dump_test, slurp_options, file_contents): Delete.
(set_file_contents, istarget): Delete.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/config/default.exp | 2 | ||||
-rw-r--r-- | gas/testsuite/lib/gas-defs.exp | 496 |
3 files changed, 8 insertions, 496 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 9a1a48b..2a0d429 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,11 @@ 2018-09-15 Alan Modra <amodra@gmail.com> + * testsuite/config/default.exp: Make tmpdir. + * testsuite/lib/gas-defs.exp (run_dump_test): Delete. + (get_standard_section_names, slurp_options): Delete. + +2018-09-15 Alan Modra <amodra@gmail.com> + * testsuite/gas/mips/aent-2.d, * testsuite/gas/mips/aent-mdebug-2.d, * testsuite/gas/mips/attr-gnu-4-0.d, diff --git a/gas/testsuite/config/default.exp b/gas/testsuite/config/default.exp index 2c134f9..888e90d 100644 --- a/gas/testsuite/config/default.exp +++ b/gas/testsuite/config/default.exp @@ -70,4 +70,6 @@ if ![info exists ADDR2LINEFLAGS] then { set ADDR2LINEFLAGS {} } +if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status} + gas_init diff --git a/gas/testsuite/lib/gas-defs.exp b/gas/testsuite/lib/gas-defs.exp index fe36135..8192cd9 100644 --- a/gas/testsuite/lib/gas-defs.exp +++ b/gas/testsuite/lib/gas-defs.exp @@ -283,19 +283,6 @@ proc gas_init { args } { return } -# Internal procedure: return the names of the standard sections -# -proc get_standard_section_names {} { - if [istarget "rx-*-*"] { - return { "P" "D_1" "B_1" } - } - if [istarget "alpha*-*-*vms*"] { - # Double quote: for TCL and for sh. - return { "\\\$CODE\\\$" "\\\$DATA\\\$" "\\\$BSS\\\$" } - } - 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]] @@ -314,489 +301,6 @@ proc run_dump_tests { testcases {extra_options {}} } { } } - -# run_dump_test FILE (optional:) EXTRA_OPTIONS -# -# Assemble a .s file, then run some utility on it and check the output. -# -# There should be an assembly language file named FILE.s in the test -# suite directory, and a pattern file called FILE.d. `run_dump_test' -# will assemble FILE.s, run some tool like `objdump', `objcopy', or -# `nm' on the .o file to produce textual output, and then analyze that -# with regexps. The FILE.d file specifies what program to run, and -# what to expect in its output. -# -# The FILE.d file begins with zero or more option lines, which specify -# flags to pass to the assembler, the program to run to dump the -# assembler's output, and the options it wants. The option lines have -# the syntax: -# -# # OPTION: VALUE -# -# OPTION is the name of some option, like "name" or "objdump", and -# VALUE is OPTION's value. The valid options are described below. -# Whitespace is ignored everywhere, except within VALUE. The option -# list ends with the first line that doesn't match the above syntax. -# However, a line within the options that begins with a #, but doesn't -# have a recognizable option name followed by a colon, is considered a -# comment and entirely ignored. -# -# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of -# two-element lists. The first element of each is an option name, and -# the second additional arguments to be added on to the end of the -# option list as given in FILE.d. (If omitted, no additional options -# are added.) -# -# The interesting options are: -# -# name: TEST-NAME -# The name of this test, passed to DejaGNU's `pass' and `fail' -# commands. If omitted, this defaults to FILE, the root of the -# .s and .d files' names. -# -# as: FLAGS -# When assembling FILE.s, pass FLAGS to the assembler. -# -# addr2line: FLAGS -# nm: FLAGS -# objdump: FLAGS -# readelf: FLAGS -# Use the specified program to analyze the .o file, and pass it -# FLAGS, in addition to the .o file name. Note that they are run -# with LC_ALL=C in the environment to give consistent sorting -# of symbols. If no FLAGS are needed then use: -# DUMPPROG: [nm objdump readelf addr2line] -# 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. -# This is useful if several .d files want to share a .s file. -# -# dump: DUMP -# Match against DUMP.d. If omitted, this defaults to FILE.d. This -# is useful if several .d files differ by options only. Options are -# always read from FILE.d. -# -# target: GLOB|PROC ... -# Run this test only on a specified list of targets. More precisely, -# in the space-separated list each glob is passed to "istarget" and -# each proc is called as a TCL procedure. List items are interpreted -# such that procs are denoted by surrounding square brackets, and any -# other items are consired globs. If the call evaluates true for any -# of them, the test will be run, otherwise it will be marked -# unsupported. -# -# notarget: GLOB|PROC ... -# Do not run this test on a specified list of targets. Again, each -# glob in the space-separated list is passed to "istarget" and each -# proc is called as a TCL procedure, and the test is run if it -# evaluates *false* for *all* of them. Otherwise it will be marked -# unsupported. -# -# skip: GLOB|PROC ... -# noskip: GLOB|PROC ... -# These are exactly the same as "notarget" and "target", -# respectively, except that they do nothing at all if the check -# fails. They should only be used in groups, to construct a single -# test which is run on all targets but with variant options or -# expected output on some targets. (For example, see -# gas/arm/inst.d and gas/arm/wince_inst.d.) -# -# xfail: GLOB|PROC ... -# Run this test and it is is expected to fail on a specified list -# of targets. -# -# error: REGEX -# An error with message matching REGEX must be emitted for the test -# to pass. The DUMPPROG, addr2line, nm, objdump, and readelf options -# have no meaning and need not supplied if this is present. -# -# warning: REGEX -# Expect a gas warning matching REGEX. It is an error to issue -# both "error" and "warning". -# -# warning_output: FILE -# FILE contains regexp lines to be matched against the diagnostic -# output of the assembler. This does not preclude the use of -# DUMPPROG, addr2line, nm, objdump, or readelf. -# -# error_output: FILE -# Means the same as 'warning_output', but also indicates that the assembler -# is expected to exit unsuccessfully (therefore DUMPPROG, addr2line, nm, -# objdump, and readelf 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 -# `regexp_diff' to compare the output of the dumping tool against the -# regexps in FILE.d. `regexp_diff' is defined in binutils-common.exp; -# see further comments there. - -proc run_dump_test { name {extra_options {}} } { - global subdir srcdir - global OBJDUMP NM AS OBJCOPY READELF - global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS - global ADDR2LINE ADDR2LINEFLAGS - global host_triplet - global env - - if [string match "*/*" $name] { - set file $name - set name [file tail $name] - } else { - set file "$srcdir/$subdir/$name" - } - set opt_array [slurp_options "${file}.d"] - if { $opt_array == -1 } { - perror "error reading options from $file.d" - unresolved $subdir/$name - return - } - set opts(addr2line) {} - set opts(as) {} - set opts(objdump) {} - set opts(nm) {} - set opts(readelf) {} - set opts(name) {} - set opts(DUMPPROG) {} - set opts(source) {} - set opts(dump) {} - set opts(warning_output) {} - set opts(error) {} - set opts(error_output) {} - set opts(warning) {} - set opts(target) {} - set opts(notarget) {} - set opts(skip) {} - set opts(noskip) {} - set opts(xfail) {} - set opts(section-subst) {} - - foreach i $opt_array { - set opt_name [lindex $i 0] - set opt_val [lindex $i 1] - if ![info exists opts($opt_name)] { - perror "unknown option $opt_name in file $file.d" - unresolved $subdir/$name - return - } - if [string length $opts($opt_name)] { - perror "option $opt_name multiply set in $file.d" - unresolved $subdir/$name - return - } - if { $opt_name == "as" } { - set opt_val [subst $opt_val] - } - set opts($opt_name) $opt_val - } - - foreach i $extra_options { - set opt_name [lindex $i 0] - set opt_val [lindex $i 1] - if ![info exists opts($opt_name)] { - perror "unknown option $opt_name given in extra_opts" - unresolved $subdir/$name - return - } - # add extra option to end of existing option, adding space - # if necessary. - if [string length $opts($opt_name)] { - append opts($opt_name) " " - } - append opts($opt_name) $opt_val - } - - if { $opts(name) == "" } { - set testname "$subdir/$name" - } else { - set testname $opts(name) - } - verbose "Testing $testname" - - if { (($opts(warning) != "") && ($opts(error) != "")) \ - || (($opts(warning) != "") && ($opts(warning_output) != "")) \ - || (($opts(error_output) != "") && ($opts(warning_output) != "")) \ - || (($opts(error_output) != "") && ($opts(error) != "")) \ - || (($opts(error_output) != "") && ($opts(warning) != "")) } { - perror "$testname: bad mix of warning_output, error_output, error, and warning test-directives" - unresolved $testname - return - } - if { $opts(error_output) != "" } then { - set opts(warning_output) $opts(error_output) - } - - set dumpprogram "" - # It's meaningless to require an output-testing method when we - # expect an error. - if { $opts(error) == "" && $opts(error_output) == "" } { - if {$opts(DUMPPROG) != ""} { - switch -- $opts(DUMPPROG) { - addr2line { set dumpprogram addr2line } - objdump { set dumpprogram objdump } - nm { set dumpprogram nm } - readelf { set dumpprogram readelf } - default { - perror "unrecognized DUMPPROG option $opts(DUMPPROG) in $file.d" - unresolved $testname - return } - } - } else { - # Guess which program to run, by seeing which option was specified. - foreach p {objdump nm readelf addr2line} { - if {$opts($p) != ""} { - if {$dumpprogram != ""} { - perror "ambiguous dump program in $file.d" - unresolved $testname - return - } else { - set dumpprogram $p - } - } - } - } - if { $dumpprogram == "" && $opts(warning) == "" } { - perror "dump program unspecified in $file.d" - unresolved $testname - return - } - } - - # Handle skipping the test on specified targets. - # You can have both skip/noskip and target/notarget, but you can't - # have both skip and noskip, or target and notarget, in the same file. - if { $opts(skip) != "" } then { - if { $opts(noskip) != "" } then { - perror "$testname: mixing skip and noskip directives is invalid" - unresolved $testname - return - } - foreach glob $opts(skip) { - if {[match_target $glob]} { return } - } - } - if { $opts(noskip) != "" } then { - set skip 1 - foreach glob $opts(noskip) { - if {[match_target $glob]} { - set skip 0 - break - } - } - if {$skip} { return } - } - if { $opts(target) != "" } then { - if { $opts(notarget) != "" } then { - perror "$testname: mixing target and notarget directives is invalid" - unresolved $testname - return - } - set skip 1 - foreach glob $opts(target) { - if {[match_target $glob]} { - set skip 0 - break - } - } - if {$skip} { - unsupported $testname - return - } - } - if { $opts(notarget) != "" } then { - foreach glob $opts(notarget) { - if {[match_target $glob]} { - unsupported $testname - return - } - } - } - - # Setup xfailures. - foreach targ $opts(xfail) { - setup_xfail $targ - } - - if { $opts(source) == "" } { - set sourcefile ${file}.s - } else { - set sourcefile $srcdir/$subdir/$opts(source) - } - - if { $opts(dump) == "" } { - set dumpfile ${file}.d - } else { - set dumpfile $srcdir/$subdir/$opts(dump) - } - - set cmd "$AS $ASFLAGS $opts(as) -o dump.o $sourcefile" - send_log "$cmd\n" - set status [gas_host_run $cmd ""] - set cmdret [lindex $status 0] - set comp_output [prune_warnings [lindex $status 1]] - - set expmsg $opts(error) - if { $opts(warning) != "" } { - set expmsg $opts(warning) - } - if { $cmdret != 0 || $comp_output != "" || $expmsg != "" } then { - # If the executed program writes to stderr and stderr is not - # redirected, exec *always* returns failure, regardless of the - # program exit code. Thankfully, we can retrieve the true - # return status from a special variable. Redirection would - # cause a tcl-specific message to be appended, and we'd rather - # not deal with that if we can help it. - global errorCode - if { $cmdret != 0 && [lindex $errorCode 0] == "NONE" } { - set cmdret 0 - } - - set exitstat "succeeded" - if { $cmdret != 0 } { set exitstat "failed" } - - send_log "$comp_output\n" - verbose "$comp_output" 3 - if { $opts(warning_output) == "" } then { - if { [regexp $expmsg $comp_output] \ - && (($cmdret == 0) == ($opts(warning) != "")) } { - # We have the expected output from gas. - # Return if there's nothing more to do. - if { $opts(error) != "" || $dumpprogram == "" } { - pass $testname - return - } - } else { - verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>" - - fail $testname - return - } - } else { - catch {write_file dump.stderr "$comp_output"} write_output - if ![string match "" $write_output] then { - send_log "error writing dump.stderr: $write_output\n" - verbose "error writing dump.stderr: $write_output" 3 - send_log "$comp_output\n" - verbose "$comp_output" 3 - fail $testname - return - } - set stderrfile $srcdir/$subdir/$opts(warning_output) - verbose "wrote pruned stderr to dump.stderr" 3 - 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] { - pass $testname - return - } - } - fail $testname - verbose "pruned stderr is [file_contents "dump.stderr"]" 2 - return - } elseif { $opts(error_output) != "" } then { - pass $testname - return - } - } - } else { - if { $opts(error) != "" || $opts(error_output) != "" } { - fail $testname - } - } - - if { $dumpprogram == "" } { - return - } - set progopts1 $opts($dumpprogram) - eval set progopts \$[string toupper $dumpprogram]FLAGS - eval set binary \$[string toupper $dumpprogram] - - if { ![is_remote host] && [which $binary] == 0 } { - untested $testname - 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 != "" && $dumpprogram == "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 - - set cmd "$binary $progopts $progopts1 dump.o" - set redir ">dump.out" - send_log "$cmd\n" - set status [gas_host_run "$cmd" "$redir"] - set comp_output [prune_warnings [lindex $status 1]] - set comp_output [prune_warnings $comp_output] - if ![string match "" $comp_output] then { - send_log "$comp_output\n" - fail $testname - return - } - - # Create the substition list only for objdump reference. - if { $sect_names != "" && $dumpprogram == "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" "${dumpfile}" $regexp_subst] } then { - fail $testname - verbose "output is [file_contents "dump.out"]" 2 - return - } - - pass $testname -} - -proc slurp_options { file } { - if [catch { set f [open $file r] } x] { - #perror "couldn't open `$file': $x" - perror "$x" - return -1 - } - set opt_array {} - # whitespace expression - set ws {[ ]*} - set nws {[^ ]*} - # whitespace is ignored anywhere except within the options list; - # option names are alphanumeric plus underscore. - set pat "^#${ws}(\[a-zA-Z0-9_\]*)$ws:${ws}(.*)$ws\$" - while { [gets $f line] != -1 } { - set line [string trim $line] - # Whitespace here is space-tab. - if [regexp $pat $line xxx opt_name opt_val] { - # match! - lappend opt_array [list $opt_name $opt_val] - } elseif {![regexp "^#" $line ]} { - break - } - } - close $f - return $opt_array -} - proc objdump { opts } { global OBJDUMP global comp_output |