# Copyright (C) 1993-2026 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.

# True if the object format is known to be ELF.
#
proc is_elf_format {} {
    # config.sub for these targets curiously transforms a target doublet
    # ending in -elf to -none.  eg. m68hc12-elf to m68hc12-unknown-none
    # They are always elf.
    if { [istarget m68hc1*-*] || [istarget s12z*-*] || [istarget xgate-*] } {
	return 1;
    }
# vxworks (and windiss) excluded due to number of ELF tests that need
# modifying to pass on those targets.
#	 && ![istarget *-*-vxworks*]
#	 && ![istarget *-*-windiss*]

    if {    ![istarget *-*-chorus*]
	 && ![istarget *-*-eabi*]
	 && ![istarget *-*-*elf*]
	 && ![istarget *-*-*freebsd*]
	 && ![istarget *-*-fuchsia*]
	 && ![istarget *-*-gnu*]
	 && ![istarget *-*-irix5*]
	 && ![istarget *-*-irix6*]
	 && ![istarget *-*-kaos*]
	 && ![istarget kvx-*-*]
	 && ![istarget *-*-*linux*]
	 && ![istarget *-*-lynxos*]
	 && ![istarget *-*-netbsd*]
	 && ![istarget *-*-nto*]
	 && ![istarget *-*-openbsd*]
	 && ![istarget *-*-rtems*]
	 && ![istarget *-*-solaris2*]
	 && ![istarget *-*-sysv4*]
	 && ![istarget *-*-wasm32*]
	 && ![istarget avr-*-*]
	 && ![istarget hppa*64*-*-hpux*]
	 && ![istarget i?86-*-beos*]
	 && ![istarget ia64-*-hpux*] } {
	return 0
    }

    if { [istarget i?86-*-beospe*] } {
	return 0
    }

    if { [istarget *-*-linux*ecoff*] } {
	return 0
    }

    if { [istarget *-*-netbsdaout*] } {
	return 0
    }

    if {    [istarget arm-*-openbsd*]
	 || [istarget ns32k-*-openbsd*]
	 || [istarget vax-*-openbsd*] } {
	return 0
    }

    return 1
}

# True if the object format is known to be a.out.
#
proc is_aout_format {} {
    if { [istarget *-*-*aout*]
	 || [istarget *-*-bsd*]
	 || [istarget *-*-msdos*]
	 || [istarget ns32k-*-*]
	 || [istarget pdp11-*-*] } {
	return 1
    }
    return 0
}

# True if the object format is known to be PE COFF.
#
proc is_pecoff_format args {
    if { [llength $args] == 1 } {
	set m_os [lindex $args 0]
    } else {
	set m_os *-*
    }
    if { [istarget $m_os-beospe*]
	 || [istarget $m_os-cegcc*]
	 || [istarget $m_os-cygwin*]
	 || [istarget $m_os-interix*]
	 || [istarget $m_os-mingw*]
	 || [istarget $m_os-pe*]
	 || [istarget $m_os-winnt*] } {
	return 1
    }
    return 0
}

# True if the object format is known to COFF or PE (but not ECOFF or XCOFF)
#
proc is_coff_format {} {
    if { [is_pecoff_format]
	 || [istarget *-*-coff*]
	 || [istarget *-*-go32*]
	 || [istarget *-*-msdosdjgpp*]
	 || [istarget tic4x-*-*]
	 || [istarget tic54x-*-*]
	 || [istarget z8k-*-*] } {
	return 1
    }
    return 0
}

proc is_som_format {} {
    if { ![istarget hppa*-*-*] || [istarget hppa*64*-*-*] } {
	return 0;
    }
    if { [istarget *-*-osf*] \
	     || [istarget {*-*-h[ip]ux*}] \
	     || [istarget *-*-mpeix*] \
	     || [istarget *-*-bsd*] } {
	return 1;
    }
    return 0;
}

proc is_xcoff_format {} {
    if { [istarget rs6000-*-*]
	 || [istarget powerpc*-*-aix*]
	 || [istarget powerpc*-*-beos*]
	 || [istarget powerpc*-*-macos*] } {
	return 1;
    }
    return 0;
}

# True if the object format is known to be 64-bit ELF.
#
proc is_elf64 { binary_file } {
    global READELF
    global READELFFLAGS

    set tmpfile [file dirname $binary_file]/readelf.out
    set readelf_size ""
    catch "exec $READELF $READELFFLAGS -h $binary_file > $tmpfile" got

    if ![string match "" $got] then {
	return 0
    }

    if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
	   [file_contents $tmpfile] nil readelf_size] } {
	return 0
    }

    if { $readelf_size == "64" } {
	return 1
    }

    return 0
}

# True if the object format is known to use RELA relocations.
#
proc is_rela { binary_file } {
    global READELF
    global READELFFLAGS

    set tmpfile [file dirname $binary_file]/readelf.out
    catch "exec $READELF $READELFFLAGS -S $binary_file > $tmpfile" got

    if ![string match "" $got] then {
	return 0
    }

    if { ![regexp "RELA" [file_contents $tmpfile]] } {
	return 0
    }

    return 1
}

# Return the file name suffix required for executables, if any.
#
proc exeext {} {
    if { [istarget *-*-cygwin*]
	 || [istarget *-*-mingw*]
	 || [istarget *-*-msdos*]
	 || [istarget *-*-*vms*] } {
	return ".exe"
    }
    return ""
}

# True if the target matches TARGET, specified as a TCL procedure if
# in square brackets or as machine triplet otherwise.
#
proc match_target { target } {
   if [regexp {^!?\[.*\]$} $target] {
	return $target
   } else {
	return [istarget $target]
   }
}

