- # 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 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