]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Merge from mainline:
authorAlan Modra <amodra@gmail.com>
Wed, 13 Nov 2002 03:03:47 +0000 (03:03 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 13 Nov 2002 03:03:47 +0000 (03:03 +0000)
2002-11-11  Hans-Peter Nilsson  <hp@axis.com>
* lib/ld-lib.exp (run_dump_test): Don't prepend "$srcdir/$subdir/"
to a source file starting with "/".

2002-09-27  Jakub Jelinek  <jakub@redhat.com>
* lib/ld-lib.exp (run_ld_link_tests): Add.
* ld-sh/sh64/sh64.exp (run_ld_link_tests, regexp_diff,
file_contents): Remove.
(sh64tests): Add 6th field to the tests array.
* ld-i386/i386.exp (run_ld_link_tests): Remove.

ld/testsuite/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-sh/sh64/sh64.exp
ld/testsuite/lib/ld-lib.exp

index e38e044eeaa4f6b8d72ffb5295265624e5492c7e..dbc8e48212c148d3e40a89d05d78f89f4e1fb18e 100644 (file)
@@ -1,3 +1,17 @@
+2002-11-13  Alan Modra  <amodra@bigpond.net.au>
+
+       Merge from mainline:
+       2002-11-11  Hans-Peter Nilsson  <hp@axis.com>
+       * lib/ld-lib.exp (run_dump_test): Don't prepend "$srcdir/$subdir/"
+       to a source file starting with "/".
+
+       2002-09-27  Jakub Jelinek  <jakub@redhat.com>
+       * lib/ld-lib.exp (run_ld_link_tests): Add.
+       * ld-sh/sh64/sh64.exp (run_ld_link_tests, regexp_diff,
+       file_contents): Remove.
+       (sh64tests): Add 6th field to the tests array.
+       * ld-i386/i386.exp (run_ld_link_tests): Remove.
+
 2002-10-28  Daniel Jacobowitz  <drow@mvista.com>
 
        Merge from mainline:
index 0b9257e26101ee7b49c3716cadd073255b373f04..580aaf7ddcd965a2846b591c4c0fd01d48a05b28 100644 (file)
@@ -26,11 +26,6 @@ if { !([istarget "i?86-*-elf*"]
     return
 }
 
-# FIXME: This isn't set by testsuite/config/default.exp; make it.
-if ![info exists readelf] then {
-    set readelf [findfile $base_dir/../binutils/readelf]
-}
-
 # List contains test-items with 3 items followed by 2 lists:
 # 0:name 1:ld options 2:assembler options
 # 3:filenames of assembler files 4: action and options. 5: name of output file
@@ -65,126 +60,4 @@ set i386tests {
      {{objdump -drj.text tlsindntpoff.dd}} "tlsindntpoff"}
 }
 
-# FIXME: Generalize and move this to ld-lib.exp
-
-proc run_ld_link_tests { ldtests } {
-    global ld
-    global as
-    global nm
-    global objdump
-    global readelf
-    global srcdir
-    global subdir
-    global env
-
-    foreach testitem $ldtests {
-       set testname [lindex $testitem 0]
-       set ld_options [lindex $testitem 1]
-       set as_options [lindex $testitem 2]
-       set as_files  [lindex $testitem 3]
-       set actions [lindex $testitem 4]
-       set binfile tmpdir/[lindex $testitem 5]
-       set objfiles {}
-       set is_unresolved 0
-       set failed 0
-
-#      verbose -log "Testname is $testname"
-#      verbose -log "ld_options is $ld_options"
-#      verbose -log "as_options is $as_options"
-#      verbose -log "as_files is $as_files"
-#      verbose -log "actions is $actions"
-#      verbose -log "binfile is $binfile"
-
-       # Assemble each file in the test.
-       foreach as_file $as_files {
-           set objfile "tmpdir/[file rootname $as_file].o"
-           lappend objfiles $objfile
-
-           if ![ld_assemble $as "$as_options $srcdir/$subdir/$as_file" $objfile] {
-               set is_unresolved 1
-               break
-           }
-       }
-
-       # Catch assembler errors.
-       if { $is_unresolved != 0 } {
-           unresolved $testname
-           continue
-       }
-
-       if ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
-           fail $testname
-       } else {
-           set failed 0
-           foreach actionlist $actions {
-               set action [lindex $actionlist 0]
-               set progopts [lindex $actionlist 1]
-
-               # There are actions where we run regexp_diff on the
-               # output, and there are other actions (presumably).
-               # Handling of the former look the same.
-               set dump_prog ""
-               switch -- $action {
-                   objdump
-                       { set dump_prog $objdump }
-                   nm
-                       { set dump_prog $nm }
-                   readelf
-                       { set dump_prog $readelf }
-                   default
-                       {
-                           perror "Unrecognized action $action"
-                           set is_unresolved 1
-                           break
-                       }
-                   }
-
-               if { $dump_prog != "" } {
-                   set dumpfile [lindex $actionlist 2]
-                   set binary $dump_prog
-
-                   # Ensure consistent sorting of symbols
-                   if {[info exists env(LC_ALL)]} {
-                       set old_lc_all $env(LC_ALL)
-                   }
-                   set env(LC_ALL) "C"
-                   set cmd "$binary $progopts $binfile > dump.out"
-                   send_log "$cmd\n"
-                   catch "exec $cmd" comp_output
-                   if {[info exists old_lc_all]} {
-                       set env(LC_ALL) $old_lc_all
-                   } else {
-                       unset env(LC_ALL)
-                   }
-                   set comp_output [prune_warnings $comp_output]
-
-                   if ![string match "" $comp_output] then {
-                       send_log "$comp_output\n"
-                       set failed 1
-                       break
-                   }
-
-                   if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
-                       verbose "output is [file_contents "dump.out"]" 2
-                       set failed 1
-                       break
-                   }
-               }
-           }
-
-           if { $failed != 0 } {
-               fail $testname
-           } else { if { $is_unresolved == 0 } {
-               pass $testname
-           } }
-       }
-
-       # Catch action errors.
-       if { $is_unresolved != 0 } {
-           unresolved $testname
-           continue
-       }
-    }
-}
-
 run_ld_link_tests $i386tests