# True if the ELF target supports setting the ELF header OSABI field
# to ELFOSABI_GNU or ELFOSABI_FREEBSD, a requirement for STT_GNU_IFUNC
# symbol and SHF_GNU_MBIND or SHF_GNU_RETAIN section support.
#
# This generally depends on the target OS only, however there are a
# number of exceptions for bare metal targets as follows.  The MSP430
# and Visium targets set OSABI to ELFOSABI_STANDALONE.  Likewise
# non-EABI ARM targets set OSABI to ELFOSABI_ARM
#
# Non-Linux HPPA defaults to ELFOSABI_HPUX.
#
# Note that some TI C6X targets use ELFOSABI_C6000_* but one doesn't,
# so we don't try to sort out tic6x here.  (The effect is that linker
# testcases will generally need to exclude tic6x or use a -m option.)
#
proc supports_gnu_osabi {} {
    if { [istarget *-*-gnu*]
	 || [istarget *-*-linux*]
	 || ( [istarget *-*-*bsd*] && ![istarget arm*-*-netbsd*] )
	 || [istarget *-*-lynxos]
	 || ( [istarget *-*-nto*] && ![istarget arm*-*-*] )
	 || [istarget *-*-irix*]
	 || [istarget *-*-*eabi*]
	 || [istarget *-*-rtems*] } {
	return 1
    }
    if { [istarget "wasm32*-*-*"] } {
	return 1
    }
    if { ![istarget "*-*-elf*"] } {
	return 0
    }
    if { [istarget "arm*-*-*"]
	 || [istarget "msp430-*-*"]
	 || [istarget "hppa-unknown-elf"]
	 || [istarget "kvx*-*-*"]
	 || [istarget "visium-*-*"] } {
	return 0
    }
    return 1
}

# Return true if target uses the generic_link_hash_table linker.
proc is_generic { } {
    if { [istarget "d30v-*-*"]
	 || [istarget "dlx-*-*"]
	 || [istarget "pj*-*-*"]
	 || [istarget "s12z-*-*"]
	 || [istarget "xgate-*-*"] } {
	return 1
    }
    return 0
}

# True if the object format is ELF with unused section symbols.
proc is_elf_unused_section_symbols {} {
    global AS ASFLAGS READELF

    if {![info exists elf_unused_section_symbols_saved]} {
	set elf_unused_section_symbols_saved 1
	if { [is_elf_format] } {
	    set base "empty[pid]"
	    set src "$base.s"
	    set obj "$base.obj"
	    set f [open $src "w"]
	    close $f
	    set cmd "$AS $ASFLAGS -o $obj $src"
	    send_log "$cmd\n"
	    set cmdret [remote_exec host $cmd]
	    set cmdret [lindex $cmdret 0]
	    if { $cmdret == 0 } {
		set cmd "$READELF -sW $obj"
		send_log "$cmd\n"
		set got [remote_exec host $cmd]
		if { ![string match "*SECTION*" $got] }  {
		    set elf_unused_section_symbols_saved 0
		}
	    }
	    file delete $obj
	    file delete $src
	}
    }
    return $elf_unused_section_symbols_saved
}

# True if the ELF target supports STB_GNU_UNIQUE.
#
# This require ELFOSABI_GNU, and `bfd_elf_final_link'.
#
proc supports_gnu_unique {} {
    if { [istarget *-*-freebsd*] } {
	return 0
    }
    if { [supports_gnu_osabi] && ![is_generic] } {
	return 1
    }
    return 0
}

# True for targets that do not sort .symtab as per the ELF standard.
# ie. any that have mips_elf32_be_vec, mips_elf32_le_vec,
# mips_elf32_n_be_vec or mips_elf32_n_le_vec as the primary bfd target
# vector in config.bfd.  When syncing with config.bfd, don't forget that
# earlier case-matches trump later ones.
proc is_bad_symtab {} {
    if { ![istarget "mips*-*-*"] } {
	return 0;
    }
    if { [istarget "*-*-chorus*"]
	 || [istarget "*-*-irix5*"]
	 || [istarget "*-*-irix6*"]
	 || [istarget "*-*-none"]
	 || [istarget "*-*-rtems*"]
	 || [istarget "*-*-windiss"] } {
	return 1;
    }
    if { [istarget "*-*-elf*"]
	 && ![istarget "*-sde-*"]
	 && ![istarget "*-mti-*"]
	 && ![istarget "*-img-*"] } {
	return 1;
    }
    if { [istarget "*-*-openbsd*"]
	 && ![istarget "mips64*-*-*"] } {
	return 1;
    }
    return 0;
}

# Returns true if -shared is supported on the target

proc check_shared_lib_support { } {
    global shared_available_saved
    global ld

    if {![info exists shared_available_saved]} {
	set ld_output [remote_exec host $ld "-shared"]
	if { [ string first "not supported" $ld_output ] >= 0 } {
	    set shared_available_saved 0
	} else {
	    set shared_available_saved 1
	}
    }
    return $shared_available_saved
}

# Returns true if -pie is supported on the target

proc check_pie_support { } {
    global pie_available_saved
    global ld

    ## kvx-*-* does support -shared but not PIE.
    if { [istarget "kvx*-*-*"] && ![istarget "kvx*-linux-*"] } {
        set pie_available_saved 0
    }

    if {![info exists pie_available_saved]} {
	set ld_output [remote_exec host $ld "-pie"]
	if { [ string first "not supported" $ld_output ] >= 0 } {
	    set pie_available_saved 0
	} else {
	    set pie_available_saved 1
	}
    }
    return $pie_available_saved
}

proc check_relro_support { } {
    global relro_available_saved
    global ld

    if {![info exists relro_available_saved]} {
	remote_file host delete norelro
	set ld_output [remote_exec host $ld "-z norelro"]
	if { [string first "not supported" $ld_output] >= 0
	     || [string first "unrecognized option" $ld_output] >= 0
	     || [string first "-z norelro ignored" $ld_output] >= 0
	     || [string first "cannot find norelro" $ld_output] >= 0 } {
	    set relro_available_saved 0
	} else {
	    set relro_available_saved 1
	}
    }
    return $relro_available_saved
}

