[testsuite] Allow multiple lines of "as" in testsuite.

Message ID VI1PR0801MB2014E9F7826E67FDBCB173C3E0680@VI1PR0801MB2014.eurprd08.prod.outlook.com
State New
Headers show
Series
  • [testsuite] Allow multiple lines of "as" in testsuite.
Related show

Commit Message

Matthew Malcomson Feb. 7, 2019, 6:20 p.m.
This allows checking the command line parsing more easily than before by
allowing many command line invokations from the same .d file.

Each line is used as a set of flags, and the tests are ran against the output
of the assembler with each set.
Each line of assembler is treated as another set of tests (as if the test file
were duplicated but with a different #as: line).

This patch includes some example uses where multiple testcases can be merged
into one file using this new functionality.

Regression done on aarch64-none-linux-gnu.

binutils/ChangeLog:

2019-02-07  Matthew Malcomson  <matthew.malcomson@arm.com>

	* testsuite/lib/binutils-common.exp: Allow multiple "as" lines.

gas/ChangeLog:

2019-02-07  Matthew Malcomson  <matthew.malcomson@arm.com>

	* testsuite/gas/aarch64/dotproduct.d: Use multiple "as" lines.
	* testsuite/gas/aarch64/dotproduct_armv8_4.d: Remove.
	* testsuite/gas/aarch64/dotproduct_armv8_4.s: Remove.
	* testsuite/gas/aarch64/illegal-dotproduct.d: Use multiple "as"
	lines.
	* testsuite/gas/aarch64/ldst-rcpc-armv8_2.d: Remove.
	* testsuite/gas/aarch64/ldst-rcpc.d: Use multiple "as" lines.



###############     `git diff -w` attached for ease of reply/read    ###############
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index bbbbfbe8adaeb2337f997d15e226fc28f0eb83c1..8c6f7ff0193fce23bd8bea8b6b2978865ec637d2 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -523,6 +523,8 @@ if ![string length [info proc prune_warnings]] {
 #	When assembling, pass FLAGS to the assembler.
 #	If assembling several files, you can pass different assembler
 #	options in the "source" directives.  See below.
+#       Multiple instances of this directive tells run_dump_test to run the test
+#       multiple times -- one time with each set of flags provided.
 #
 #   ld: FLAGS
 #	Link assembled files using FLAGS, in the order of the "source"
@@ -690,6 +692,8 @@ proc run_dump_test { name {extra_options {}} } {
     set opts(anyskip) {}
     set opts(ar) {}
     set opts(as) {}
+    set as_final_flags {}
+    set as_additional_flags {}
     set opts(dump) {}
     set opts(elfedit) {}
     set opts(error) {}
@@ -781,7 +785,9 @@ proc run_dump_test { name {extra_options {}} } {
 		lappend objfile_names $new_objfile
 	    }
 	    default {
-		if { !$in_extra && [string length $opts($opt_name)] } {
+		if { !$in_extra
+                     && [string length $opts($opt_name)]
+                     && $opt_name != "as" } {
 		    perror "option $opt_name multiply set in $file.d"
 		    unresolved $subdir/$name
 		    return
@@ -805,16 +811,35 @@ proc run_dump_test { name {extra_options {}} } {
 	    error {
 		append opts($opt_name) $opt_val
 	    }
+            as {
+                if { $in_extra } {
+                    set as_additional_flags $opt_val
+                } else {
+                    lappend opts(as) $opt_val
+                }
+            }
 	    default {
 		set opts($opt_name) [concat $opts($opt_name) $opt_val]
 	    }
 	}
     }
 
-    foreach opt { as ld } {
-	regsub {\[big_or_little_endian\]} $opts($opt) \
-	    [big_or_little_endian] opts($opt)
+    # Ensure there is something in $opts(as) for the lmap below.
+    if { [llength $opts(as)] == 0 } {
+        set opts(as) [list " "]
     }
+    set as_final_flags [lmap x $opts(as) {
+        if { [string length $x] && [string length $as_additional_flags] } {
+            append x " "
+        }
+        append x $as_additional_flags
+        regsub {\[big_or_little_endian\]} $x \
+            [big_or_little_endian] x
+        expr {$x}
+    }]
+
+    regsub {\[big_or_little_endian\]} $opts(ld) \
+        [big_or_little_endian] opts(ld)
 
     if { $opts(name) == "" } {
 	set testname "$subdir/$name"
@@ -947,334 +972,336 @@ proc run_dump_test { name {extra_options {}} } {
 	setup_xfail $targ
     }
 
-    # Assemble each file.
-    set objfiles {}
-    for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
-	set sourcefile [lindex $sourcefiles $i]
-	set sourceasflags [lindex $asflags $i]
-	set run_objcopy_objects 0
-
-	if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
-	    set run_objcopy_objects 1
-	}
-	regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
-
-	set objfile [lindex $objfile_names $i]
-	catch "exec rm -f $objfile" exec_output
-	lappend objfiles $objfile
-
-	if { $opts(as) == "binary" } {
-	    while {[file type $sourcefile] eq "link"} {
-		set newfile [file readlink $sourcefile]
-		if {[string index $newfile 0] ne "/"} {
-		    set newfile [file dirname $sourcefile]/$newfile
-		}
-		set sourcefile $newfile
-	    }
-	    set newfile [remote_download host $sourcefile $objfile]
-	    set cmdret 0
-	    if { $newfile == "" } {
-		set cmdret 1
-	    }
-	} else {
-	    if { [istarget "hppa*-*-*"] \
-		     && ![istarget "*-*-linux*"] \
-		     && ![istarget "*-*-netbsd*" ] } {
-		set cmd "sed -e 's/^\[	 \]*\.comm \\(\[^,\]*\\),\\(.*\\)/\\1 .comm \\2/' < $sourcefile > tmpdir/asm.s"
-		send_log "$cmd\n"
-		set cmdret [remote_exec host [concat sh -c [list "$cmd"]]]
-		set cmdret [lindex $cmdret 0]
-		if { $cmdret != 0 } {
-		    perror "sed failure"
-		    unresolved $testname
-		    return
-		}
-		set sourcefile tmpdir/asm.s
-	    }
-	    set cmd "$AS $ASFLAGS $opts(as) $sourceasflags -o $objfile $sourcefile"
-
-	    send_log "$cmd\n"
-	    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
-	    remote_upload host "dump.tmp"
-	    set comp_output [prune_warnings [file_contents "dump.tmp"]]
-	    remote_file host delete "dump.tmp"
-	    remote_file build delete "dump.tmp"
-	    set cmdret [lindex $cmdret 0]
-	}
-	if { $cmdret == 0 && $run_objcopy_objects } {
-	    set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
-
-	    send_log "$cmd\n"
-	    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
-			"" "/dev/null" "dump.tmp"]
-	    remote_upload host "dump.tmp"
-	    append comp_output [prune_warnings [file_contents "dump.tmp"]]
-	    remote_file host delete "dump.tmp"
-	    remote_file build delete "dump.tmp"
-	    set cmdret [lindex $cmdret 0]
-	}
-    }
-
-    # Perhaps link the file(s).
-    if { $cmdret == 0 && $run_ld } {
-	set objfile "tmpdir/dump"
-	catch "exec rm -f $objfile" exec_output
-
-	set ld_extra_opt ""
-	global ld
-	set ld "$LD"
-	if { [is_elf_format] && [check_shared_lib_support] } {
-	    set ld_extra_opt "$ld_elf_shared_opt"
-	}
-
-	# Add -L$srcdir/$subdir so that the linker command can use
-	# linker scripts in the source directory.
-	set cmd "$LD $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
+    foreach as_flags $as_final_flags {
+        # Assemble each file.
+        set objfiles {}
+        for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
+            set sourcefile [lindex $sourcefiles $i]
+            set sourceasflags [lindex $asflags $i]
+            set run_objcopy_objects 0
+
+            if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
+                set run_objcopy_objects 1
+            }
+            regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
+
+            set objfile [lindex $objfile_names $i]
+            catch "exec rm -f $objfile" exec_output
+            lappend objfiles $objfile
+
+            if { $as_flags == "binary" } {
+                while {[file type $sourcefile] eq "link"} {
+                    set newfile [file readlink $sourcefile]
+                    if {[string index $newfile 0] ne "/"} {
+                        set newfile [file dirname $sourcefile]/$newfile
+                    }
+                    set sourcefile $newfile
+                }
+                set newfile [remote_download host $sourcefile $objfile]
+                set cmdret 0
+                if { $newfile == "" } {
+                    set cmdret 1
+                }
+            } else {
+                if { [istarget "hppa*-*-*"] \
+                         && ![istarget "*-*-linux*"] \
+                         && ![istarget "*-*-netbsd*" ] } {
+                    set cmd "sed -e 's/^\[	 \]*\.comm \\(\[^,\]*\\),\\(.*\\)/\\1 .comm \\2/' < $sourcefile > tmpdir/asm.s"
+                    send_log "$cmd\n"
+                    set cmdret [remote_exec host [concat sh -c [list "$cmd"]]]
+                    set cmdret [lindex $cmdret 0]
+                    if { $cmdret != 0 } {
+                        perror "sed failure"
+                        unresolved $testname
+                        continue
+                    }
+                    set sourcefile tmpdir/asm.s
+                }
+                set cmd "$AS $ASFLAGS $as_flags $sourceasflags -o $objfile $sourcefile"
+
+                send_log "$cmd\n"
+                set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
+                remote_upload host "dump.tmp"
+                set comp_output [prune_warnings [file_contents "dump.tmp"]]
+                remote_file host delete "dump.tmp"
+                remote_file build delete "dump.tmp"
+                set cmdret [lindex $cmdret 0]
+            }
+            if { $cmdret == 0 && $run_objcopy_objects } {
+                set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
+
+                send_log "$cmd\n"
+                set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
+                                "" "/dev/null" "dump.tmp"]
+                remote_upload host "dump.tmp"
+                append comp_output [prune_warnings [file_contents "dump.tmp"]]
+                remote_file host delete "dump.tmp"
+                remote_file build delete "dump.tmp"
+                set cmdret [lindex $cmdret 0]
+            }
+        }
+
+        # Perhaps link the file(s).
+        if { $cmdret == 0 && $run_ld } {
+            set objfile "tmpdir/dump"
+            catch "exec rm -f $objfile" exec_output
+
+            set ld_extra_opt ""
+            global ld
+            set ld "$LD"
+            if { [is_elf_format] && [check_shared_lib_support] } {
+                set ld_extra_opt "$ld_elf_shared_opt"
+            }
+
+            # Add -L$srcdir/$subdir so that the linker command can use
+            # linker scripts in the source directory.
+            set cmd "$LD $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
 		   $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
 
-	# If needed then check for, or add a -Map option.
-	set mapfile ""
-	if { $opts(map) != "" } then {
-	    if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
-		# Found existing mapfile option
-		verbose -log "Existing mapfile '$mapfile' found"
-	    } else {
-		# No mapfile option.
-		set mapfile "tmpdir/dump.map"
-		verbose -log "Adding mapfile '$mapfile'"
-		set cmd "$cmd -Map=$mapfile"
-	    }
-	}
-
-	send_log "$cmd\n"
-	set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
-	remote_upload host "dump.tmp"
-	append comp_output [file_contents "dump.tmp"]
-	remote_file host delete "dump.tmp"
-	remote_file build delete "dump.tmp"
-	set cmdret [lindex $cmdret 0]
-
-	if { $cmdret == 0 && $run_objcopy } {
-	    set infile $objfile
-	    set objfile "tmpdir/dump1"
-	    remote_file host delete $objfile
-
-	    # Note that we don't use OBJCOPYFLAGS here; any flags must be
-	    # explicitly specified.
-	    set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
-
-	    send_log "$cmd\n"
-	    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
-	    remote_upload host "dump.tmp"
-	    append comp_output [file_contents "dump.tmp"]
-	    remote_file host delete "dump.tmp"
-	    remote_file build delete "dump.tmp"
-	    set cmdret [lindex $cmdret 0]
-	}
-    } else {
-	set objfile [lindex $objfiles 0]
-    }
-
-    if { $cmdret == 0 && $opts(PROG) != "" } {
-	set destopt ${copyfile}.o
-	switch -- $opts(PROG) {
-	    ar		{ set program ar }
-	    elfedit	{
-		set program elfedit
-		set destopt ""
-	    }
-	    nm		{ set program nm }
-	    objcopy	{ set program objcopy }
-	    ranlib	{ set program ranlib }
-	    strings	{ set program strings }
-	    strip	{
-		set program strip
-		set destopt "-o $destopt"
-	    }
-	    default	{
-		perror "unrecognized PROG option $opts(PROG) in $file.d"
-		unresolved $testname
-		return
-	    }
-	}
-
-	set progopts1 $opts($program)
-	eval set progopts \$[string toupper $program]FLAGS
-	eval set binary \$[string toupper $program]
-
-	if { ![is_remote host] && [which $binary] == 0 } {
-	    untested $testname
-	    return
-	}
-
-	verbose "running $binary $progopts $progopts1" 3
-	set cmd "$binary $progopts $progopts1 $objfile $destopt"
-
-	# Ensure consistent sorting of symbols
-	if {[info exists env(LC_ALL)]} {
-	    set old_lc_all $env(LC_ALL)
-	}
-	set env(LC_ALL) "C"
-	send_log "$cmd\n"
-	set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
-	set cmdret [lindex $cmdret 0]
-	remote_upload host "dump.tmp"
-	append comp_output [prune_warnings [file_contents "dump.tmp"]]
-	remote_file host delete "dump.tmp"
-	remote_file build delete "dump.tmp"
-	if {[info exists old_lc_all]} {
-	    set env(LC_ALL) $old_lc_all
-	} else {
-	    unset env(LC_ALL)
-	}
-	if { $destopt != "" } {
-	    set objfile ${copyfile}.o
-	}
+            # If needed then check for, or add a -Map option.
+            set mapfile ""
+            if { $opts(map) != "" } then {
+                if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
+                    # Found existing mapfile option
+                    verbose -log "Existing mapfile '$mapfile' found"
+                } else {
+                    # No mapfile option.
+                    set mapfile "tmpdir/dump.map"
+                    verbose -log "Adding mapfile '$mapfile'"
+                    set cmd "$cmd -Map=$mapfile"
+                }
+            }
+
+            send_log "$cmd\n"
+            set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
+            remote_upload host "dump.tmp"
+            append comp_output [file_contents "dump.tmp"]
+            remote_file host delete "dump.tmp"
+            remote_file build delete "dump.tmp"
+            set cmdret [lindex $cmdret 0]
+
+            if { $cmdret == 0 && $run_objcopy } {
+                set infile $objfile
+                set objfile "tmpdir/dump1"
+                remote_file host delete $objfile
+
+                # Note that we don't use OBJCOPYFLAGS here; any flags must be
+                # explicitly specified.
+                set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
+
+                send_log "$cmd\n"
+                set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
+                remote_upload host "dump.tmp"
+                append comp_output [file_contents "dump.tmp"]
+                remote_file host delete "dump.tmp"
+                remote_file build delete "dump.tmp"
+                set cmdret [lindex $cmdret 0]
+            }
+        } else {
+            set objfile [lindex $objfiles 0]
+        }
+
+        if { $cmdret == 0 && $opts(PROG) != "" } {
+            set destopt ${copyfile}.o
+            switch -- $opts(PROG) {
+                ar		{ set program ar }
+                elfedit	{
+                    set program elfedit
+                    set destopt ""
+                }
+                nm		{ set program nm }
+                objcopy	{ set program objcopy }
+                ranlib	{ set program ranlib }
+                strings	{ set program strings }
+                strip	{
+                    set program strip
+                    set destopt "-o $destopt"
+                }
+                default	{
+                    perror "unrecognized PROG option $opts(PROG) in $file.d"
+                    unresolved $testname
+                    continue
+                }
+            }
+
+            set progopts1 $opts($program)
+            eval set progopts \$[string toupper $program]FLAGS
+            eval set binary \$[string toupper $program]
+
+            if { ![is_remote host] && [which $binary] == 0 } {
+                untested $testname
+                continue
+            }
+
+            verbose "running $binary $progopts $progopts1" 3
+            set cmd "$binary $progopts $progopts1 $objfile $destopt"
+
+            # Ensure consistent sorting of symbols
+            if {[info exists env(LC_ALL)]} {
+                set old_lc_all $env(LC_ALL)
+            }
+            set env(LC_ALL) "C"
+            send_log "$cmd\n"
+            set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
+            set cmdret [lindex $cmdret 0]
+            remote_upload host "dump.tmp"
+            append comp_output [prune_warnings [file_contents "dump.tmp"]]
+            remote_file host delete "dump.tmp"
+            remote_file build delete "dump.tmp"
+            if {[info exists old_lc_all]} {
+                set env(LC_ALL) $old_lc_all
+            } else {
+                unset env(LC_ALL)
+            }
+            if { $destopt != "" } {
+                set objfile ${copyfile}.o
+            }
+        }
+
+        set want_out(source) ""
+        set want_out(terminal) 0
+        if { $err_warn } {
+            if { $opts(error) != "" || $opts(error_output) != "" } {
+                set want_out(terminal) 1
+            }
+
+            if { $opts(error) != "" || $opts(warning) != "" } {
+                set want_out(source) "regex"
+                if { $opts(error) != "" } {
+                    set want_out(regex) $opts(error)
+                } else {
+                    set want_out(regex) $opts(warning)
+                }
+            } else {
+                set want_out(source) "file"
+                if { $opts(error_output) != "" } {
+                    set want_out(file) $opts(error_output)
+                } else {
+                    set want_out(file) $opts(warning_output)
+                }
+            }
+        }
+
+        regsub "\n$" $comp_output "" comp_output
+        if { $cmdret != 0 || $comp_output != "" || $want_out(source) != "" } {
+            set exitstat "succeeded"
+            if { $cmdret != 0 } { set exitstat "failed" }
+
+            if { $want_out(source) == "regex" } {
+                verbose -log "$exitstat with: <$comp_output>, expected: <$want_out(regex)>"
+            } elseif { $want_out(source) == "file" } {
+                verbose -log "$exitstat with: <$comp_output>, expected in file $want_out(file)"
+                set_file_contents "tmpdir/ld.messages" "$comp_output"
+            } else {
+                verbose -log "$exitstat with: <$comp_output>, no expected output"
+            }
+
+            if { (($want_out(source) == "") == ($comp_output == "")) \
+                     && (($cmdret == 0) == ($want_out(terminal) == 0)) \
+                     && ((($want_out(source) == "regex") \
+                              && [regexp -- $want_out(regex) $comp_output]) \
+                             || (($want_out(source) == "file") \
+                                     && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$want_out(file)"]))) } {
+                # We have the expected output.
+                if { $want_out(terminal) || $dumpprogram == "" } {
+                    pass $testname
+                    continue
+                }
+            } else {
+                fail $testname
+                continue
+            }
+        }
+
+        # We must not have expected failure if we get here.
+        if { $opts(error) != "" } {
+            fail $testname
+            continue
+        }
+
+        if { $opts(map) != "" } then {
+            # Check the map file matches.
+            set map_pattern_file $srcdir/$subdir/$opts(map)
+            verbose -log "Compare '$mapfile' against '$map_pattern_file'"
+            if { [regexp_diff $mapfile $map_pattern_file] } then {
+                fail "$testname (map file check)"
+            } else {
+                pass "$testname (map file check)"
+            }
+
+            if { $dumpprogram == "" } then {
+                continue
+            }
+        }
+
+        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
+            continue
+        }
+
+        # For objdump of gas output, automatically translate standard section names
+        set sect_names ""
+        if { !$run_ld && $dumpprogram == "objdump" \
+                 && $opts(section_subst) != "no" \
+                 && ![string match "*-b binary*" $progopts1] } {
+            set sect_names [get_standard_section_names]
+            if { $sect_names != ""} {
+                regsub -- "\\.text" $progopts1 "[lindex $sect_names 0]" progopts1
+                regsub -- "\\.data" $progopts1 "[lindex $sect_names 1]" progopts1
+                regsub -- "\\.bss"  $progopts1 "[lindex $sect_names 2]" progopts1
+            }
+        }
+
+        if { $progopts1 == "" } { set $progopts1 "-r" }
+        verbose "running $binary $progopts $progopts1" 3
+
+        set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
+
+        # Ensure consistent sorting of symbols
+        if {[info exists env(LC_ALL)]} {
+            set old_lc_all $env(LC_ALL)
+        }
+        set env(LC_ALL) "C"
+        send_log "$cmd\n"
+        set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
+        set cmdret [lindex $cmdret 0]
+        remote_upload host "dump.tmp"
+        set comp_output [prune_warnings [file_contents "dump.tmp"]]
+        remote_file host delete "dump.tmp"
+        remote_file build delete "dump.tmp"
+        if {[info exists old_lc_all]} {
+            set env(LC_ALL) $old_lc_all
+        } else {
+            unset env(LC_ALL)
+        }
+        if { $cmdret != 0 || $comp_output != "" } {
+            send_log "exited abnormally with $cmdret, output:$comp_output\n"
+            fail $testname
+            continue
+        }
+
+        if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
+
+        # Create the substition list for objdump output.
+        set regexp_subst ""
+        if { $sect_names != "" } {
+            set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \
+                                  "\\\\?\\.data" [lindex $sect_names 1] \
+                                  "\\\\?\\.bss" [lindex $sect_names 2] ]
+        }
+
+        if { [regexp_diff $dumpfile "${dfile}" $regexp_subst] } then {
+            fail $testname
+            if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
+            continue
+        }
+
+        pass $testname
     }