index 555436e894e6690be7787c55479e92cbda9946b4..62b93687850388780d4a3edc94120d072f0b2fcb 100644 (file)
@@ -23,18 +23,14 @@ if ![istarget sh64-*-*] {
     return
 }
 
-# FIXME: This isn't set by testsuite/config/default.exp; make it.
-if ![info exists readelf] then {
-    set readelf [findfile $base_dir/../binutils/readelf]
-}
-
 # List contains test-items with 3 items followed by 2 lists:
 # 0:name 1:ld options 2:assembler options
-# 3:filenames of assembler files 4: action and options.
+# 3:filenames of assembler files 4: action and options. 5: name of output file
 
 # Actions:
 # objdump: Apply objdump options on result.  Compare with regex (last arg).
 # nm: Apply nm options on result.  Compare with regex (last arg).
+# readelf: Apply readelf options on result.  Compare with regex (last arg).
 
 # Note that the contents dump is the same for "inter-file datalabel
 # references, 64-bit ABI" as for 32-bit ABI and ELF so we re-use it.
@@ -42,317 +38,83 @@ if ![info exists readelf] then {
 set sh64tests {
     {"SH64 linking, 64-bit ABI" "-mshelf64"
      "--abi=64" {sh64-1.s sh64-2.s}
-     {{objdump -sr abi64.sd} {objdump -x abi64.xd}}}
+     {{objdump -sr abi64.sd} {objdump -x abi64.xd}} "abi64.bin" }
     {"SH64 linking, 64-bit ABI, -no-expand" "-mshelf64"
      "--abi=64 -no-expand" {sh64-1.s sh64-2.s}
-     {{objdump -sr abixx-noexp.sd}}}
+     {{objdump -sr abixx-noexp.sd}} "abi64-noexp.bin" }
     {"SH64 linking, 32-bit ABI" "-mshelf32"
      "--abi=32" {sh64-1.s sh64-2.s}
-     {{objdump -sr abi32.sd} {objdump -x abi32.xd}}}
+     {{objdump -sr abi32.sd} {objdump -x abi32.xd}} "abi32.bin" }
     {"SH64 linking, 32-bit ABI, -no-expand" "-mshelf32"
      "--abi=32 -no-expand" {sh64-1.s sh64-2.s}
-     {{objdump -sr abixx-noexp.sd}}}
+     {{objdump -sr abixx-noexp.sd}} "abi32-noexp.bin" }
     {"SH64 linking, single multi-ISA object" "-mshelf32"
      "--abi=32" {shmix-1.s}
-     {{objdump -sr mix1.sd} {objdump -x mix1.xd}}}
+     {{objdump -sr mix1.sd} {objdump -x mix1.xd}} "mix1.bin" }
     {"SH64 linking, single multi-ISA object, -no-expand" "-mshelf32"
      "--abi=32 -no-expand" {shmix-1.s}
-     {{objdump -sr mix1-noexp.sd}}}
+     {{objdump -sr mix1-noexp.sd}} "mix1-noexp.bin" }
     {"SH64 linking, two different-ISA objects" "-mshelf32"
      "--abi=32" {shmix-2.s shmix-3.s}
-     {{objdump -sr mix2.sd} {objdump -x mix2.xd}}}
+     {{objdump -sr mix2.sd} {objdump -x mix2.xd}} "mix2.bin" }
     {"SH64 linking, two different-ISA objects, -no-expand" "-mshelf32"
      "--abi=32 -no-expand" {shmix-2.s shmix-3.s}
-     {{objdump -sr mix2-noexp.sd}}}
+     {{objdump -sr mix2-noexp.sd}} "mix2-noexp.bin" }
     {"SH64 linking, single SHcompact" "-mshelf32"
      "--isa=SHcompact" {shcmp-1.s}
-     {{objdump -sr cmpct1.sd} {objdump -x cmpct1.xd}}}
+     {{objdump -sr cmpct1.sd} {objdump -x cmpct1.xd}} "cmpct1.bin" }
     {"SH64 inter-file datalabel references, 64-bit ABI" "-mshelf64"
      "--abi=64" {shdl-1.s shdl-2.s}
-     {{objdump -sr shdl64.sd} {objdump -x shdl64.xd}}}
+     {{objdump -sr shdl64.sd} {objdump -x shdl64.xd}} "shdl64.bin" }
     {"SH64 inter-file datalabel references, 32-bit ABI" "-mshelf32"
      "--abi=32" {shdl-1.s shdl-2.s}
-     {{objdump -sr shdl64.sd} {objdump -x shdl32.xd}}}
+     {{objdump -sr shdl64.sd} {objdump -x shdl32.xd}} "shdl32.bin" }
     {"SH64 simple partial linking, 32-bit ABI" "-mshelf32 -r"
      "--abi=32" {rel-1.s rel-2.s}
-     {{objdump -sx rel32.xd}}}
+     {{objdump -sx rel32.xd}} "rel32.bin" }
     {"SH64 simple partial linking, 64-bit ABI" "-mshelf64 -r"
      "--abi=64" {rel-1.s rel-2.s}
-     {{objdump -sx rel64.xd}}}
+     {{objdump -sx rel64.xd}} "rel64.bin" }
     {"SH64 partial linking with datalabel references, 32-bit ABI" "-mshelf32 -r"
      "--abi=32" {reldl-1.s reldl-2.s}
-     {{readelf {-s -r -x 1 -x 3} reldl32.rd}}}
+     {{readelf {-s -r -x 1 -x 3} reldl32.rd}} "reldl32.bin" }
     {"SH64 partial linking with datalabel references, 64-bit ABI" "-mshelf64 -r"
      "--abi=64" {reldl-1.s reldl-2.s}
-     {{readelf {-s -r -x 1 -x 3} reldl64.rd}}}
+     {{readelf {-s -r -x 1 -x 3} reldl64.rd}} "reldl64.bin" }
     {"Handling SH64 assembler-generated .cranges" "-mshelf32"
      "--abi=32" {crange-2a.s crange-1.s}
-     {{readelf {-S -s -r -x 1 -x 2 -x 9} crange1.rd}}}
+     {{readelf {-S -s -r -x 1 -x 2 -x 9} crange1.rd}} "crange1.bin" }
     {"Handling SH64 assembler-generated .cranges, partial linking" "-mshelf32 -r"
      "--abi=32" {crange-2a.s}
-     {{readelf {-S -s -r -x 2 -x 5} crangerel1.rd}}}
+     {{readelf {-S -s -r -x 2 -x 5} crangerel1.rd}} "crangerel1.bin" }
     {"Mixing SH64 assembler-generated with linker-generated .cranges" "-mshelf32"
      "--abi=32" {crange-2a.s crange-2b.s crange-1.s}
-     {{readelf {-S -s -r -x 2 -x 9} crange2.rd}}}
+     {{readelf {-S -s -r -x 2 -x 9} crange2.rd}} "crange2.bin" }
     {"Mixing SH64 assembler-generated with linker-generated .cranges, partial linking"
      "-mshelf32 -r"
      "--abi=32" {crange-2a.s crange-2c.s crange-2d.s crange-2e.s}
-     {{readelf {-S -s -r -x 2 -x 5} crangerel2.rd}}}
+     {{readelf {-S -s -r -x 2 -x 5} crangerel2.rd}} "crangerel2.bin" }
     {"Merge and use of SH64 .cranges, some not originally in order" "-mshelf32"
      "--abi=32"
      {crange-2e.s crange-2f.s crange-2g.s crange-2a.s crange-2d.s crange-2i.s
       crange-2h.s crange-1.s}
-      {{readelf {-S -s -x 2 -x 9} crange3.rd} {objdump -d crange3.dd}}}
+      {{readelf {-S -s -x 2 -x 9} crange3.rd} {objdump -d crange3.dd}} "crange3.bin" }
     {"Sorted SH64 .cranges, entry at SHcompact code" "-mshelf32 --entry diversion"
      "--abi=32"
      {crange-2e.s crange-2f.s crange-2g.s crange-2a.s crange-2d.s crange-2i.s
       crange-2h.s crange-1.s}
-      {{readelf {-h -S -s -x 2 -x 9} crange3-cmpct.rd}}}
+      {{readelf {-h -S -s -x 2 -x 9} crange3-cmpct.rd}} "crange3-cmpct.bin" }
     {"Sorted SH64 .cranges, entry at SHmedia code" "-mshelf32 --entry diversion2"
      "--abi=32"
      {crange-2e.s crange-2f.s crange-2g.s crange-2a.s crange-2d.s crange-2i.s
       crange-2h.s crange-1.s}
-      {{readelf {-h -S -s -x 2 -x 9} crange3-media.rd}}}
+      {{readelf {-h -S -s -x 2 -x 9} crange3-media.rd}} "crange3-media.bin" }
     {"SH64 Big Endianness" "-mshelf64 -Tendian.ld"
      "--abi=64" {endian.s}
-     {{objdump -s endian.sbd} {objdump -d endian.dbd}}}
+     {{objdump -s endian.sbd} {objdump -d endian.dbd}} "endianb.bin" }
     {"SH64 Little Endianness" "-mshlelf64 -Tendian.ld"
      "--abi=64 --little" {endian.s}
-     {{objdump -s endian.sld} {objdump -d endian.dld}}}
-
-}
-
-# FIXME: Generalize and move this to ld-lib.exp
-
-proc run_ld_link_tests { ldtests } {
-    global ld
-    global as
-    global nm
-    global objdump
-    global readelf
-    global srcdir
-    global subdir
-    global env
-
-    set binfile "tmpdir/linked"
-
-    foreach testitem $ldtests {
-       set testname [lindex $testitem 0]
-       set ld_options [lindex $testitem 1]
-       set as_options [lindex $testitem 2]
-       set as_files  [lindex $testitem 3]
-       set actions [lindex $testitem 4]
-       set objfiles {}
-       set is_unresolved 0
-       set failed 0
-
-#      verbose -log "Testname is $testname"
-#      verbose -log "ld_options is $ld_options"
-#      verbose -log "as_options is $as_options"
-#      verbose -log "as_files is $as_files"
-#      verbose -log "actions is $actions"
-
-       # Assemble each file in the test.
-       foreach as_file $as_files {
-           set objfile "tmpdir/[file rootname $as_file].o"
-           lappend objfiles $objfile
-
-           if ![ld_assemble $as "$as_options $srcdir/$subdir/$as_file" $objfile] {
-               set is_unresolved 1
-               break
-           }
-       }
-
-       # Catch assembler errors.
-       if { $is_unresolved != 0 } {
-           unresolved $testname
-           continue
-       }
-
-       if ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
-           fail $testname
-       } else {
-           set failed 0
-           foreach actionlist $actions {
-               set action [lindex $actionlist 0]
-               set progopts [lindex $actionlist 1]
-
-               # There are actions where we run regexp_diff on the
-               # output, and there are other actions (presumably).
-               # Handling of the former look the same.
-               set dump_prog ""
-               switch -- $action {
-                   objdump
-                       { set dump_prog $objdump }
-                   nm
-                       { set dump_prog $nm }
-                   readelf
-                       { set dump_prog $readelf }
-                   default
-                       {
-                           perror "Unrecognized action $action"
-                           set is_unresolved 1
-                           break
-                       }
-                   }
-
-               if { $dump_prog != "" } {
-                   set dumpfile [lindex $actionlist 2]
-                   set binary $dump_prog
-
-                   # Ensure consistent sorting of symbols
-                   if {[info exists env(LC_ALL)]} {
-                       set old_lc_all $env(LC_ALL)
-                   }
-                   set env(LC_ALL) "C"
-                   set cmd "$binary $progopts $binfile > dump.out"
-                   send_log "$cmd\n"
-                   catch "exec $cmd" comp_output
-                   if {[info exists old_lc_all]} {
-                       set env(LC_ALL) $old_lc_all
-                   } else {
-                       unset env(LC_ALL)
-                   }
-                   set comp_output [prune_warnings $comp_output]
-
-                   if ![string match "" $comp_output] then {
-                       send_log "$comp_output\n"
-                       set failed 1
-                       break
-                   }
-
-                   if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
-                       verbose "output is [file_contents "dump.out"]" 2
-                       set failed 1
-                       break
-                   }
-               }
-           }
-
-           if { $failed != 0 } {
-               fail $testname
-           } else { if { $is_unresolved == 0 } {
-               pass $testname
-           } }
-       }
-
-       # Catch action errors.
-       if { $is_unresolved != 0 } {
-           unresolved $testname
-           continue
-       }
-    }
-}
-
-# FIXME: Move this to ld-lib.exp or higher up.
-
-# regexp_diff, based on simple_diff taken from ld test suite
-#      compares two files line-by-line
-#      file1 contains strings, file2 contains regexps and #-comments
-#      blank lines are ignored in either file
-#      returns non-zero if differences exist
-#
-proc regexp_diff { file_1 file_2 } {
-
-    set eof -1
-    set end_1 0
-    set end_2 0
-    set differences 0
-    set diff_pass 0
-
-    if [file exists $file_1] then {
-       set file_a [open $file_1 r]
-    } else {
-       warning "$file_1 doesn't exist"
-       return 1
-    }
-
-    if [file exists $file_2] then {
-       set file_b [open $file_2 r]
-    } else {
-       fail "$file_2 doesn't exist"
-       close $file_a
-       return 1
-    }
-
-    verbose " Regexp-diff'ing: $file_1 $file_2" 2
-
-    while { 1 } {
-       set line_a ""
-       set line_b ""
-       while { [string length $line_a] == 0 } {
-           if { [gets $file_a line_a] == $eof } {
-               set end_1 1
-               break
-           }
-       }
-       while { [string length $line_b] == 0 || [string match "#*" $line_b] } {
-           if [ string match "#pass" $line_b ] {
-               set end_2 1
-               set diff_pass 1
-               break
-           } elseif [ string match "#..." $line_b ] {
-               if { [gets $file_b line_b] == $eof } {
-                   set end_2 1
-                   break
-               }
-               verbose "looking for \"^$line_b$\"" 3
-               while { ![regexp "^$line_b$" "$line_a"] } {
-                   verbose "skipping    \"$line_a\"" 3
-                   if { [gets $file_a line_a] == $eof } {
-                       set end_1 1
-                       break
-                   }
-               }
-               break
-           }
-           if { [gets $file_b line_b] == $eof } {
-               set end_2 1
-               break
-           }
-       }
-
-        if { $diff_pass } {
-            break
-        } elseif { $end_1 && $end_2 } {
-            break
-        } elseif { $end_1 } {
-            send_log "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1\n"
-            verbose "extra regexps in $file_2 starting with \"^$line_b$\"\nEOF from $file_1" 3
-            set differences 1
-            break
-        } elseif { $end_2 } {
-            send_log "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n"
-            verbose "extra lines in $file_1 starting with \"^$line_a$\"\nEOF from $file_2\n" 3
-            set differences 1
-            break
-        } else {
-            verbose "regexp \"^$line_b$\"\nline   \"$line_a\"" 3
-            if ![regexp "^$line_b$" "$line_a"] {
-               send_log "regexp_diff match failure\n"
-               send_log "regexp \"^$line_b$\"\nline   \"$line_a\"\n"
-               set differences 1
-            }
-        }
-    }
-
-    if { $differences == 0 && !$diff_pass && [eof $file_a] != [eof $file_b] } {
-       send_log "$file_1 and $file_2 are different lengths\n"
-       verbose "$file_1 and $file_2 are different lengths" 3
-       set differences 1
-    }
-
-    close $file_a
-    close $file_b
-
-    return $differences
-}
-
-proc file_contents { filename } {
-    set file [open $filename r]
-    set contents [read $file]
-    close $file
-    return $contents
+     {{objdump -s endian.sld} {objdump -d endian.dld}} "endinanl.bin" }
 }
 
 run_ld_link_tests $sh64tests