proc check_memory_seal_support { } {
    global memory_seal_available_saved
    global ld

    if {![info exists memory_seal_available_saved]} {
	remote_file host delete nomemory_seal
	set ld_output [remote_exec host $ld "-z nomemory-seal"]
	if { [string first "not supported" $ld_output] >= 0
	     || [string first "unrecognized option" $ld_output] >= 0
	     || [string first "-z nomemory-seal ignored" $ld_output] >= 0
	     || [string first "cannot find nomemory-seal" $ld_output] >= 0 } {
	    set memory_seal_available_saved 0
	} else {
	    set memory_seal_available_saved 1
	}
    }
    return $memory_seal_available_saved
}

# Check for support of the .noinit section, used for data that is not
# initialized at load, or during the application's initialization sequence.
proc supports_noinit_section {} {
    # .noinit is only supported by ELF targets.
    if { ![is_elf_format] } {
	return 0;
    }

    # Targets that set HAVE_NOINIT=yes in their emulparams script utilizing
    # elf.sc, or explicitly define a .noinit section in their linker script.
    #
    # arc-*-* is not included here, since it only supports .noinit with the
    # non-default arcv2elf emulation.
    if { ([istarget "arm-*-*"] && ![istarget "arm*-linux-*"])
	  || [istarget "avr-*-*"]
	  || [istarget "msp430-*-*"]
	  || [istarget "pru-*-*"] } {
	return 1;
    }
    return 0;
}

# Check for support of the .persistent section, used for data that is
# initialized at load, but not during the application's initialization sequence.
proc supports_persistent_section {} {
    # .persistent is only supported by ELF targets.
    if { ![is_elf_format] } {
	return 0;
    }

    # Targets that set HAVE_PERSISTENT=yes in their emulparams script utilizing
    # elf.sc, or explicitly define a .persistent section in their linker script.
    if { ([istarget "arm-*-*"] && ![istarget "arm*-linux-*"])
	  || [istarget "msp430-*-*"] } {
	return 1;
    }
    return 0;
}

# Whether a target support DT_RELR sections.
proc supports_dt_relr {} {
    if { ([istarget x86_64-*-*]
	  || [istarget i?86-*-*]
	  || [istarget powerpc64*-*-*]
	  || [istarget aarch64*-*-*]
	  || [istarget loongarch64*-*-*])
	 && ([istarget *-*-linux*]
	     || [istarget *-*-gnu*]) } {
	return 1
    }
    return 0
}

# Whether a target assembler supports --gsframe.
proc gas_sframe_check {} {
    global check_as_sframe_result
    global AS
    global ASFLAGS
    if [info exists check_as_sframe_result] {
	return $check_as_sframe_result
    }

    set as_file "tmpdir/check_as_sframe.s"
    set as_fh [open $as_file w 0666]
    puts $as_fh "# Generated file. DO NOT EDIT"
    puts $as_fh "\t.cfi_startproc"
    puts $as_fh "\t.cfi_endproc"
    close $as_fh
    remote_download host $as_file
    verbose -log "Checking SFrame support in AS:"

    set status [remote_exec host "$AS $ASFLAGS --gsframe $as_file"]

    if { [lindex $status 0] != 0 } then {
	verbose -log "SFrame not supported in AS"
	set check_as_sframe_result 0
    } else {
	verbose -log "SFrame supported in AS"
	set check_as_sframe_result 1
    }
    return $check_as_sframe_result
}

# Whether a target supports Object Attributes v1
proc supports_oa_v1 {} {
    if { ![is_elf_format]
	 && ![istarget *-*-vxworks*] && ![istarget *-*-windiss*] } {
	return 0
    }
    if { [istarget arc-*-*]
	 || [istarget arm*-*-*]
	 || [istarget csky*-*-*]
	 || [istarget loongarch*-*-*]
	 || [istarget m68*-*-*]
	 || [istarget mips*-*-*]
	 || [istarget msp*-*-*]
	 || [istarget powerpc*-*-*]
	 || [istarget riscv*-*-*]
	 || [istarget s390*-*-*]
	 || [istarget sparc*-*-*]
	 || [istarget tic6x*-*-*] } {
	return 1
    }
    return 0
}

# Whether a target supports Object Attributes v2
proc supports_oa_v2 {} {
    if { ![is_elf_format]
	 && ![istarget *-*-vxworks*] && ![istarget *-*-windiss*] } {
	return 0
    }
    if { [istarget aarch64*-*-*] } {
	return 1
    }
    return 0
}

# get_relative_path FROM TO
#
# Return a relative path to TO starting from FROM, which is usually
# supposed to be a directory.  The result is optimised in that both
# paths are normalized and any leading part shared between the two
# discarded, and then a suitable number of "../" elements prepended
# to the remaining part of TO to get to the point of divergence from
# FROM.

proc get_relative_path { from to } {
    set split_from [file split [file normalize $from]]
    set split_to [file split [file normalize [file dirname $to]]]
    set from_len [llength $split_from]
    set to_len [llength $split_to]
    set len [expr { $to_len < $from_len } ? $to_len : $from_len]
    set relative_path {}

    for { set i 0 } { $i < $len } { incr i } {
	if { ![string equal [lindex $split_from $i] [lindex $split_to $i]] } {
	    break
	}
    }
    for { set j $i } { $j < $from_len } { incr j } {
	lappend relative_path ".."
    }
    for { set j $i } { $j < $to_len } { incr j } {
	lappend relative_path [lindex $split_to $j]
    }

    return [eval file join $relative_path [file tail $to]]
}