-
-    set want_out(source) ""
-    set want_out(terminal) 0
-    if { $err_warn } {
-	if { $opts(error) != "" || $opts(error_output) != "" } {
-	    set want_out(terminal) 1
-	}
-
-	if { $opts(error) != "" || $opts(warning) != "" } {
-	    set want_out(source) "regex"
-	    if { $opts(error) != "" } {
-		set want_out(regex) $opts(error)
-	    } else {
-		set want_out(regex) $opts(warning)
-	    }
-	} else {
-	    set want_out(source) "file"
-	    if { $opts(error_output) != "" } {
-		set want_out(file) $opts(error_output)
-	    } else {
-		set want_out(file) $opts(warning_output)
-	    }
-	}
-    }
-
-    regsub "\n$" $comp_output "" comp_output
-    if { $cmdret != 0 || $comp_output != "" || $want_out(source) != "" } {
-	set exitstat "succeeded"
-	if { $cmdret != 0 } { set exitstat "failed" }
-
-	if { $want_out(source) == "regex" } {
-	    verbose -log "$exitstat with: <$comp_output>, expected: <$want_out(regex)>"
-	} elseif { $want_out(source) == "file" } {
-	    verbose -log "$exitstat with: <$comp_output>, expected in file $want_out(file)"
-	    set_file_contents "tmpdir/ld.messages" "$comp_output"
-	} else {
-	    verbose -log "$exitstat with: <$comp_output>, no expected output"
-	}
-
-	if { (($want_out(source) == "") == ($comp_output == "")) \
-	     && (($cmdret == 0) == ($want_out(terminal) == 0)) \
-	     && ((($want_out(source) == "regex") \
-		  && [regexp -- $want_out(regex) $comp_output]) \
-		 || (($want_out(source) == "file") \
-		     && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$want_out(file)"]))) } {
-	    # We have the expected output.
-	    if { $want_out(terminal) || $dumpprogram == "" } {
-		pass $testname
-		return
-	    }
-	} else {
-	    fail $testname
-	    return
-	}
-    }
-
-    # We must not have expected failure if we get here.
-    if { $opts(error) != "" } {
-	fail $testname
-	return
-    }
-
-    if { $opts(map) != "" } then {
-	# Check the map file matches.
-	set map_pattern_file $srcdir/$subdir/$opts(map)
-	verbose -log "Compare '$mapfile' against '$map_pattern_file'"
-	if { [regexp_diff $mapfile $map_pattern_file] } then {
-	    fail "$testname (map file check)"
-	} else {
-	    pass "$testname (map file check)"
-	}
-
-	if { $dumpprogram == "" } then {
-	    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 of gas output, automatically translate standard section names
-    set sect_names ""
-    if { !$run_ld && $dumpprogram == "objdump" \
-	     && $opts(section_subst) != "no" \
-	     && ![string match "*-b binary*" $progopts1] } {
-	set sect_names [get_standard_section_names]
-	if { $sect_names != ""} {
-	    regsub -- "\\.text" $progopts1 "[lindex $sect_names 0]" progopts1
-	    regsub -- "\\.data" $progopts1 "[lindex $sect_names 1]" progopts1
-	    regsub -- "\\.bss"  $progopts1 "[lindex $sect_names 2]" progopts1
-	}
-    }
-
-    if { $progopts1 == "" } { set $progopts1 "-r" }
-    verbose "running $binary $progopts $progopts1" 3
-
-    set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
-
-    # Ensure consistent sorting of symbols
-    if {[info exists env(LC_ALL)]} {
-	set old_lc_all $env(LC_ALL)
-    }
-    set env(LC_ALL) "C"
-    send_log "$cmd\n"
-    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
-    set cmdret [lindex $cmdret 0]
-    remote_upload host "dump.tmp"
-    set comp_output [prune_warnings [file_contents "dump.tmp"]]
-    remote_file host delete "dump.tmp"
-    remote_file build delete "dump.tmp"
-    if {[info exists old_lc_all]} {
-	set env(LC_ALL) $old_lc_all
-    } else {
-	unset env(LC_ALL)
-    }
-    if { $cmdret != 0 || $comp_output != "" } {
-	send_log "exited abnormally with $cmdret, output:$comp_output\n"
-	fail $testname
-	return
-    }
-
-    if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
-
-    # Create the substition list for objdump output.
-    set regexp_subst ""
-    if { $sect_names != "" } {
-	set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \
-			      "\\\\?\\.data" [lindex $sect_names 1] \
-			      "\\\\?\\.bss" [lindex $sect_names 2] ]
-    }
-
-    if { [regexp_diff $dumpfile "${dfile}" $regexp_subst] } then {
-	fail $testname
-	if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
-	return
-    }
-
-    pass $testname
 }
 
 proc slurp_options { file } {
diff --git a/gas/testsuite/gas/aarch64/dotproduct.d b/gas/testsuite/gas/aarch64/dotproduct.d
index 54ac62be634890f57d6c1d84d57db42629359ca9..fd2f0ebf4c66de3e9bd3e831c8cb9828cae932aa 100644
--- a/gas/testsuite/gas/aarch64/dotproduct.d
+++ b/gas/testsuite/gas/aarch64/dotproduct.d
@@ -1,4 +1,5 @@
 #as: -march=armv8.2-a+dotprod
+#as: -march=armv8.4-a
 #objdump: -dr
 
 .*:     file format .*
diff --git a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d b/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d
deleted file mode 100644
index 121eb11bb40a12b57ebf1f52beaeade1bdb29e16..0000000000000000000000000000000000000000
--- a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d
+++ /dev/null
@@ -1,10 +0,0 @@
-#as: -march=armv8.4-a
-#objdump: -dr
-
-.*:     file format .*
-
-Disassembly of section \.text:
-
-0+ <.*>:
-[^:]+:\s+2e809400 	udot	v0.2s, v0.8b, v0.8b
-[^:]+:\s+2e8b9400 	udot	v0.2s, v0.8b, v11.8b
diff --git a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s b/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s
deleted file mode 100644
index 37538d9bb8270832a003a27e89e3f2d0e6ab44c0..0000000000000000000000000000000000000000
--- a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s
+++ /dev/null
@@ -1,2 +0,0 @@
-UDOT	V0.2S, V0.8B, V0.8B
-UDOT	V0.2S, V0.8B, V11.8B
diff --git a/gas/testsuite/gas/aarch64/illegal-dotproduct.d b/gas/testsuite/gas/aarch64/illegal-dotproduct.d
index 3f8928da83bb64891528cf5860236f4b73c184b8..0e15b9fbed4f90dd9d68c1923f73239e73dcde20 100644
--- a/gas/testsuite/gas/aarch64/illegal-dotproduct.d
+++ b/gas/testsuite/gas/aarch64/illegal-dotproduct.d
@@ -1,4 +1,5 @@
 #as: -march=armv8.2-a+dotprod
+#as: -march=armv8.4-a
 #name: Invalid dotproduct instructions.
 #source: illegal-dotproduct.s
 #error_output: illegal-dotproduct.l
diff --git a/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d b/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d
deleted file mode 100644
index ac8938fc086c6d55170d1de2900420fbe70881d3..0000000000000000000000000000000000000000
--- a/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d
+++ /dev/null
@@ -1,21 +0,0 @@
-#objdump: -dr
-#as: -march=armv8.2-a+rcpc
-#source: ldst-rcpc.s
-
-.*:     file format .*
-
-Disassembly of section \.text:
-
-0+ <.*>:
-   0:	38bfc0e1 	ldaprb	w1, \[x7\]
-   4:	38bfc0e1 	ldaprb	w1, \[x7\]
-   8:	38bfc0e1 	ldaprb	w1, \[x7\]
-   c:	78bfc0e1 	ldaprh	w1, \[x7\]
-  10:	78bfc0e1 	ldaprh	w1, \[x7\]
-  14:	78bfc0e1 	ldaprh	w1, \[x7\]
-  18:	b8bfc0e1 	ldapr	w1, \[x7\]
-  1c:	b8bfc0e1 	ldapr	w1, \[x7\]
-  20:	b8bfc0e1 	ldapr	w1, \[x7\]
-  24:	f8bfc0e1 	ldapr	x1, \[x7\]
-  28:	f8bfc0e1 	ldapr	x1, \[x7\]
-  2c:	f8bfc0e1 	ldapr	x1, \[x7\]
diff --git a/gas/testsuite/gas/aarch64/ldst-rcpc.d b/gas/testsuite/gas/aarch64/ldst-rcpc.d
index 73a0c9f6960126b7cf04f84aaaa4d6ecb4933bc7..f9e951bdcb49ce1e7e1be57f37cf0e1938a2fc8a 100644
--- a/gas/testsuite/gas/aarch64/ldst-rcpc.d
+++ b/gas/testsuite/gas/aarch64/ldst-rcpc.d
@@ -1,5 +1,7 @@
 #objdump: -dr
 #as: -march=armv8.3-a
+#as: -march=armv8.2-a+rcpc
+#source: ldst-rcpc.s
 
 .*:     file format .*

Comments

Alan Modra Feb. 13, 2019, 6:51 a.m. | #1
On Thu, Feb 07, 2019 at 06:20:19PM +0000, Matthew Malcomson wrote:
> This allows checking the command line parsing more easily than before by

> allowing many command line invokations from the same .d file.


It seems to me that you can do this by writing a wrapper that invokes
run_dump_test, once for each of the multiple "as" options, passing
them in extra_options.

Another solution is to use the "#dump:" and "#source:" options from a
stub .d file, eg. gas/testsuite/gas/i386/ilp32/x86-64-opts.d

Did you consider something along those lines instead?

-- 
Alan Modra
Australia Development Lab, IBM
Matthew Malcomson Feb. 13, 2019, 10:47 a.m. | #2
On 13/02/19 06:51, Alan Modra wrote:
> On Thu, Feb 07, 2019 at 06:20:19PM +0000, Matthew Malcomson wrote:

>> This allows checking the command line parsing more easily than before by

>> allowing many command line invokations from the same .d file.

> 

> It seems to me that you can do this by writing a wrapper that invokes

> run_dump_test, once for each of the multiple "as" options, passing

> them in extra_options.

> 

> Another solution is to use the "#dump:" and "#source:" options from a

> stub .d file, eg. gas/testsuite/gas/i386/ilp32/x86-64-opts.d

> 

> Did you consider something along those lines instead?

> 

Hi Alan,

I had considered the '#dump:' and '#source:' options, but I hadn't 
thought of using a wrapper (I'm not sure what the wrapper would look like).


My aim was to avoid having to create a new file for each assembler 
command line test, so I went with this to make it as easy as possible to 
run with multiple gas options.

I was doing some not yet released work and caught myself being lazy and 
testing only a few command line combinations to avoid creating ~8 extra 
stub files, so I thought this might be a solution.
(n.b. at the time I was working off an older branch where the 
run_dump_test procedure hadn't been shared between all testsuites, so 
treating "as" specially was more natural).


I guess by a wrapper you mean something like the below in a local TCL file.

if { [file-is-x] } { run-many-with-gas-opts "....." }
elseif { [file-is-y] } { run-many-with-gas-opts "...." }
elseif ...

I think the extra lines in a .d file makes what's happening clearer and 
is easier to use, but since this avoids complicating the run_dump_test 
procedure any more the wrapper makes a lot of sense too.

Cheers,
Matthew
Nick Clifton Feb. 21, 2019, 11:57 a.m. | #3
Hi Matthew,

> Each line is used as a set of flags, and the tests are ran against the output

> of the assembler with each set.

> Each line of assembler is treated as another set of tests (as if the test file

> were duplicated but with a different #as: line).


Presumably it is not possible to make the DUMPPROG conditional upon the particular
test being run, nor is it possible to make the regexp expressions conditional either ?
(I am not complaining about this, but I think that this should be made clear in
the comments that accompany the description of the AS option.

What happens if the SOURCE option is used with a set of flags of its own ?  Are
these flags combined with the flags for each of the AS options, or do they override
them ?  If they are combined, which set of flags comes first on the command line ?

If the LD or OBJCOPY options are also present in the .d file will these be run
multiple times as well, once for each AS line ?

On the whole however I would have to say that I like the idea of the patch.  I
just think that it needs a few more comments to make things clearer.

Cheers
  Nick
Matthew Malcomson Feb. 21, 2019, 2:50 p.m. | #4
> Hi Matthew,

> 

>> Each line is used as a set of flags, and the tests are ran against the output

>> of the assembler with each set.

>> Each line of assembler is treated as another set of tests (as if the test file

>> were duplicated but with a different #as: line).

> 


Hi Nick, thanks for taking a look.

> Presumably it is not possible to make the DUMPPROG conditional upon the particular

> test being run, nor is it possible to make the regexp expressions conditional either ?

> (I am not complaining about this, but I think that this should be made clear in

> the comments that accompany the description of the AS option.

> 


Yes this is correct.

> What happens if the SOURCE option is used with a set of flags of its own ?  Are

> these flags combined with the flags for each of the AS options, or do they override

> them ?  If they are combined, which set of flags comes first on the command line ?

> 


The extra flags for the SOURCE option are appended to the flags for each of the
AS options, this is to maintain the current behaviour for just one AS option.

> If the LD or OBJCOPY options are also present in the .d file will these be run

> multiple times as well, once for each AS line ?

> 

Yes, they would be run multiple times.

> On the whole however I would have to say that I like the idea of the patch.  I

> just think that it needs a few more comments to make things clearer.

> 

> Cheers

>   Nick

> 


Great, would the attached extra comments be OK?

Cheers,
Matthew


############     Attachment also inlined for easy reply/reading    ###########


diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index 8c6f7ff..a501cf4 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -525,6 +525,11 @@ if ![string length [info proc prune_warnings]] {
 #	options in the "source" directives.  See below.
 #       Multiple instances of this directive tells run_dump_test to run the test
 #       multiple times -- one time with each set of flags provided.
+#       Each instance will run exactly as a file with a single "as" line, it is
+#       not possible to condition any behaviour on which set of "as" flags is
+#       used.  That means that the "source" specific options are appended to
+#       the "as" flags for their corresponding files, and any extra processing
+#       (e.g. with "ld" and "objcopy") is repeated for each test.
 #
 #   ld: FLAGS
 #	Link assembled files using FLAGS, in the order of the "source"
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index 8c6f7ff..a501cf4 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -525,6 +525,11 @@ if ![string length [info proc prune_warnings]] {
 #	options in the "source" directives.  See below.
 #       Multiple instances of this directive tells run_dump_test to run the test
 #       multiple times -- one time with each set of flags provided.
+#       Each instance will run exactly as a file with a single "as" line, it is
+#       not possible to condition any behaviour on which set of "as" flags is
+#       used.  That means that the "source" specific options are appended to
+#       the "as" flags for their corresponding files, and any extra processing
+#       (e.g. with "ld" and "objcopy") is repeated for each test.
 #
 #   ld: FLAGS
 #	Link assembled files using FLAGS, in the order of the "source"
Nick Clifton Feb. 21, 2019, 3:49 p.m. | #5
Hi Matthew,

> Great, would the attached extra comments be OK?


In theory yes.  In practice no.  Actually it is not the extra comments
that are the problem, but the original patch.  Now that I have tested
it locally, I found that it introduces some new testsuite failures. :-(

For example:

Checking Binutils in: s390-linux ... GAS REGRESSION: s390x opcode   

Checking Binutils in: mips64-linux ... LD REGRESSION: ld-mips-elf/no-shared-1-n64    
  LD REGRESSION: MIPS ELF got reloc n64
  LD REGRESSION: MIPS ELF xgot reloc n64
  LD REGRESSION: MIPS rel32 o32  
  LD REGRESSION: MIPS rel64 n64  
  LD REGRESSION: PIC and non-PIC test 3
  LD REGRESSION: PIC and non-PIC test 4
 
(These failures also show up when testing a toolchain configured with
 mipsel-linux-gnu and also with mipsisa32el-linux-gnu).

The worst affected toolchain however is the PowerPC:

 powerpc-ibm-aix5.2.0 ... LD ERROR: powerpc-ibm-aix5.2.0-readelf does not exist 
  LD REGRESSION: --gc-sections -r without -e 
  LD ERROR: powerpc-ibm-aix5.2.0-as does not exist 
  LD ERROR: /work/sources/binutils/current/ld/testsuite/ld-libs/lib-1.s: assembly failed  
  LD ERROR: powerpc-ibm-aix5.2.0-as does not exist 
  LD ERROR: /work/sources/binutils/current/ld/testsuite/ld-libs/lib-2.s: assembly failed  
  LD ERROR: powerpc-ibm-aix5.2.0-as does not exist 
  LD ERROR: /work/sources/binutils/current/ld/testsuite/ld-misc/start.s: assembly failed  
  LD ERROR: powerpc-ibm-aix5.2.0-as does not exist 
  [...and so on, there are lots more like this...]

Please could you have a look at these.  I suspect that the S390 and MIPS failures
might be due to a variable being set by a previous test which is not cleared before
the failing test runs.  (But this is just a guess).  The PowerPC ones all appear to
be because the new code is not checking for the presence of a locally built assembler
rather than one installed into the execution path.  But again that is just off the
top of my head.

Cheers
  Nick
Matthew Malcomson Feb. 21, 2019, 6:45 p.m. | #6
On 21/02/19 15:49, Nick Clifton wrote:
> Hi Matthew,

> 

>> Great, would the attached extra comments be OK?

> 

> In theory yes.  In practice no.  Actually it is not the extra comments

> that are the problem, but the original patch.  Now that I have tested

> it locally, I found that it introduces some new testsuite failures. :-(

> 

> For example:

> 

> Checking Binutils in: s390-linux ... GAS REGRESSION: s390x opcode

> 

> Checking Binutils in: mips64-linux ... LD REGRESSION: ld-mips-elf/no-shared-1-n64

>    LD REGRESSION: MIPS ELF got reloc n64

>    LD REGRESSION: MIPS ELF xgot reloc n64

>    LD REGRESSION: MIPS rel32 o32

>    LD REGRESSION: MIPS rel64 n64

>    LD REGRESSION: PIC and non-PIC test 3

>    LD REGRESSION: PIC and non-PIC test 4

>   

> (These failures also show up when testing a toolchain configured with

>   mipsel-linux-gnu and also with mipsisa32el-linux-gnu).

> 

> The worst affected toolchain however is the PowerPC:

> 

>   powerpc-ibm-aix5.2.0 ... LD ERROR: powerpc-ibm-aix5.2.0-readelf does not exist

>    LD REGRESSION: --gc-sections -r without -e

>    LD ERROR: powerpc-ibm-aix5.2.0-as does not exist

>    LD ERROR: /work/sources/binutils/current/ld/testsuite/ld-libs/lib-1.s: assembly failed

>    LD ERROR: powerpc-ibm-aix5.2.0-as does not exist

>    LD ERROR: /work/sources/binutils/current/ld/testsuite/ld-libs/lib-2.s: assembly failed

>    LD ERROR: powerpc-ibm-aix5.2.0-as does not exist

>    LD ERROR: /work/sources/binutils/current/ld/testsuite/ld-misc/start.s: assembly failed

>    LD ERROR: powerpc-ibm-aix5.2.0-as does not exist

>    [...and so on, there are lots more like this...]

> 

> Please could you have a look at these.  I suspect that the S390 and MIPS failures

> might be due to a variable being set by a previous test which is not cleared before

> the failing test runs.  (But this is just a guess).  The PowerPC ones all appear to

> be because the new code is not checking for the presence of a locally built assembler

> rather than one installed into the execution path.  But again that is just off the

> top of my head.

> 

> Cheers

>    Nick

> 


Thanks for catching that -- I didn't think to look into other 
configurations (oops!)

It looks like the problem for the mips toolchains was due to me not 
handling multiple extra "as" flags passed directly in the TCL function, 
and this is an easy fix.


I'm having trouble reproducing the PowerPC errors, what was the target 
triple?
You mentioned it might be a problem with choosing which assembler to use 
-- does that mean you have one on the execution pass?

I've attached the patch with the fix for the mips toolchains, hopefully 
that would fix the PowerPC problems, but I'll have a harder look at 
reproducing the PowerPC problems tomorrow.


Cheers,
Matthew
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index bbbbfbe8adaeb2337f997d15e226fc28f0eb83c1..9171ad68da28cf76f625bb6f732b94d787417324 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -523,6 +523,13 @@ if ![string length [info proc prune_warnings]] {
 #	When assembling, pass FLAGS to the assembler.
 #	If assembling several files, you can pass different assembler
 #	options in the "source" directives.  See below.
+#       Multiple instances of this directive tells run_dump_test to run the test
+#       multiple times -- one time with each set of flags provided.
+#       Each instance will run exactly as a file with a single "as" line, it is
+#       not possible to condition any behaviour on which set of "as" flags is
+#       used.  That means that the "source" specific options are appended to
+#       the "as" flags for their corresponding files, and any extra processing
+#       (e.g. with "ld" and "objcopy") is repeated for each test.
 #
 #   ld: FLAGS
 #	Link assembled files using FLAGS, in the order of the "source"
@@ -690,6 +697,8 @@ proc run_dump_test { name {extra_options {}} } {
     set opts(anyskip) {}
     set opts(ar) {}
     set opts(as) {}
+    set as_final_flags {}
+    set as_additional_flags {}
     set opts(dump) {}
     set opts(elfedit) {}
     set opts(error) {}
@@ -781,7 +790,9 @@ proc run_dump_test { name {extra_options {}} } {
 		lappend objfile_names $new_objfile
 	    }
 	    default {
-		if { !$in_extra && [string length $opts($opt_name)] } {
+		if { !$in_extra
+                     && [string length $opts($opt_name)]
+                     && $opt_name != "as" } {
 		    perror "option $opt_name multiply set in $file.d"
 		    unresolved $subdir/$name
 		    return
@@ -805,16 +816,35 @@ proc run_dump_test { name {extra_options {}} } {
 	    error {
 		append opts($opt_name) $opt_val
 	    }
+            as {
+                if { $in_extra } {
+                    set as_additional_flags [concat $as_additional_flags $opt_val]
+                } else {
+                    lappend opts(as) $opt_val
+                }
+            }
 	    default {
 		set opts($opt_name) [concat $opts($opt_name) $opt_val]
 	    }
 	}
     }
 
-    foreach opt { as ld } {
-	regsub {\[big_or_little_endian\]} $opts($opt) \
-	    [big_or_little_endian] opts($opt)
+    # Ensure there is something in $opts(as) for the lmap below.
+    if { [llength $opts(as)] == 0 } {
+        set opts(as) [list " "]
     }
+    set as_final_flags [lmap x $opts(as) {
+        if { [string length $x] && [string length $as_additional_flags] } {
+            append x " "
+        }
+        append x $as_additional_flags
+        regsub {\[big_or_little_endian\]} $x \
+            [big_or_little_endian] x
+        expr {$x}
+    }]
+
+    regsub {\[big_or_little_endian\]} $opts(ld) \
+        [big_or_little_endian] opts(ld)
 
     if { $opts(name) == "" } {
 	set testname "$subdir/$name"
@@ -947,334 +977,336 @@ proc run_dump_test { name {extra_options {}} } {
 	setup_xfail $targ
     }
 
-    # Assemble each file.
-    set objfiles {}
-    for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
-	set sourcefile [lindex $sourcefiles $i]
-	set sourceasflags [lindex $asflags $i]
-	set run_objcopy_objects 0
-
-	if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
-	    set run_objcopy_objects 1
-	}
-	regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
-
-	set objfile [lindex $objfile_names $i]
-	catch "exec rm -f $objfile" exec_output
-	lappend objfiles $objfile
-
-	if { $opts(as) == "binary" } {
-	    while {[file type $sourcefile] eq "link"} {
-		set newfile [file readlink $sourcefile]
-		if {[string index $newfile 0] ne "/"} {
-		    set newfile [file dirname $sourcefile]/$newfile
-		}
-		set sourcefile $newfile
-	    }
-	    set newfile [remote_download host $sourcefile $objfile]
-	    set cmdret 0
-	    if { $newfile == "" } {
-		set cmdret 1
-	    }
-	} else {
-	    if { [istarget "hppa*-*-*"] \
-		     && ![istarget "*-*-linux*"] \
-		     && ![istarget "*-*-netbsd*" ] } {
-		set cmd "sed -e 's/^\[	 \]*\.comm \\(\[^,\]*\\),\\(.*\\)/\\1 .comm \\2/' < $sourcefile > tmpdir/asm.s"
-		send_log "$cmd\n"
-		set cmdret [remote_exec host [concat sh -c [list "$cmd"]]]
-		set cmdret [lindex $cmdret 0]
-		if { $cmdret != 0 } {
-		    perror "sed failure"
-		    unresolved $testname
-		    return
-		}
-		set sourcefile tmpdir/asm.s
-	    }
-	    set cmd "$AS $ASFLAGS $opts(as) $sourceasflags -o $objfile $sourcefile"
-
-	    send_log "$cmd\n"
-	    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
-	    remote_upload host "dump.tmp"
-	    set comp_output [prune_warnings [file_contents "dump.tmp"]]
-	    remote_file host delete "dump.tmp"
-	    remote_file build delete "dump.tmp"
-	    set cmdret [lindex $cmdret 0]
-	}
-	if { $cmdret == 0 && $run_objcopy_objects } {
-	    set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
-
-	    send_log "$cmd\n"
-	    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
-			"" "/dev/null" "dump.tmp"]
-	    remote_upload host "dump.tmp"
-	    append comp_output [prune_warnings [file_contents "dump.tmp"]]
-	    remote_file host delete "dump.tmp"
-	    remote_file build delete "dump.tmp"
-	    set cmdret [lindex $cmdret 0]
-	}
-    }
-
-    # Perhaps link the file(s).
-    if { $cmdret == 0 && $run_ld } {
-	set objfile "tmpdir/dump"
-	catch "exec rm -f $objfile" exec_output
-
-	set ld_extra_opt ""
-	global ld
-	set ld "$LD"
-	if { [is_elf_format] && [check_shared_lib_support] } {
-	    set ld_extra_opt "$ld_elf_shared_opt"
-	}
-
-	# Add -L$srcdir/$subdir so that the linker command can use
-	# linker scripts in the source directory.
-	set cmd "$LD $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
+    foreach as_flags $as_final_flags {
+        # Assemble each file.
+        set objfiles {}
+        for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
+            set sourcefile [lindex $sourcefiles $i]
+            set sourceasflags [lindex $asflags $i]
+            set run_objcopy_objects 0
+
+            if { [string match "*RUN_OBJCOPY*" $sourceasflags] } {
+                set run_objcopy_objects 1
+            }
+            regsub "RUN_OBJCOPY" $sourceasflags "" sourceasflags
+
+            set objfile [lindex $objfile_names $i]
+            catch "exec rm -f $objfile" exec_output
+            lappend objfiles $objfile
+
+            if { $as_flags == "binary" } {
+                while {[file type $sourcefile] eq "link"} {
+                    set newfile [file readlink $sourcefile]
+                    if {[string index $newfile 0] ne "/"} {
+                        set newfile [file dirname $sourcefile]/$newfile
+                    }
+                    set sourcefile $newfile
+                }
+                set newfile [remote_download host $sourcefile $objfile]
+                set cmdret 0
+                if { $newfile == "" } {
+                    set cmdret 1
+                }
+            } else {
+                if { [istarget "hppa*-*-*"] \
+                         && ![istarget "*-*-linux*"] \
+                         && ![istarget "*-*-netbsd*" ] } {
+                    set cmd "sed -e 's/^\[	 \]*\.comm \\(\[^,\]*\\),\\(.*\\)/\\1 .comm \\2/' < $sourcefile > tmpdir/asm.s"
+                    send_log "$cmd\n"
+                    set cmdret [remote_exec host [concat sh -c [list "$cmd"]]]
+                    set cmdret [lindex $cmdret 0]
+                    if { $cmdret != 0 } {
+                        perror "sed failure"
+                        unresolved $testname
+                        continue
+                    }
+                    set sourcefile tmpdir/asm.s
+                }
+                set cmd "$AS $ASFLAGS $as_flags $sourceasflags -o $objfile $sourcefile"
+
+                send_log "$cmd\n"
+                set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
+                remote_upload host "dump.tmp"
+                set comp_output [prune_warnings [file_contents "dump.tmp"]]
+                remote_file host delete "dump.tmp"
+                remote_file build delete "dump.tmp"
+                set cmdret [lindex $cmdret 0]
+            }
+            if { $cmdret == 0 && $run_objcopy_objects } {
+                set cmd "$OBJCOPY $opts(objcopy_objects) $objfile"
+
+                send_log "$cmd\n"
+                set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] \
+                                "" "/dev/null" "dump.tmp"]
+                remote_upload host "dump.tmp"
+                append comp_output [prune_warnings [file_contents "dump.tmp"]]
+                remote_file host delete "dump.tmp"
+                remote_file build delete "dump.tmp"
+                set cmdret [lindex $cmdret 0]
+            }
+        }
+
+        # Perhaps link the file(s).
+        if { $cmdret == 0 && $run_ld } {
+            set objfile "tmpdir/dump"
+            catch "exec rm -f $objfile" exec_output
+
+            set ld_extra_opt ""
+            global ld
+            set ld "$LD"
+            if { [is_elf_format] && [check_shared_lib_support] } {
+                set ld_extra_opt "$ld_elf_shared_opt"
+            }
+
+            # Add -L$srcdir/$subdir so that the linker command can use
+            # linker scripts in the source directory.
+            set cmd "$LD $ld_extra_opt $LDFLAGS -L$srcdir/$subdir \
 		   $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"
 
-	# If needed then check for, or add a -Map option.
-	set mapfile ""
-	if { $opts(map) != "" } then {
-	    if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
-		# Found existing mapfile option
-		verbose -log "Existing mapfile '$mapfile' found"
-	    } else {
-		# No mapfile option.
-		set mapfile "tmpdir/dump.map"
-		verbose -log "Adding mapfile '$mapfile'"
-		set cmd "$cmd -Map=$mapfile"
-	    }
-	}
-
-	send_log "$cmd\n"
-	set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
-	remote_upload host "dump.tmp"
-	append comp_output [file_contents "dump.tmp"]
-	remote_file host delete "dump.tmp"
-	remote_file build delete "dump.tmp"
-	set cmdret [lindex $cmdret 0]
-
-	if { $cmdret == 0 && $run_objcopy } {
-	    set infile $objfile
-	    set objfile "tmpdir/dump1"
-	    remote_file host delete $objfile
-
-	    # Note that we don't use OBJCOPYFLAGS here; any flags must be
-	    # explicitly specified.
-	    set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
-
-	    send_log "$cmd\n"
-	    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
-	    remote_upload host "dump.tmp"
-	    append comp_output [file_contents "dump.tmp"]
-	    remote_file host delete "dump.tmp"
-	    remote_file build delete "dump.tmp"
-	    set cmdret [lindex $cmdret 0]
-	}
-    } else {
-	set objfile [lindex $objfiles 0]
-    }
-
-    if { $cmdret == 0 && $opts(PROG) != "" } {
-	set destopt ${copyfile}.o
-	switch -- $opts(PROG) {
-	    ar		{ set program ar }
-	    elfedit	{
-		set program elfedit
-		set destopt ""
-	    }
-	    nm		{ set program nm }
-	    objcopy	{ set program objcopy }
-	    ranlib	{ set program ranlib }
-	    strings	{ set program strings }
-	    strip	{
-		set program strip
-		set destopt "-o $destopt"
-	    }
-	    default	{
-		perror "unrecognized PROG option $opts(PROG) in $file.d"
-		unresolved $testname
-		return
-	    }
-	}
-
-	set progopts1 $opts($program)
-	eval set progopts \$[string toupper $program]FLAGS
-	eval set binary \$[string toupper $program]
-
-	if { ![is_remote host] && [which $binary] == 0 } {
-	    untested $testname
-	    return
-	}
-
-	verbose "running $binary $progopts $progopts1" 3
-	set cmd "$binary $progopts $progopts1 $objfile $destopt"
-
-	# Ensure consistent sorting of symbols
-	if {[info exists env(LC_ALL)]} {
-	    set old_lc_all $env(LC_ALL)
-	}
-	set env(LC_ALL) "C"
-	send_log "$cmd\n"
-	set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
-	set cmdret [lindex $cmdret 0]
-	remote_upload host "dump.tmp"
-	append comp_output [prune_warnings [file_contents "dump.tmp"]]
-	remote_file host delete "dump.tmp"
-	remote_file build delete "dump.tmp"
-	if {[info exists old_lc_all]} {
-	    set env(LC_ALL) $old_lc_all
-	} else {
-	    unset env(LC_ALL)
-	}
-	if { $destopt != "" } {
-	    set objfile ${copyfile}.o
-	}
+            # If needed then check for, or add a -Map option.
+            set mapfile ""
+            if { $opts(map) != "" } then {
+                if { [regexp -- "-Map=(\[^ \]+)" $cmd all mapfile] } then {
+                    # Found existing mapfile option
+                    verbose -log "Existing mapfile '$mapfile' found"
+                } else {
+                    # No mapfile option.
+                    set mapfile "tmpdir/dump.map"
+                    verbose -log "Adding mapfile '$mapfile'"
+                    set cmd "$cmd -Map=$mapfile"
+                }
+            }
+
+            send_log "$cmd\n"
+            set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
+            remote_upload host "dump.tmp"
+            append comp_output [file_contents "dump.tmp"]
+            remote_file host delete "dump.tmp"
+            remote_file build delete "dump.tmp"
+            set cmdret [lindex $cmdret 0]
+
+            if { $cmdret == 0 && $run_objcopy } {
+                set infile $objfile
+                set objfile "tmpdir/dump1"
+                remote_file host delete $objfile
+
+                # Note that we don't use OBJCOPYFLAGS here; any flags must be
+                # explicitly specified.
+                set cmd "$OBJCOPY $opts(objcopy_linked_file) $infile $objfile"
+
+                send_log "$cmd\n"
+                set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
+                remote_upload host "dump.tmp"
+                append comp_output [file_contents "dump.tmp"]
+                remote_file host delete "dump.tmp"
+                remote_file build delete "dump.tmp"
+                set cmdret [lindex $cmdret 0]
+            }
+        } else {
+            set objfile [lindex $objfiles 0]
+        }
+
+        if { $cmdret == 0 && $opts(PROG) != "" } {
+            set destopt ${copyfile}.o
+            switch -- $opts(PROG) {
+                ar		{ set program ar }
+                elfedit	{
+                    set program elfedit
+                    set destopt ""
+                }
+                nm		{ set program nm }
+                objcopy	{ set program objcopy }
+                ranlib	{ set program ranlib }
+                strings	{ set program strings }
+                strip	{
+                    set program strip
+                    set destopt "-o $destopt"
+                }
+                default	{
+                    perror "unrecognized PROG option $opts(PROG) in $file.d"
+                    unresolved $testname
+                    continue
+                }
+            }
+
+            set progopts1 $opts($program)
+            eval set progopts \$[string toupper $program]FLAGS
+            eval set binary \$[string toupper $program]
+
+            if { ![is_remote host] && [which $binary] == 0 } {
+                untested $testname
+                continue
+            }
+
+            verbose "running $binary $progopts $progopts1" 3
+            set cmd "$binary $progopts $progopts1 $objfile $destopt"
+
+            # Ensure consistent sorting of symbols
+            if {[info exists env(LC_ALL)]} {
+                set old_lc_all $env(LC_ALL)
+            }
+            set env(LC_ALL) "C"
+            send_log "$cmd\n"
+            set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
+            set cmdret [lindex $cmdret 0]
+            remote_upload host "dump.tmp"
+            append comp_output [prune_warnings [file_contents "dump.tmp"]]
+            remote_file host delete "dump.tmp"
+            remote_file build delete "dump.tmp"
+            if {[info exists old_lc_all]} {
+                set env(LC_ALL) $old_lc_all
+            } else {
+                unset env(LC_ALL)
+            }
+            if { $destopt != "" } {
+                set objfile ${copyfile}.o
+            }
+        }
+
+        set want_out(source) ""
+        set want_out(terminal) 0
+        if { $err_warn } {
+            if { $opts(error) != "" || $opts(error_output) != "" } {
+                set want_out(terminal) 1
+            }
+
+            if { $opts(error) != "" || $opts(warning) != "" } {
+                set want_out(source) "regex"
+                if { $opts(error) != "" } {
+                    set want_out(regex) $opts(error)
+                } else {
+                    set want_out(regex) $opts(warning)
+                }
+            } else {
+                set want_out(source) "file"
+                if { $opts(error_output) != "" } {
+                    set want_out(file) $opts(error_output)
+                } else {
+                    set want_out(file) $opts(warning_output)
+                }
+            }
+        }
+
+        regsub "\n$" $comp_output "" comp_output
+        if { $cmdret != 0 || $comp_output != "" || $want_out(source) != "" } {
+            set exitstat "succeeded"
+            if { $cmdret != 0 } { set exitstat "failed" }
+
+            if { $want_out(source) == "regex" } {
+                verbose -log "$exitstat with: <$comp_output>, expected: <$want_out(regex)>"
+            } elseif { $want_out(source) == "file" } {
+                verbose -log "$exitstat with: <$comp_output>, expected in file $want_out(file)"
+                set_file_contents "tmpdir/ld.messages" "$comp_output"
+            } else {
+                verbose -log "$exitstat with: <$comp_output>, no expected output"
+            }
+
+            if { (($want_out(source) == "") == ($comp_output == "")) \
+                     && (($cmdret == 0) == ($want_out(terminal) == 0)) \
+                     && ((($want_out(source) == "regex") \
+                              && [regexp -- $want_out(regex) $comp_output]) \
+                             || (($want_out(source) == "file") \
+                                     && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$want_out(file)"]))) } {
+                # We have the expected output.
+                if { $want_out(terminal) || $dumpprogram == "" } {
+                    pass $testname
+                    continue
+                }
+            } else {
+                fail $testname
+                continue
+            }
+        }
+
+        # We must not have expected failure if we get here.
+        if { $opts(error) != "" } {
+            fail $testname
+            continue
+        }
+
+        if { $opts(map) != "" } then {
+            # Check the map file matches.
+            set map_pattern_file $srcdir/$subdir/$opts(map)
+            verbose -log "Compare '$mapfile' against '$map_pattern_file'"
+            if { [regexp_diff $mapfile $map_pattern_file] } then {
+                fail "$testname (map file check)"
+            } else {
+                pass "$testname (map file check)"
+            }
+
+            if { $dumpprogram == "" } then {
+                continue
+            }
+        }
+
+        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
+            continue
+        }
+
+        # For objdump of gas output, automatically translate standard section names
+        set sect_names ""
+        if { !$run_ld && $dumpprogram == "objdump" \
+                 && $opts(section_subst) != "no" \
+                 && ![string match "*-b binary*" $progopts1] } {
+            set sect_names [get_standard_section_names]
+            if { $sect_names != ""} {
+                regsub -- "\\.text" $progopts1 "[lindex $sect_names 0]" progopts1
+                regsub -- "\\.data" $progopts1 "[lindex $sect_names 1]" progopts1
+                regsub -- "\\.bss"  $progopts1 "[lindex $sect_names 2]" progopts1
+            }
+        }
+
+        if { $progopts1 == "" } { set $progopts1 "-r" }
+        verbose "running $binary $progopts $progopts1" 3
+
+        set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
+
+        # Ensure consistent sorting of symbols
+        if {[info exists env(LC_ALL)]} {
+            set old_lc_all $env(LC_ALL)
+        }
+        set env(LC_ALL) "C"
+        send_log "$cmd\n"
+        set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
+        set cmdret [lindex $cmdret 0]
+        remote_upload host "dump.tmp"
+        set comp_output [prune_warnings [file_contents "dump.tmp"]]
+        remote_file host delete "dump.tmp"
+        remote_file build delete "dump.tmp"
+        if {[info exists old_lc_all]} {
+            set env(LC_ALL) $old_lc_all
+        } else {
+            unset env(LC_ALL)
+        }
+        if { $cmdret != 0 || $comp_output != "" } {
+            send_log "exited abnormally with $cmdret, output:$comp_output\n"
+            fail $testname
+            continue
+        }
+
+        if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
+
+        # Create the substition list for objdump output.
+        set regexp_subst ""
+        if { $sect_names != "" } {
+            set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \
+                                  "\\\\?\\.data" [lindex $sect_names 1] \
+                                  "\\\\?\\.bss" [lindex $sect_names 2] ]
+        }
+
+        if { [regexp_diff $dumpfile "${dfile}" $regexp_subst] } then {
+            fail $testname
+            if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
+            continue
+        }
+
+        pass $testname
     }
-
-    set want_out(source) ""
-    set want_out(terminal) 0
-    if { $err_warn } {
-	if { $opts(error) != "" || $opts(error_output) != "" } {
-	    set want_out(terminal) 1
-	}
-
-	if { $opts(error) != "" || $opts(warning) != "" } {
-	    set want_out(source) "regex"
-	    if { $opts(error) != "" } {
-		set want_out(regex) $opts(error)
-	    } else {
-		set want_out(regex) $opts(warning)
-	    }
-	} else {
-	    set want_out(source) "file"
-	    if { $opts(error_output) != "" } {
-		set want_out(file) $opts(error_output)
-	    } else {
-		set want_out(file) $opts(warning_output)
-	    }
-	}
-    }
-
-    regsub "\n$" $comp_output "" comp_output
-    if { $cmdret != 0 || $comp_output != "" || $want_out(source) != "" } {
-	set exitstat "succeeded"
-	if { $cmdret != 0 } { set exitstat "failed" }
-
-	if { $want_out(source) == "regex" } {
-	    verbose -log "$exitstat with: <$comp_output>, expected: <$want_out(regex)>"
-	} elseif { $want_out(source) == "file" } {
-	    verbose -log "$exitstat with: <$comp_output>, expected in file $want_out(file)"
-	    set_file_contents "tmpdir/ld.messages" "$comp_output"
-	} else {
-	    verbose -log "$exitstat with: <$comp_output>, no expected output"
-	}
-
-	if { (($want_out(source) == "") == ($comp_output == "")) \
-	     && (($cmdret == 0) == ($want_out(terminal) == 0)) \
-	     && ((($want_out(source) == "regex") \
-		  && [regexp -- $want_out(regex) $comp_output]) \
-		 || (($want_out(source) == "file") \
-		     && (![regexp_diff "tmpdir/ld.messages" "$srcdir/$subdir/$want_out(file)"]))) } {
-	    # We have the expected output.
-	    if { $want_out(terminal) || $dumpprogram == "" } {
-		pass $testname
-		return
-	    }
-	} else {
-	    fail $testname
-	    return
-	}
-    }
-
-    # We must not have expected failure if we get here.
-    if { $opts(error) != "" } {
-	fail $testname
-	return
-    }
-
-    if { $opts(map) != "" } then {
-	# Check the map file matches.
-	set map_pattern_file $srcdir/$subdir/$opts(map)
-	verbose -log "Compare '$mapfile' against '$map_pattern_file'"
-	if { [regexp_diff $mapfile $map_pattern_file] } then {
-	    fail "$testname (map file check)"
-	} else {
-	    pass "$testname (map file check)"
-	}
-
-	if { $dumpprogram == "" } then {
-	    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 of gas output, automatically translate standard section names
-    set sect_names ""
-    if { !$run_ld && $dumpprogram == "objdump" \
-	     && $opts(section_subst) != "no" \
-	     && ![string match "*-b binary*" $progopts1] } {
-	set sect_names [get_standard_section_names]
-	if { $sect_names != ""} {
-	    regsub -- "\\.text" $progopts1 "[lindex $sect_names 0]" progopts1
-	    regsub -- "\\.data" $progopts1 "[lindex $sect_names 1]" progopts1
-	    regsub -- "\\.bss"  $progopts1 "[lindex $sect_names 2]" progopts1
-	}
-    }
-
-    if { $progopts1 == "" } { set $progopts1 "-r" }
-    verbose "running $binary $progopts $progopts1" 3
-
-    set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
-
-    # Ensure consistent sorting of symbols
-    if {[info exists env(LC_ALL)]} {
-	set old_lc_all $env(LC_ALL)
-    }
-    set env(LC_ALL) "C"
-    send_log "$cmd\n"
-    set cmdret [remote_exec host [concat sh -c [list "$cmd 2>dump.tmp"]] "" "/dev/null"]
-    set cmdret [lindex $cmdret 0]
-    remote_upload host "dump.tmp"
-    set comp_output [prune_warnings [file_contents "dump.tmp"]]
-    remote_file host delete "dump.tmp"
-    remote_file build delete "dump.tmp"
-    if {[info exists old_lc_all]} {
-	set env(LC_ALL) $old_lc_all
-    } else {
-	unset env(LC_ALL)
-    }
-    if { $cmdret != 0 || $comp_output != "" } {
-	send_log "exited abnormally with $cmdret, output:$comp_output\n"
-	fail $testname
-	return
-    }
-
-    if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
-
-    # Create the substition list for objdump output.
-    set regexp_subst ""
-    if { $sect_names != "" } {
-	set regexp_subst [list "\\\\?\\.text" [lindex $sect_names 0] \
-			      "\\\\?\\.data" [lindex $sect_names 1] \
-			      "\\\\?\\.bss" [lindex $sect_names 2] ]
-    }
-
-    if { [regexp_diff $dumpfile "${dfile}" $regexp_subst] } then {
-	fail $testname
-	if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
-	return
-    }
-
-    pass $testname
 }
 
 proc slurp_options { file } {
diff --git a/gas/testsuite/gas/aarch64/dotproduct.d b/gas/testsuite/gas/aarch64/dotproduct.d
index 54ac62be634890f57d6c1d84d57db42629359ca9..fd2f0ebf4c66de3e9bd3e831c8cb9828cae932aa 100644
--- a/gas/testsuite/gas/aarch64/dotproduct.d
+++ b/gas/testsuite/gas/aarch64/dotproduct.d
@@ -1,4 +1,5 @@
 #as: -march=armv8.2-a+dotprod
+#as: -march=armv8.4-a
 #objdump: -dr
 
 .*:     file format .*
diff --git a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d b/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d
deleted file mode 100644
index 121eb11bb40a12b57ebf1f52beaeade1bdb29e16..0000000000000000000000000000000000000000
--- a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d
+++ /dev/null
@@ -1,10 +0,0 @@
-#as: -march=armv8.4-a
-#objdump: -dr
-
-.*:     file format .*
-
-Disassembly of section \.text:
-
-0+ <.*>:
-[^:]+:\s+2e809400 	udot	v0.2s, v0.8b, v0.8b
-[^:]+:\s+2e8b9400 	udot	v0.2s, v0.8b, v11.8b
diff --git a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s b/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s
deleted file mode 100644
index 37538d9bb8270832a003a27e89e3f2d0e6ab44c0..0000000000000000000000000000000000000000
--- a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s
+++ /dev/null
@@ -1,2 +0,0 @@
-UDOT	V0.2S, V0.8B, V0.8B
-UDOT	V0.2S, V0.8B, V11.8B
diff --git a/gas/testsuite/gas/aarch64/illegal-dotproduct.d b/gas/testsuite/gas/aarch64/illegal-dotproduct.d
index 3f8928da83bb64891528cf5860236f4b73c184b8..0e15b9fbed4f90dd9d68c1923f73239e73dcde20 100644
--- a/gas/testsuite/gas/aarch64/illegal-dotproduct.d
+++ b/gas/testsuite/gas/aarch64/illegal-dotproduct.d
@@ -1,4 +1,5 @@
 #as: -march=armv8.2-a+dotprod
+#as: -march=armv8.4-a
 #name: Invalid dotproduct instructions.
 #source: illegal-dotproduct.s
 #error_output: illegal-dotproduct.l
diff --git a/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d b/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d
deleted file mode 100644
index ac8938fc086c6d55170d1de2900420fbe70881d3..0000000000000000000000000000000000000000
--- a/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d
+++ /dev/null
@@ -1,21 +0,0 @@
-#objdump: -dr
-#as: -march=armv8.2-a+rcpc
-#source: ldst-rcpc.s
-
-.*:     file format .*
-
-Disassembly of section \.text:
-
-0+ <.*>:
-   0:	38bfc0e1 	ldaprb	w1, \[x7\]
-   4:	38bfc0e1 	ldaprb	w1, \[x7\]
-   8:	38bfc0e1 	ldaprb	w1, \[x7\]
-   c:	78bfc0e1 	ldaprh	w1, \[x7\]
-  10:	78bfc0e1 	ldaprh	w1, \[x7\]
-  14:	78bfc0e1 	ldaprh	w1, \[x7\]
-  18:	b8bfc0e1 	ldapr	w1, \[x7\]
-  1c:	b8bfc0e1 	ldapr	w1, \[x7\]
-  20:	b8bfc0e1 	ldapr	w1, \[x7\]
-  24:	f8bfc0e1 	ldapr	x1, \[x7\]
-  28:	f8bfc0e1 	ldapr	x1, \[x7\]
-  2c:	f8bfc0e1 	ldapr	x1, \[x7\]
diff --git a/gas/testsuite/gas/aarch64/ldst-rcpc.d b/gas/testsuite/gas/aarch64/ldst-rcpc.d
index 73a0c9f6960126b7cf04f84aaaa4d6ecb4933bc7..f9e951bdcb49ce1e7e1be57f37cf0e1938a2fc8a 100644
--- a/gas/testsuite/gas/aarch64/ldst-rcpc.d
+++ b/gas/testsuite/gas/aarch64/ldst-rcpc.d
@@ -1,5 +1,7 @@
 #objdump: -dr
 #as: -march=armv8.3-a
+#as: -march=armv8.2-a+rcpc
+#source: ldst-rcpc.s
 
 .*:     file format .*
Nick Clifton Feb. 22, 2019, 11:45 a.m. | #7
Hi Matthew,

>>   powerpc-ibm-aix5.2.0 ... LD ERROR: powerpc-ibm-aix5.2.0-readelf does not exist


> I'm having trouble reproducing the PowerPC errors, what was the target 

> triple?


powerpc-ibm-aix5.2.0

> You mentioned it might be a problem with choosing which assembler to use 

> -- does that mean you have one on the execution pass?


No, but the tests appears to assume that I do have one, and then fail when
it cannot be found.  (This is the cause of the "powerpc-ibm-aix5.2.0-as does 
not exist" error messages).  The tests should be trying to use the assembler
in the build tree, rather than an assembler in my search path, which I think
happens with other tests.

Cheers
  Nick
Matthew Malcomson Feb. 22, 2019, 4:26 p.m. | #8
> Hi Matthew,

> 

> >>   powerpc-ibm-aix5.2.0 ... LD ERROR: powerpc-ibm-aix5.2.0-readelf does not exist

> 

>> I'm having trouble reproducing the PowerPC errors, what was the target 

>> triple?

> 

> powerpc-ibm-aix5.2.0

> 

>> You mentioned it might be a problem with choosing which assembler to use 

>> -- does that mean you have one on the execution pass?

> 

> No, but the tests appears to assume that I do have one, and then fail when

> it cannot be found.  (This is the cause of the "powerpc-ibm-aix5.2.0-as does 

> not exist" error messages).  The tests should be trying to use the assembler

> in the build tree, rather than an assembler in my search path, which I think

> happens with other tests.

> 

> Cheers

>   Nick


Hi Nick,

Thanks for the reply, I had hoped I'd gotten the triple wrong but no luck ;-(

This is really confusing me -- I'm testing that target triple before and after
my patch and not seeing any of these messages.

Even more confusing the type of the error is strange, I haven't changed
anything to do with the command execution -- the only difference I've made is
in collecting the assembler flags (I basically just run the existing code in a
loop).


Just looking for any difference I can look into: could you have a look at the
flags in the script I'm using (attached & inlined), maybe we're using different
configure flags?

Or are you running the tests natively?


#!/bin/bash

run-tests () {
  pushd ~/Documents/gnu-work/src/binutils-powerpc
  rm -rf *
  ../binutils-gdb/configure --target=powerpc-ibm-aix5.2.0 --disable-werror
  make -j $(nproc)
  make -j $(nproc) -k check-gas
  make -j $(nproc) -k check-ld
  make -j $(nproc) -k check-binutils
  make -j $(nproc) -k check-sim
  find -not \( -path ./gdb/testsuite/outputs -prune -o -name config.log \) \
    \( -name '*.sum' -o -name '*.log' \) \
    -exec cp -t ~/Documents/gnu-work/multiple-as/powerpc-aix-${1}/ \{\} \+
  popd
}

rm -f ~/Documents/gnu-work/multiple-as/powerpc-aix-*/*
cd ~/Documents/gnu-work/src/binutils-gdb

git checkout multiple-as-lines
run-tests after
git checkout $(git merge-base master multiple-as-lines)
run-tests before
#!/bin/bash

run-tests () {
  pushd ~/Documents/gnu-work/src/binutils-powerpc
  rm -rf *
  ../binutils-gdb/configure --target=powerpc-ibm-aix5.2.0 --disable-werror
  make -j $(nproc)
  make -j $(nproc) -k check-gas
  make -j $(nproc) -k check-ld
  make -j $(nproc) -k check-binutils
  make -j $(nproc) -k check-sim
  find -not \( -path ./gdb/testsuite/outputs -prune -o -name config.log \) \
    \( -name '*.sum' -o -name '*.log' \) \
    -exec cp -t ~/Documents/gnu-work/multiple-as/powerpc-aix-${1}/ \{\} \+
  popd
}

rm -f ~/Documents/gnu-work/multiple-as/powerpc-aix-*/*
cd ~/Documents/gnu-work/src/binutils-gdb

git checkout multiple-as-lines
run-tests after
git checkout $(git merge-base master multiple-as-lines)
run-tests before
Alan Modra Feb. 24, 2019, 7:56 a.m. | #9
On Wed, Feb 13, 2019 at 10:47:50AM +0000, Matthew Malcomson wrote:
> I guess by a wrapper you mean something like the below in a local TCL file.

> 

> if { [file-is-x] } { run-many-with-gas-opts "....." }

> elseif { [file-is-y] } { run-many-with-gas-opts "...." }

> elseif ...


I meant something along the lines of gas/testsuite/gas/mips/mips.exp
which has examples of run_dump_test being invoked for the same test on
multiple architectures with various extra options being passed, not
just extra "as" options.

-- 
Alan Modra
Australia Development Lab, IBM
Nick Clifton Feb. 26, 2019, 4:05 p.m. | #10
Hi Matthew,

> This is really confusing me -- I'm testing that target triple before and after

> my patch and not seeing any of these messages.


I must apologise - it was not you, it was me.  I had another patch that I was
trying to test out at the same time, and this was causing the fake failures that
I attributed to you.

So, I apologise again, and I would confirm that your latest version of the patch is approved.

Cheers
  Nick
H.J. Lu Feb. 27, 2019, 10:31 p.m. | #11
On Tue, Feb 26, 2019 at 8:05 AM Nick Clifton <nickc@redhat.com> wrote:
>

> Hi Matthew,

>

> > This is really confusing me -- I'm testing that target triple before and after

> > my patch and not seeing any of these messages.

>

> I must apologise - it was not you, it was me.  I had another patch that I was

> trying to test out at the same time, and this was causing the fake failures that

> I attributed to you.

>

> So, I apologise again, and I would confirm that your latest version of the patch is approved.


This breaks RHEL 7:

$ make check RUNTESTFLAGS=discard.exp
...
Running /export/gnu/import/git/sources/binutils-gdb/ld/testsuite/ld-discard/discard.exp
...
ERROR: (DejaGnu) proc "lmap x {{ }} {
        if { [string length $x] && [string length $as_additional_flags] } {
            append x " "
        }
        append x $as_additional_flags
        regsub {\[big_or_little_endian\]} $x  [big_or_little_endian] x
        expr {$x}
    }" does not exist.
The error code is NONE
The info on the error is:
invalid command name "lmap"
    while executing
"::tcl_unknown lmap x {{ }} {
        if { [string length $x] && [string length $as_additional_flags] } {
            append x " "
        }
        ap..."
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 ::tcl_unknown $args"

=== ld Summary ===

/export/build/gnu/binutils/build-x86_64-linux/ld/ld-new 2.32.51.20190227

make[3]: *** [check-DEJAGNU] Error 1
make[3]: Leaving directory `/export/build/gnu/binutils/build-x86_64-linux/ld'
make[2]: *** [check-am] Error 2
make[2]: Leaving directory `/export/build/gnu/binutils/build-x86_64-linux/ld'
make[1]: *** [check-recursive] Error 1
make[1]: Leaving directory `/export/build/gnu/binutils/build-x86_64-linux/ld'
make: *** [check] Error 2

-- 
H.J.
Matthew Malcomson Feb. 28, 2019, 1:46 p.m. | #12
> On Tue, Feb 26, 2019 at 8:05 AM Nick Clifton <nickc@redhat.com> wrote:

> >

> 

> This breaks RHEL 7:



> invalid command name "lmap"



Thanks for the catch!


My previous patch adding the ability to have multiple "as" lines in a testcase
used a TCL feature introduced in TCL version 8.6 (the lmap procedure).
https://www.sourceware.org/ml/binutils/2019-02/msg00097.html

This doesn't work on distributions that have an older version of TCL.
https://www.sourceware.org/ml/binutils/2019-02/msg00131.html

The attached patch rewrites the sole part of the code that uses "lmap" to use
"foreach" instead.

Tested on cross compilers
mipsel-linux-gnu mipsisa32el-linux-gnu powerpc-ibm-aix5.2.0
aarch64-none-linux-gnu arm-none-linux-gnu aarch64-none-elf

And native x86_64-none-linux-gnu, both with TCL 8.6 and 8.5.

binutils/ChangeLog:

2019-02-28  Matthew Malcomson  <matthew.malcomson@arm.com>

	* testsuite/lib/binutils-common.exp (run_dump_test): Replace a use of
	"lmap" with a "foreach" loop.



###############     Attachment also inlined for ease of reply    ###############


diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index e01b3fb48462cbe6b5bd06ae8860a1e1a8c8e5e6..8f622ba6b4a5adcfe027ebbbdcbb6bac62829203 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -829,19 +829,19 @@ proc run_dump_test { name {extra_options {}} } {
 	}
     }
 
-    # Ensure there is something in $opts(as) for the lmap below.
+    # Ensure there is something in $opts(as) for the foreach loop below.
     if { [llength $opts(as)] == 0 } {
         set opts(as) [list " "]
     }
-    set as_final_flags [lmap x $opts(as) {
+    foreach x $opts(as) {
         if { [string length $x] && [string length $as_additional_flags] } {
             append x " "
         }
         append x $as_additional_flags
         regsub {\[big_or_little_endian\]} $x \
             [big_or_little_endian] x
-        expr {$x}
-    }]
+        lappend as_final_flags $x
+    }
 
     regsub {\[big_or_little_endian\]} $opts(ld) \
         [big_or_little_endian] opts(ld)
H.J. Lu March 1, 2019, 4:21 p.m. | #13
On Thu, Feb 28, 2019 at 5:46 AM Matthew Malcomson
<Matthew.Malcomson@arm.com> wrote:
>

> > On Tue, Feb 26, 2019 at 8:05 AM Nick Clifton <nickc@redhat.com> wrote:

> > >

> >

> > This breaks RHEL 7:

>

>

> > invalid command name "lmap"

>

>

> Thanks for the catch!

>

>

> My previous patch adding the ability to have multiple "as" lines in a testcase

> used a TCL feature introduced in TCL version 8.6 (the lmap procedure).

> https://www.sourceware.org/ml/binutils/2019-02/msg00097.html

>

> This doesn't work on distributions that have an older version of TCL.

> https://www.sourceware.org/ml/binutils/2019-02/msg00131.html

>

> The attached patch rewrites the sole part of the code that uses "lmap" to use

> "foreach" instead.

>

> Tested on cross compilers

> mipsel-linux-gnu mipsisa32el-linux-gnu powerpc-ibm-aix5.2.0

> aarch64-none-linux-gnu arm-none-linux-gnu aarch64-none-elf

>

> And native x86_64-none-linux-gnu, both with TCL 8.6 and 8.5.

>

> binutils/ChangeLog:

>

> 2019-02-28  Matthew Malcomson  <matthew.malcomson@arm.com>

>

>         * testsuite/lib/binutils-common.exp (run_dump_test): Replace a use of

>         "lmap" with a "foreach" loop.

>

>

>

> ###############     Attachment also inlined for ease of reply    ###############

>

>

> diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp

> index e01b3fb48462cbe6b5bd06ae8860a1e1a8c8e5e6..8f622ba6b4a5adcfe027ebbbdcbb6bac62829203 100644

> --- a/binutils/testsuite/lib/binutils-common.exp

> +++ b/binutils/testsuite/lib/binutils-common.exp

> @@ -829,19 +829,19 @@ proc run_dump_test { name {extra_options {}} } {

>         }

>      }

>

> -    # Ensure there is something in $opts(as) for the lmap below.

> +    # Ensure there is something in $opts(as) for the foreach loop below.

>      if { [llength $opts(as)] == 0 } {

>          set opts(as) [list " "]

>      }

> -    set as_final_flags [lmap x $opts(as) {

> +    foreach x $opts(as) {

>          if { [string length $x] && [string length $as_additional_flags] } {

>              append x " "

>          }

>          append x $as_additional_flags

>          regsub {\[big_or_little_endian\]} $x \

>              [big_or_little_endian] x

> -        expr {$x}

> -    }]

> +        lappend as_final_flags $x

> +    }

>

>      regsub {\[big_or_little_endian\]} $opts(ld) \

>          [big_or_little_endian] opts(ld)

>

>


I opened:

https://sourceware.org/bugzilla/show_bug.cgi?id=24287

Would you mind mention PR  binutils/24287 in your ChangeLog?

Thanks.

-- 
H.J.
Matthew Malcomson March 4, 2019, 4:52 p.m. | #14
On 01/03/19 16:21, H.J. Lu wrote:
> 

> I opened:

> 

> https://sourceware.org/bugzilla/show_bug.cgi?id=24287

> 

> Would you mind mention PR  binutils/24287 in your ChangeLog?


Absolutely -- I will use the below changelog if & when accepted.
(without the line wrap that my email client insists on inserting).

binutils/ChangeLog:

2019-03-04  Matthew Malcomson  <matthew.malcomson@arm.com>

	PR binutils/24287
	* testsuite/lib/binutils-common.exp (run_dump_test): Replace a use of
	"lmap" with a "foreach" loop.


> 

> Thanks.

>
Nick Clifton March 5, 2019, 2:48 p.m. | #15
Hi Matthew,

> Absolutely -- I will use the below changelog if & when accepted.

> (without the line wrap that my email client insists on inserting).


Sorry - I have gone ahead and approved and applied your patch!

H.J. filed a bug report about it, and I could not find your email
in my queue (I had misfiled it) so I thought that I would not be
able to send you a direct "approved - please apply" type reply.

Anyway, thanks for the patch, and it is in now.

Cheers
  Nick

Patch

diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index bbbbfbe..8c6f7ff 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -523,6 +523,8 @@  if ![string length [info proc prune_warnings]] {
 #	When assembling, pass FLAGS to the assembler.
 #	If assembling several files, you can pass different assembler
 #	options in the "source" directives.  See below.
+#       Multiple instances of this directive tells run_dump_test to run the test
+#       multiple times -- one time with each set of flags provided.
 #
 #   ld: FLAGS
 #	Link assembled files using FLAGS, in the order of the "source"
@@ -690,6 +692,8 @@  proc run_dump_test { name {extra_options {}} } {
     set opts(anyskip) {}
     set opts(ar) {}
     set opts(as) {}
+    set as_final_flags {}
+    set as_additional_flags {}
     set opts(dump) {}
     set opts(elfedit) {}
     set opts(error) {}
@@ -781,7 +785,9 @@  proc run_dump_test { name {extra_options {}} } {
 		lappend objfile_names $new_objfile
 	    }
 	    default {
-		if { !$in_extra && [string length $opts($opt_name)] } {
+		if { !$in_extra
+                     && [string length $opts($opt_name)]
+                     && $opt_name != "as" } {
 		    perror "option $opt_name multiply set in $file.d"
 		    unresolved $subdir/$name
 		    return
@@ -805,16 +811,35 @@  proc run_dump_test { name {extra_options {}} } {
 	    error {
 		append opts($opt_name) $opt_val
 	    }
+            as {
+                if { $in_extra } {
+                    set as_additional_flags $opt_val
+                } else {
+                    lappend opts(as) $opt_val
+                }
+            }
 	    default {
 		set opts($opt_name) [concat $opts($opt_name) $opt_val]
 	    }
 	}
     }
 
-    foreach opt { as ld } {
-	regsub {\[big_or_little_endian\]} $opts($opt) \
-	    [big_or_little_endian] opts($opt)
+    # Ensure there is something in $opts(as) for the lmap below.
+    if { [llength $opts(as)] == 0 } {
+        set opts(as) [list " "]
+    }
+    set as_final_flags [lmap x $opts(as) {
+        if { [string length $x] && [string length $as_additional_flags] } {
+            append x " "
         }
+        append x $as_additional_flags
+        regsub {\[big_or_little_endian\]} $x \
+            [big_or_little_endian] x
+        expr {$x}
+    }]
+
+    regsub {\[big_or_little_endian\]} $opts(ld) \
+        [big_or_little_endian] opts(ld)
 
     if { $opts(name) == "" } {
 	set testname "$subdir/$name"
@@ -947,6 +972,7 @@  proc run_dump_test { name {extra_options {}} } {
 	setup_xfail $targ
     }
 
+    foreach as_flags $as_final_flags {
         # Assemble each file.
         set objfiles {}
         for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
@@ -963,7 +989,7 @@  proc run_dump_test { name {extra_options {}} } {
             catch "exec rm -f $objfile" exec_output
             lappend objfiles $objfile
 
-	if { $opts(as) == "binary" } {
+            if { $as_flags == "binary" } {
                 while {[file type $sourcefile] eq "link"} {
                     set newfile [file readlink $sourcefile]
                     if {[string index $newfile 0] ne "/"} {
@@ -987,11 +1013,11 @@  proc run_dump_test { name {extra_options {}} } {
                     if { $cmdret != 0 } {
                         perror "sed failure"
                         unresolved $testname
-		    return
+                        continue
                     }
                     set sourcefile tmpdir/asm.s
                 }
-	    set cmd "$AS $ASFLAGS $opts(as) $sourceasflags -o $objfile $sourcefile"
+                set cmd "$AS $ASFLAGS $as_flags $sourceasflags -o $objfile $sourcefile"
 
                 send_log "$cmd\n"
                 set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "dump.tmp"]
@@ -1094,7 +1120,7 @@  proc run_dump_test { name {extra_options {}} } {
                 default	{
                     perror "unrecognized PROG option $opts(PROG) in $file.d"
                     unresolved $testname
-		return
+                    continue
                 }
             }
 
@@ -1104,7 +1130,7 @@  proc run_dump_test { name {extra_options {}} } {
 
             if { ![is_remote host] && [which $binary] == 0 } {
                 untested $testname
-	    return
+                continue
             }
 
             verbose "running $binary $progopts $progopts1" 3
@@ -1179,18 +1205,18 @@  proc run_dump_test { name {extra_options {}} } {
                 # We have the expected output.
                 if { $want_out(terminal) || $dumpprogram == "" } {
                     pass $testname
-		return
+                    continue
                 }
             } else {
                 fail $testname
-	    return
+                continue
             }
         }
 
         # We must not have expected failure if we get here.
         if { $opts(error) != "" } {
             fail $testname
-	return
+            continue
         }
 
         if { $opts(map) != "" } then {
@@ -1204,7 +1230,7 @@  proc run_dump_test { name {extra_options {}} } {
             }
 
             if { $dumpprogram == "" } then {
-	    return
+                continue
             }
         }
 
@@ -1214,7 +1240,7 @@  proc run_dump_test { name {extra_options {}} } {
 
         if { ![is_remote host] && [which $binary] == 0 } {
             untested $testname
-	return
+            continue
         }
 
         # For objdump of gas output, automatically translate standard section names
@@ -1255,7 +1281,7 @@  proc run_dump_test { name {extra_options {}} } {
         if { $cmdret != 0 || $comp_output != "" } {
             send_log "exited abnormally with $cmdret, output:$comp_output\n"
             fail $testname
-	return
+            continue
         }
 
         if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
@@ -1271,11 +1297,12 @@  proc run_dump_test { name {extra_options {}} } {
         if { [regexp_diff $dumpfile "${dfile}" $regexp_subst] } then {
             fail $testname
             if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
-	return
+            continue
         }
 
         pass $testname
     }
+}
 
 proc slurp_options { file } {
     # If options_regsub(foo) is set to {a b}, then the contents of a
diff --git a/gas/testsuite/gas/aarch64/dotproduct.d b/gas/testsuite/gas/aarch64/dotproduct.d
index 54ac62b..fd2f0eb 100644
--- a/gas/testsuite/gas/aarch64/dotproduct.d
+++ b/gas/testsuite/gas/aarch64/dotproduct.d
@@ -1,4 +1,5 @@ 
 #as: -march=armv8.2-a+dotprod
+#as: -march=armv8.4-a
 #objdump: -dr
 
 .*:     file format .*
diff --git a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d b/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d
deleted file mode 100644
index 121eb11..0000000
--- a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.d
+++ /dev/null
@@ -1,10 +0,0 @@ 
-#as: -march=armv8.4-a
-#objdump: -dr
-
-.*:     file format .*
-
-Disassembly of section \.text:
-
-0+ <.*>:
-[^:]+:\s+2e809400 	udot	v0.2s, v0.8b, v0.8b
-[^:]+:\s+2e8b9400 	udot	v0.2s, v0.8b, v11.8b
diff --git a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s b/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s
deleted file mode 100644
index 37538d9..0000000
--- a/gas/testsuite/gas/aarch64/dotproduct_armv8_4.s
+++ /dev/null
@@ -1,2 +0,0 @@ 
-UDOT	V0.2S, V0.8B, V0.8B
-UDOT	V0.2S, V0.8B, V11.8B
diff --git a/gas/testsuite/gas/aarch64/illegal-dotproduct.d b/gas/testsuite/gas/aarch64/illegal-dotproduct.d
index 3f8928d..0e15b9f 100644
--- a/gas/testsuite/gas/aarch64/illegal-dotproduct.d
+++ b/gas/testsuite/gas/aarch64/illegal-dotproduct.d
@@ -1,4 +1,5 @@ 
 #as: -march=armv8.2-a+dotprod
+#as: -march=armv8.4-a
 #name: Invalid dotproduct instructions.
 #source: illegal-dotproduct.s
 #error_output: illegal-dotproduct.l
diff --git a/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d b/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d
deleted file mode 100644
index ac8938f..0000000
--- a/gas/testsuite/gas/aarch64/ldst-rcpc-armv8_2.d
+++ /dev/null
@@ -1,21 +0,0 @@ 
-#objdump: -dr
-#as: -march=armv8.2-a+rcpc
-#source: ldst-rcpc.s
-
-.*:     file format .*
-
-Disassembly of section \.text:
-
-0+ <.*>:
-   0:	38bfc0e1 	ldaprb	w1, \[x7\]
-   4:	38bfc0e1 	ldaprb	w1, \[x7\]
-   8:	38bfc0e1 	ldaprb	w1, \[x7\]
-   c:	78bfc0e1 	ldaprh	w1, \[x7\]
-  10:	78bfc0e1 	ldaprh	w1, \[x7\]
-  14:	78bfc0e1 	ldaprh	w1, \[x7\]
-  18:	b8bfc0e1 	ldapr	w1, \[x7\]
-  1c:	b8bfc0e1 	ldapr	w1, \[x7\]
-  20:	b8bfc0e1 	ldapr	w1, \[x7\]
-  24:	f8bfc0e1 	ldapr	x1, \[x7\]
-  28:	f8bfc0e1 	ldapr	x1, \[x7\]
-  2c:	f8bfc0e1 	ldapr	x1, \[x7\]
diff --git a/gas/testsuite/gas/aarch64/ldst-rcpc.d b/gas/testsuite/gas/aarch64/ldst-rcpc.d
index 73a0c9f..f9e951b 100644
--- a/gas/testsuite/gas/aarch64/ldst-rcpc.d
+++ b/gas/testsuite/gas/aarch64/ldst-rcpc.d
@@ -1,5 +1,7 @@ 
 #objdump: -dr
 #as: -march=armv8.3-a
+#as: -march=armv8.2-a+rcpc
+#source: ldst-rcpc.s
 
 .*:     file format .*