index 356819fb307bce7590efb94fd55acbee8d4432be..4217636eb03ff61b4514dae8f8018109001c5f5f 100644 (file)
@@ -678,7 +678,11 @@ proc run_dump_test { name } {
     } else {
        set sourcefiles {}
        foreach sf $opts(source) {
-           lappend sourcefiles "$srcdir/$subdir/$sf"
+           if { [string match "/*" $sf] } {
+               lappend sourcefiles "$sf"
+           } {
+               lappend sourcefiles "$srcdir/$subdir/$sf"
+           }
            # Must have asflags indexed on source name.
            set asflags($srcdir/$subdir/$sf) $asflags($sf)
        }
@@ -961,6 +965,136 @@ proc file_contents { filename } {
     return $contents
 }
 
+# List contains test-items with 3 items followed by 2 lists:
+# 0:name 1:ld options 2:assembler options
+# 3:filenames of assembler files 4: action and options. 5: name of output file
+
+# Actions:
+# objdump: Apply objdump options on result.  Compare with regex (last arg).
+# nm: Apply nm options on result.  Compare with regex (last arg).
+# readelf: Apply readelf options on result.  Compare with regex (last arg).
+
+proc run_ld_link_tests { ldtests } {
+    global ld
+    global as
+    global nm
+    global objdump
+    global READELF
+    global srcdir
+    global subdir
+    global env
+
+    foreach testitem $ldtests {
+       set testname [lindex $testitem 0]
+       set ld_options [lindex $testitem 1]
+       set as_options [lindex $testitem 2]
+       set as_files  [lindex $testitem 3]
+       set actions [lindex $testitem 4]
+       set binfile tmpdir/[lindex $testitem 5]
+       set objfiles {}
+       set is_unresolved 0
+       set failed 0
+
+#      verbose -log "Testname is $testname"
+#      verbose -log "ld_options is $ld_options"
+#      verbose -log "as_options is $as_options"
+#      verbose -log "as_files is $as_files"
+#      verbose -log "actions is $actions"
+#      verbose -log "binfile is $binfile"
+
+       # Assemble each file in the test.
+       foreach as_file $as_files {
+           set objfile "tmpdir/[file rootname $as_file].o"
+           lappend objfiles $objfile
+
+           if ![ld_assemble $as "$as_options $srcdir/$subdir/$as_file" $objfile] {
+               set is_unresolved 1
+               break
+           }
+       }
+
+       # Catch assembler errors.
+       if { $is_unresolved != 0 } {
+           unresolved $testname
+           continue
+       }
+
+       if ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
+           fail $testname
+       } else {
+           set failed 0
+           foreach actionlist $actions {
+               set action [lindex $actionlist 0]
+               set progopts [lindex $actionlist 1]
+
+               # There are actions where we run regexp_diff on the
+               # output, and there are other actions (presumably).
+               # Handling of the former look the same.
+               set dump_prog ""
+               switch -- $action {
+                   objdump
+                       { set dump_prog $objdump }
+                   nm
+                       { set dump_prog $nm }
+                   readelf
+                       { set dump_prog $READELF }
+                   default
+                       {
+                           perror "Unrecognized action $action"
+                           set is_unresolved 1
+                           break
+                       }
+                   }
+
+               if { $dump_prog != "" } {
+                   set dumpfile [lindex $actionlist 2]
+                   set binary $dump_prog
+
+                   # Ensure consistent sorting of symbols
+                   if {[info exists env(LC_ALL)]} {
+                       set old_lc_all $env(LC_ALL)
+                   }
+                   set env(LC_ALL) "C"
+                   set cmd "$binary $progopts $binfile > dump.out"
+                   send_log "$cmd\n"
+                   catch "exec $cmd" comp_output
+                   if {[info exists old_lc_all]} {
+                       set env(LC_ALL) $old_lc_all
+                   } else {
+                       unset env(LC_ALL)
+                   }
+                   set comp_output [prune_warnings $comp_output]
+
+                   if ![string match "" $comp_output] then {
+                       send_log "$comp_output\n"
+                       set failed 1
+                       break
+                   }
+
+                   if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
+                       verbose "output is [file_contents "dump.out"]" 2
+                       set failed 1
+                       break
+                   }
+               }
+           }
+
+           if { $failed != 0 } {
+               fail $testname
+           } else { if { $is_unresolved == 0 } {
+               pass $testname
+           } }
+       }
+
+       # Catch action errors.
+       if { $is_unresolved != 0 } {
+           unresolved $testname
+           continue
+       }
+    }
+}
+
+
 proc verbose_eval { expr { level 1 } } {
     global verbose
     if $verbose>$level then { eval verbose "$expr" $level }