# Compare two files line-by-line.  FILE_1 is the actual output and FILE_2
# is the expected output.  Ignore blank lines in either file.
#
# FILE_2 is a series of regexps, comments and # directives.  The directives
# are:
#
#    #pass
#        Treat the test as a PASS if everything up till this point has
#        matched.  Ignore any remaining lines in either FILE_1 or FILE_2.
#
#    #failif
#        Reverse the sense of the test: expect differences to exist.
#
#    #...
#    REGEXP
#        Skip all lines in FILE_1 until the first that matches REGEXP.
#
#    #?REGEXP
#        Optionally match REGEXP against line from FILE_1.  If the REGEXP
#        does not match then the next line from FILE_2 is tried.
#
# Other # lines are comments.  Regexp lines starting with the `!' character
# specify inverse matching (use `\!' for literal matching against a leading
# `!').  Skip empty lines in both files.
#
# The first optional argument is a list of regexp substitutions of the form:
#
#    EXP1 SUBSPEC1 EXP2 SUBSPEC2 ...
#
# This tells the function to apply each regexp substitution EXPi->SUBSPECi
# in order to every line of FILE_2.
#
# Return nonzero if differences exist.
proc regexp_diff { file_1 file_2 args } {
    set eof -1
    set end_1 0
    set end_2 0
    set differences 0
    set diff_pass 0
    set fail_if_match 0
    set ref_subst ""
    if { [llength $args] > 0 } {
	set ref_subst [lindex $args 0]
    }
    if { [llength $args] > 1 } {
	perror "Too many arguments to regexp_diff"
	return 1
    }

    if [file exists $file_1] then {
	set file_a [open $file_1 r]
    } else {
	perror "$file_1 doesn't exist"
	return 1
    }

    if [file exists $file_2] then {
	set file_b [open $file_2 r]
    } else {
	perror "$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 } {
	    # Ignore blank line in FILE_1.
	    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 "#failif" $line_b] } {
		send_log "fail if no difference\n"
		verbose "fail if no difference" 3
		set fail_if_match 1
	    } elseif { [string match "#..." $line_b] } {
		if { [gets $file_b line_b] == $eof } {
		    set end_2 1
		    set diff_pass 1
		    break
		}
		set negated [expr { [string index $line_b 0] == "!" }]
		set line_bx [string range $line_b $negated end]
		set n [expr { $negated ? "! " : "" }]
		# Substitute on the reference.
		foreach {name value} $ref_subst {
		    regsub -- $name $line_bx $value line_bx
		}
		verbose "looking for $n\"^$line_bx$\"" 3
		while { [expr [regexp "^$line_bx$" "$line_a"] == $negated] } {
		    verbose "skipping    \"$line_a\"" 3
		    if { [gets $file_a line_a] == $eof } {
			set end_1 1
			break
		    }
		}
		break
	    } elseif { [string match "#\\?*" $line_b] } {
		if { ! $end_1 } {
		    set line_b [string replace $line_b 0 1]
		    set negated [expr { [string index $line_b 0] == "!" }]
		    set line_bx [string range $line_b $negated end]
		    set n [expr { $negated ? "! " : "" }]
		    # Substitute on the reference.
		    foreach {name value} $ref_subst {
			regsub -- $name $line_bx $value line_bx
		    }
		    verbose "optional match for $n\"^$line_bx$\"" 3
		    if { [expr [regexp "^$line_bx$" "$line_a"] != $negated] } {
			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 {
	    set negated [expr { [string index $line_b 0] == "!" }]
	    set line_bx [string range $line_b $negated end]
	    set n [expr { $negated ? "! " : "" }]
	    set s [expr { $negated ? "  " : "" }]
	    # Substitute on the reference.
	    foreach {name value} $ref_subst {
		regsub -- $name $line_bx $value line_bx
	    }
	    verbose "regexp $n\"^$line_bx$\"\nline   \"$line_a\"" 3
	    if { [expr [regexp "^$line_bx$" "$line_a"] == $negated] } {
		send_log "regexp_diff match failure\n"
		send_log "regexp $n\"^$line_bx$\"\nline   $s\"$line_a\"\n"
		verbose "regexp_diff match failure\n" 3
		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
    }

    if { $fail_if_match } {
	if { $differences == 0 } {
	    set differences 1
	} else {
	    set differences 0
	}
    }

    close $file_a
    close $file_b

    return $differences
}

# prune_warnings_extra -- delete extra warnings from TEXT.
#
# An example is:
# ld: warning: /lib64/ld-linux-x86-64.so.2: unsupported GNU_PROPERTY_TYPE (5) type : 0xc0010001
proc prune_warnings_extra { text } {
    global experimental

    # Property warnings are only pruned from non-experimental code (ie code
    # not on a release branch).  For experimental code we want the warnings
    # as they indicate that the sources need to be updated to recognise
    # the new properties.
    if { "$experimental" == "false" } {
	# The "\\1" is to try to preserve a "\n" but only if necessary.
	regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*unsupported GNU_PROPERTY_TYPE\[^\n\]*\n?)+" $text "\\1" text
    }

    # PR binutils/23898: It is OK to have gaps in build notes.
    regsub -all "(^|\n)(\[^\n\]*: Warning: Gap in build notes detected from\[^\n\]*\n?)+" $text "\\1" text

    # Many tests use assembler source files without a .note.GNU-stack section.
    # So ignore warnings about it being missing.
    regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*missing \\.note\\.GNU-stack section\[^\n\]*\n?)+" $text "\\1" text
    regsub -all "(^|\n)(\[^\n\]*: NOTE: This behaviour is deprecated\[^\n\]*\n?)+" $text "\\1" text

    # Ignore warnings about RWX segments.
    regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*has a LOAD segment with RWX permissions\[^\n\]*\n?)+" $text "\\1" text
    regsub -all "(^|\n)(\[^\n\]*: warning:\[^\n\]*has a TLS segment with execute permission\[^\n\]*\n?)+" $text "\\1" text

    # Configuring with --enable-warn-execstack=yes will generate warnings if
    # -z execstack is used.
    regsub -all "(^|\n)(\[^\n\]*: warning: enabling an executable stack because of -z execstack command line option\[^\n\]*\n?)+" $text "\\1" text

    # Ignore LTO warnings triggered by configuring with --enable-pgo-build=lto.
    regsub -all "(^|\n)(\[^\n\]*lto-wrapper: warning: using serial compilation of \[0-9\]+ LTRANS jobs\[^\n\]*\n?)+" $text "\\1" text
    regsub -all "(^|\n)(\[^\n\]*lto-wrapper: note: \[^\n\]*\n?)+" $text "\\1" text

    return $text
}

if { [info procs saved-prune_warnings] == [list] } {
    rename prune_warnings saved-prune_warnings
    proc prune_warnings { text } {
	set text [saved-prune_warnings $text]
	set text [prune_warnings_extra $text]
	return $text
    }
}

# prune_dump_output OUTPUT
#
# Clean up the output from system specific or unwanted characters.
# This allows to simplify the regexp inside dump tests.
proc prune_dump_output { output } {
    if [ishost "*-*-mingw*"] {
	# Prune DOS drive letter from an absolute path if it appears
	# at the beginning of a line.
	regsub -all {(^|\n)[[:alpha:]]:(/|\\)} $output "\\1\\2" output
    }

    # Prune last end of line.
    regsub "\n$" $output "" output
    return $output
}

# run_dump_test FILE (optional:) EXTRA_OPTIONS
#
# Assemble a .s file, then run some utility on it and check the output.
# Optionally generate the .s file first by running the compiler.
#
# There should be an assembly language file named FILE.s in the test
# suite directory, and a pattern file called FILE.d.  run_dump_test
# will assemble FILE.s, optionally run objcopy on the object file,
# optionally run ld, optionally run another objcopy, optionally run
# another tool under test specified by PROG, then run a dump tool like
# addr2line, nm, objdump, readelf or size on the object file to produce
# textual output, and then analyze that with regexps.
# The FILE.d file specifies what program to run, and what to expect in
# its output.
#
# The FILE.d file begins with zero or more option lines, which specify
# flags to pass to the assembler, the program to run to dump the
# assembler's output, and the options it wants.  The option lines have
# the syntax:
#
#         # OPTION: VALUE
#
# OPTION is the name of some option, like "name" or "objdump", and
# VALUE is OPTION's value.  The valid options are described below.
# Whitespace is ignored everywhere, except within VALUE.  The option
# list ends with the first line that doesn't match the above syntax.
# However, a line within the options that begins with a #, but doesn't
# have a recognizable option name followed by a colon, is considered a
# comment and entirely ignored.
#
# The optional EXTRA_OPTIONS argument to `run_dump_test' is a list of
# two-element lists.  The first element of each is an option name, and
# the second additional arguments to be added on to the end of the
# option list as given in FILE.d.  (If omitted, no additional options
# are added.)
#
# The interesting options are:
#
#   name: TEST-NAME
#	The name of this test, passed to DejaGNU's `pass' and `fail'
#	commands.  If omitted, this defaults to FILE, the root of the
#	.s and .d files' names.
#
#   as: FLAGS
#	When assembling, 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.
#
#   dlltool: FLAGS
#       Before linking, run dlltool with FLAGS.
#
#   ld: FLAGS
#	Link assembled files using FLAGS, in the order of the "source"
#	directives, when using multiple files.
#
#   ld_after_inputfiles: FLAGS
#	Similar to "ld", but put FLAGS after all input files.
#
#   cc: FLAGS
#       Run the compiler with FLAGS (to which -S is added) to generate assembler
#       source first.  source: must be provided and should consist of .c files.
#       Source-specific CC flags are not supported.
#
#   objcopy_objects: FLAGS
#	Run objcopy with the specified flags after assembling any source
#	that has the special marker RUN_OBJCOPY in the source specific
#	flags.
#
#   objcopy_linked_file: FLAGS
#	Run objcopy on the linked file with the specified flags.
#	This lets you transform the linked file using objcopy, before the
#	result is analyzed by an analyzer program specified below.
#
#   PROG: PROGRAM-NAME
#	The name of a program under test, to run to modify or analyze the
#	.o file produced by the assembler.  Recognised names are: ar,
#	elfedit, nm, objcopy, ranlib, strings, and strip.
#
#   DUMPPROG: PROGRAM-NAME
#       The name of the program to run to analyze the file produced
#       by the assembler or the linker.  This can be omitted;
#       run_dump_test will guess which program to run from which of
#       the flags options below is present.
#
#   addr2line: FLAGS
#   nm: FLAGS
#   objdump: FLAGS
#   readelf: FLAGS
#   size: FLAGS
#	Use the specified program to analyze the output file, and pass it
#	FLAGS, in addition to the output name.  Note that they are run
#	with LC_ALL=C in the environment to give consistent sorting of
#	symbols.  If no FLAGS are needed then you can use:
#	    DUMPPROG: [nm objdump readelf addr2line]
#	instead, or just pass a flag that happens to be the default.
#	If objdump is the dump tool and we're not dumping binary, nor
#	have run ld, then the standard section names (.text, .data and
#	.bss) are replaced by target ones if any (eg. rx-elf uses "P"
#	instead of .text).  The substition is done for both the
#	objdump options (eg: "-j .text" is replaced by "-j P") and the
#	reference file.
#
#   source: SOURCE [FLAGS]
#	Assemble the file SOURCE.s using the flags in the "as" directive
#	and the (optional) FLAGS.  If omitted, the source defaults to
#	FILE.s.
#	This is useful if several .d files want to share a .s file.
#	More than one "source" directive can be given, which is useful
#	when testing linking.
#
#   dump: DUMP
#	Match against DUMP.d.  If omitted, this defaults to FILE.d.  This
#	is useful if several .d files differ by options only.  Options are
#	always read from FILE.d.
#
#   target: GLOB|PROC ...
#	Run this test only on a specified list of targets.  More precisely,
#	in the space-separated list each glob is passed to "istarget" and
#	each proc is called as a TCL procedure.  List items are interpreted
#	such that procs are denoted by surrounding square brackets, and any
#	other items are consired globs.  If the call evaluates true for any
#	of them, the test will be run, otherwise it will be marked
#	unsupported.
#
#   notarget: GLOB|PROC ...
#	Do not run this test on a specified list of targets.  Again, each
#	glob in the space-separated list is passed to "istarget" and each
#	proc is called as a TCL procedure, and the test is run if it
#	evaluates *false* for *all* of them.  Otherwise it will be marked
#	unsupported.
#
#   alltargets: GLOB|PROC ...
#	Run this test on a specified list of targets.  Again, each
#	glob in the space-separated list is passed to "istarget" and each
#	proc is called as a TCL procedure, and the test is run if it
#	evaluates *true* for *all* of them.  Otherwise it will be marked
#	unsupported.
#
#   skip: GLOB|PROC ...
#   anyskip: GLOB|PROC ...
#   noskip: GLOB|PROC ...
#	These are exactly the same as "notarget", "alltargets" and
#	"target" respectively, except that they do nothing at all if the
#	check fails.  They should only be used in groups, to construct a
#	single test which is run on all targets but with variant options
#	or expected output on some targets.  (For example, see
#	gas/arm/inst.d and gas/arm/wince_inst.d.)
#
#   xfail: GLOB|PROC ...
#	Run this test and it is is expected to fail on a specified list
#	of targets.
#
#   noxfail: GLOB|PROC ...
#	Of targets that match the xfail list, this list won't fail.
#
#   error: REGEX
#	An error with message matching REGEX must be emitted for the test
#	to pass.  The DUMPPROG, addr2line, nm, objdump, readelf and size
#	options have no meaning and need not supplied if this is present.
#	Multiple "error" directives append to the expected error message.
#
#   error_output: FILE
#	Means the same as 'error', except the regular expression lines
#	are contains in FILE.
#
#   warning: REGEX
#	Expect a warning matching REGEX.  It is an error to issue
#	both "error" and "warning".  Multiple "warning" directives
#	append to the expected warning message.
#
#   warning_output: FILE
#	Means the same as 'warning', except the regular expression
#	lines are contains in FILE.
#
#   map: FILE
#	Adding this option will cause the linker to generate a linker
#	map file, using the -Map=MAPFILE command line option.  If
#	there is no -Map=MAPFILE in the 'ld: FLAGS' then one will be
#	added to the linker command line.  The contents of the
#	generated MAPFILE are then compared against the regexp lines
#	in FILE using `regexp_diff' (see below for details).
#
#   section_subst: no
#	Means that the section substitution for objdump is disabled.
#
# Each option may occur at most once unless otherwise mentioned.
#
# After the option lines come regexp lines.  run_dump_test calls
# regexp_diff to compare the output of the dumping tool against the
# regexps in FILE.d.
#
proc run_dump_test { name {extra_options {}} } {
    global ADDR2LINE ADDR2LINEFLAGS AS ASFLAGS CC_FOR_TARGET CFLAGS_FOR_TARGET
    global ELFEDIT ELFEDITFLAGS LD LDFLAGS NM NMFLAGS OBJCOPY OBJCOPYFLAGS
    global OBJDUMP OBJDUMPFLAGS READELF READELFFLAGS STRIP STRIPFLAGS
    global SIZE SIZEFLAGS
    global copyfile env runtests srcdir subdir verbose base_dir
    global DT_RELR_LDFLAGS NO_DT_RELR_LDFLAGS

    if [string match "*/*" $name] {
	set file $name
	set name [file tail $name]
    } else {
	set file "$srcdir/$subdir/$name"
    }

    if ![runtest_file_p $runtests $name] then {
	return
    }

    set opt_array [slurp_options "${file}.d"]
    if { $opt_array == -1 } {
	perror "error reading options from $file.d"
	unresolved $subdir/$name
	return
    }
    set dumpfile tmpdir/dump.out
    set run_ld 0
    set run_objcopy 0
    set objfile_names {}
    set opts(PROG) {}
    set opts(DUMPPROG) {}
    set opts(addr2line) {}
    set opts(alltargets) {}
    set opts(anyskip) {}
    set opts(ar) {}
    set opts(as) {}
    set as_final_flags {}
    set as_additional_flags {}
    set opts(cc) {}
    set opts(dlltool) {}
    set opts(dump) {}
    set opts(elfedit) {}
    set opts(error) {}
    set opts(error_output) {}
    set opts(ld) {}
    set opts(ld_after_inputfiles) {}
    set opts(map) {}
    set opts(name) {}
    set opts(nm) {}
    set opts(noskip) {}
    set opts(notarget) {}
    set opts(objcopy) {}
    set opts(objcopy_linked_file) {}
    set opts(objcopy_objects) {}
    set opts(objdump) {}
    set opts(ranlib) {}
    set opts(readelf) {}
    set opts(section_subst) {}
    set opts(size) {}
    set opts(strings) {}
    set opts(strip) {}
    set opts(skip) {}
    set opts(source) {}
    set opts(strip) {}
    set opts(target) {}
    set opts(warning) {}
    set opts(warning_output) {}
    set opts(xfail) {}
    set opts(noxfail) {}

    set in_extra 0
    foreach i [concat $opt_array {{} {}} $extra_options] {
	set opt_name [lindex $i 0]
	set opt_val [lindex $i 1]
	if { $opt_name == "" } {
	    set in_extra 1
	    continue
	}
	if ![info exists opts($opt_name)] {
	    perror "unknown option $opt_name in file $file.d"
	    unresolved $subdir/$name
	    return
	}

	# Allow more substitutions, including tcl functions, for as, ld,
	# and cc.  Not done in general because extra quoting is needed for glob
	# args used for example in binutils-all/remove-relocs-04.d.
	if { $opt_name == "as" || $opt_name == "ld" || $opt_name == "ld_after_inputfiles" || $opt_name == "cc" } {
	    set opt_val [subst $opt_val]
	} else {
	    # Just substitute $srcdir and $subdir
	    regsub -all {\$srcdir} "$opt_val" "$srcdir" opt_val
	    regsub -all {\$subdir} "$opt_val" "$subdir" opt_val
	    regsub -all {\$\{srcdir\}} "$opt_val" "$srcdir" opt_val
	    regsub -all {\$\{subdir\}} "$opt_val" "$subdir" opt_val
	}

	switch -- $opt_name {
	    xfail {}
	    noxfail {}
	    target {}
	    alltargets {}
	    notarget {}
	    skip {}
	    anyskip {}
	    noskip {}
	    warning {}
	    error {}
	    source {
		# Move any source-specific as-flags to a separate list to
		# simplify processing.
		if { [llength $opt_val] > 1 } {
		    lappend asflags [lrange $opt_val 1 end]
		    set opt_val [lindex $opt_val 0]
		} else {
		    lappend asflags {}
		}

		# Create the object file name based on nothing but the source
		# file name.
		set new_objfile \
		    [concat tmpdir/[file rootname [file tail [lindex $opt_val 0]]].o]
		# But, sometimes, we have the exact same source filename in
		# different directories (foo/src.s bar/src.s) which would lead
		# us to try and create two src.o files.  We detect this
		# conflict here, and instead create src.o and src1.o.
		set j 0
		while { [lsearch $objfile_names $new_objfile] != -1 } {
		    incr j
		    set new_objfile \
			[concat tmpdir/[file rootname [file tail  [lindex $opt_val 0]]]${j}.o]
		}
		lappend objfile_names $new_objfile
	    }
	    default {
		if { !$in_extra
		     && [string length $opts($opt_name)]
		     && $opt_name != "as" } {
		    perror "option $opt_name multiply set in $file.d"
		    unresolved $subdir/$name
		    return
		}

		# A single "#ld:" with no options should do the right thing.
		if { $opt_name == "ld" } {
		    set run_ld 1
		}
		# Likewise objcopy_linked_file.
		if { $opt_name == "objcopy_linked_file" } {
		    set run_objcopy 1
		}
	    }
	}

	# Append differently whether it's a message (without space) or
	# an option or list (with space).
	switch -- $opt_name {
	    warning -
	    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]
	    }
	}
    }

    # Ensure there is something in $opts(as) for the foreach loop below.
    if { [llength $opts(as)] == 0 } {
	set opts(as) [list " "]
    }
    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
	lappend as_final_flags $x
    }

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

    if { $opts(name) == "" } {
	set base_testname "$subdir/$name"
    } else {
	set base_testname $opts(name)
    }

    set err_warn 0
    foreach opt { warning error warning_output error_output } {
	if { $opts($opt) != "" } {
	    if { $err_warn } {
		perror "$base_testname: bad mix of warning and error test directives"
		unresolved $base_testname
		return
	    }
	    set err_warn 1
	}
    }

    # Decide early whether we should run the test for this target.
    if { [llength $opts(noskip)] > 0 } {
	set targmatch 0
	foreach targ $opts(noskip) {
	    if [match_target $targ] {
		set targmatch 1
		break
	    }
	}
	if { $targmatch == 0 } {
	    return
	}
    }
    foreach targ $opts(anyskip) {
	if ![match_target $targ] {
	    return
	}
    }
    foreach targ $opts(skip) {
	if [match_target $targ] {
	    return
	}
    }
    if { [llength $opts(target)] > 0 } {
	set targmatch 0
	foreach targ $opts(target) {
	    if [match_target $targ] {
		set targmatch 1
		break
	    }
	}
	if { $targmatch == 0 } {
	    unsupported $base_testname
	    return
	}
    }
    foreach targ $opts(alltargets) {
	if ![match_target $targ] {
	    unsupported $base_testname
	    return
	}
    }
    foreach targ $opts(notarget) {
	if [match_target $targ] {
	    unsupported $base_testname
	    return
	}
    }

    set dumpprogram ""
    # It's meaningless to require an output-testing method when we
    # expect an error.
    if { $opts(error) == "" && $opts(error_output) == "" } {
	if { $opts(DUMPPROG) != "" } {
	    switch -- $opts(DUMPPROG) {
		addr2line	{ set dumpprogram addr2line }
		nm		{ set dumpprogram nm }
		objdump		{ set dumpprogram objdump }
		readelf		{ set dumpprogram readelf }
		size		{ set dumpprogram size }
		default		{
		    perror "unrecognized DUMPPROG option $opts(DUMPPROG) in $file.d"
		    unresolved $base_testname
		    return
		}
	    }
	} else {
	    # Guess which program to run, by seeing which option was specified.
	    foreach p {addr2line nm objdump readelf size} {
		if {$opts($p) != ""} {
		    if {$dumpprogram != ""} {
			perror "ambiguous dump program in $file.d"
			unresolved $base_testname
			return
		    } else {
			set dumpprogram $p
		    }
		}
	    }
	}
	if { $dumpprogram == "" && $opts(map) == "" && !$err_warn } {
	    perror "dump program unspecified in $file.d"
	    unresolved $base_testname
	    return
	}
    }

    # Possibly compile some of the inputs, and build up a replacement
    # for opts(source) with the output .s names substituted in as we go.
    # Set the .s names from the objfile_names to take advantage of the
    # uniquification that happened earlier.
    if { $opts(cc) != ""} {
	set cmdret 0
	set new_source ""

	foreach cfile $opts(source) ofile $objfile_names {
	    if { [file extension $cfile] != ".c" } {
		lappend new_source "$cfile"
		continue
	    }

	    if { ! [string match "./*" $cfile] } {
		set cfile "$srcdir/$subdir/$cfile"
	    }
	    # ofile is never absolute, so this always works to protect sfile
	    # from later absolutization.
	    set sfile "./[file rootname $ofile].s"
	    set cmd "$CC_FOR_TARGET $CFLAGS_FOR_TARGET -S $opts(cc) -o $sfile $cfile"
	    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"
	    lappend new_source "$sfile"
	    set cmdret [lindex $cmdret 0]

	    regsub "\n$" $comp_output "" comp_output
	    if { $cmdret != 0} {
		send_log "compilation of $cfile failed, exit status $cmdret with <$comp_output>"
		# Should this be 'unresolved', or is that too silent?
		fail $base_testname
		return 0
	    }
	}
	set opts(source) $new_source
    }

    if { $opts(source) == "" } {
	set sourcefiles [list ${file}.s]
	set asflags [list ""]
	set objfile_names [list tmpdir/[file tail ${file}].o]
    } else {
	set sourcefiles {}
	foreach sf $opts(source) {
	    if { [string match "./*" $sf] } {
		lappend sourcefiles "$sf"
	    } else {
		lappend sourcefiles "$srcdir/$subdir/$sf"
	    }
	}
    }

    if { $opts(dump) == "" } {
	set dfile ${file}.d
    } else {
	set dfile $srcdir/$subdir/$opts(dump)
    }

    # Time to setup xfailures.
    foreach targ $opts(xfail) {
	if [match_target $targ] {
	    setup_xfail "*-*-*"
	    break
	}
    }
    foreach targ $opts(noxfail) {
	if [match_target $targ] {
	    clear_xfail "*-*-*"
	    break
	}
    }

    foreach as_flags $as_final_flags {
	if { [llength $as_final_flags] > 1 } {
	    set testname [concat $base_testname $as_flags]
	} else {
	    set testname $base_testname
	}
	# 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]
	    }
	}

	# Run dlltool.
	if { $cmdret == 0 && $opts(dlltool) != "" } {
	    set dlltool [findfile $base_dir/../binutils/dlltool]
	    set cmd "$dlltool -S $AS $opts(dlltool)"
	    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 [check_relro_support] {
		set ld_extra_opt "-z norelro"
	    }
	    if [check_memory_seal_support] {
		append ld_extra_opt " -z nomemory-seal"
	    }

	    # 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 [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 } {
		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 [prune_warnings [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)
		}
	    }
	}

	set comp_output [prune_dump_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"
	    }

	    set ok 0
	    if { ($cmdret == 0) == ($want_out(terminal) == 0) } {
		switch $want_out(source) {
		    regex { set ok [regexp -- $want_out(regex) $comp_output] }
		    file  { set ok [expr ![regexp_diff tmpdir/ld.messages \
					   $srcdir/$subdir/$want_out(file)]] }
		    ""    { set ok [string equal $comp_output ""] }
		}
	    }
	    if { $ok } {
		# 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 { $want_out(terminal) } {
	    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
    }
}

proc slurp_options { file } {
    # If options_regsub(foo) is set to {a b}, then the contents of a
    # "#foo:" line will have regsub -all applied to replace a with b.
    global options_regsub

    if [catch { set f [open $file r] } x] {
	#perror "couldn't open `$file': $x"
	perror "$x"
	return -1
    }
    set opt_array {}
    # whitespace expression
    set ws  {[ 	]*}
    set nws {[^ 	]*}
    # whitespace is ignored anywhere except within the options list;
    # option names are alphanumeric plus underscore.
    set pat "^#${ws}(\[a-zA-Z0-9_\]*)$ws:${ws}(.*)$ws\$"
    while { [gets $f line] != -1 } {
	set line [string trim $line]
	# Whitespace here is space-tab.
	if [regexp $pat $line xxx opt_name opt_val] {
	    # match!
	    if [info exists options_regsub($opt_name)] {
		set subst $options_regsub($opt_name)
		regsub -all -- [lindex $subst 0] $opt_val [lindex $subst 1] \
		    opt_val
	    }
	    lappend opt_array [list $opt_name $opt_val]
	} elseif {![regexp "^#" $line ]} {
	    break
	}
    }
    close $f
    return $opt_array
}

proc file_contents { filename } {
    set file [open $filename r]
    set contents [read $file]
    close $file
    return $contents
}

proc set_file_contents { filename contents } {
    set file [open $filename w]
    puts $file "$contents"
    close $file
}

# Look for big-endian or little-endian switches in the multlib
# options and translate these into a -EB or -EL switch.  Note
# we cannot rely upon proc process_multilib_options to do this
# for us because for some targets the compiler does not support
# -EB/-EL but it does support -mbig-endian/-mlittle-endian, and
# the site.exp file will include the switch "-mbig-endian"
# (rather than "big-endian") which is not detected by proc
# process_multilib_options.
#
proc big_or_little_endian {} {

    if [board_info [target_info name] exists multilib_flags] {
	set tmp_flags " [board_info [target_info name] multilib_flags]"

	foreach x $tmp_flags {
	    switch -glob $x {
		*big*endian -
		eb -
		EB -
		-eb -
		-EB -
		-mb -
		-meb {
		    set flags " -EB"
		    return $flags
		}
		*little*endian -
		el -
		EL -
		-el -
		-EL -
		-ml -
		-mel {
		    set flags " -EL"
		    return $flags
		}
	    }
	}
    }

    set flags ""
    return $flags
}

# Internal procedure: return the names of the standard sections
#
proc get_standard_section_names {} {
    if [istarget "rx-*-elf"] {
	return { "P" "D_1" "B_1" }
    }
    if { [istarget "alpha*-*-*vms*"] || [is_som_format] } {
	return { {\$CODE\$} {\$DATA\$} {\$BSS\$} }
    }
    return
}

set llvm_plug_opt ""
if { [isnative] } then {
    if ![info exists CLANG_FOR_TARGET] then {
	catch "exec clang -v" got
	if [regexp "clang version" $got] then {
	    set CLANG_FOR_TARGET clang
	}
    }
}
if [info exists CLANG_FOR_TARGET] then {
    set llvm_plug_so [string trim [exec $CLANG_FOR_TARGET -print-file-name=LLVMgold.so]]
    if { $llvm_plug_so ne "LLVMgold.so" } then {
	set llvm_plug_opt "--plugin $llvm_plug_so"
    }
    if { $llvm_plug_opt eq "" && [isnative] } then {
	# If it is still blank, try llvm-config --libdir.  Clang
	# searches CLANG_INSTALL_LIBDIR_BASENAME which corresponds
	# to this.
	catch "exec llvm-config --libdir" got
	if {[file isdirectory $got] \
	    && [file isfile $got/LLVMgold.so]} then {
	    set llvm_plug_opt "--plugin $got/LLVMgold.so"
	}
    }
}
