# Support routines for LD testsuite.
#   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
#    2004, 2005, 2006, 2007, 2008, 2009  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.

# Extract and print the version number of ld.
#
proc default_ld_version { ld } {
    global host_triplet

    if { ![is_remote host] && [which $ld] == 0 } then {
	perror "$ld does not exist"
	exit 1
    }

    remote_exec host "$ld --version" "" "/dev/null" "ld.version"
    remote_upload host "ld.version"
    set tmp [prune_warnings [file_contents "ld.version"]]
    remote_file build delete "ld.version"
    remote_file host delete "ld.version"

    regexp "\[^\n\]* (cygnus-|)(\[-0-9.a-zA-Z-\]+)\[\r\n\].*" $tmp version cyg number
    if [info exists number] then {
	clone_output "$ld $number\n"
    }
}

proc run_host_cmd { prog command } {
    global link_output

    if { ![is_remote host] && [which "$prog"] == 0 } then {
	perror "$prog does not exist"
	return 0
    }

    verbose -log "$prog $command"
    set status [remote_exec host [concat sh -c [list "$prog $command 2>&1"]] "" "/dev/null" "ld.tmp"]
    remote_upload host "ld.tmp"
    set link_output [file_contents "ld.tmp"]
    regsub "\n$" $link_output "" link_output
    if { [lindex $status 0] != 0 && [string match "" $link_output] } then {
	append link_output "child process exited abnormally"
    }
    remote_file build delete ld.tmp
    remote_file host delete ld.tmp

    if [string match "" $link_output] then {
	return ""
    }

    verbose -log "$link_output"
    return "$link_output"
}

proc run_host_cmd_yesno { prog command } {
    global exec_output

    set exec_output [prune_warnings [run_host_cmd "$prog" "$command"]]
    if [string match "" $exec_output] then {
	return 1;
    }
    return 0;
}

# Link an object using relocation.
#
proc default_ld_relocate { ld target objects } {
    global HOSTING_EMU

    remote_file host delete $target
    return [run_host_cmd_yesno "$ld" "$HOSTING_EMU -o $target -r $objects"]
}

# Check to see if ld is being invoked with a non-endian output format
#
proc is_endian_output_format { object_flags } {

    if {[string match "*-oformat binary*" $object_flags] ||      \
        [string match "*-oformat ieee*" $object_flags] ||        \
	[string match "*-oformat ihex*" $object_flags] ||        \
	[string match "*-oformat netbsd-core*" $object_flags] || \
	[string match "*-oformat srec*" $object_flags] ||        \
	[string match "*-oformat tekhex*" $object_flags] ||      \
	[string match "*-oformat trad-core*" $object_flags] } then {
        return 0
    } else {
	return 1
    }
}

# 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 {
	    case $x in {
		{*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
}

# Link a program using ld.
#
proc default_ld_link { ld target objects } {
    global HOSTING_EMU
    global HOSTING_CRT0
    global HOSTING_LIBS
    global LIBS
    global host_triplet
    global link_output
    global exec_output

    set objs "$HOSTING_CRT0 $objects"
    set libs "$LIBS $HOSTING_LIBS"

    if [is_endian_output_format $objects] then {
	set flags [big_or_little_endian]
    } else {
	set flags ""
    }

    remote_file host delete $target

    return [run_host_cmd_yesno "$ld" "$HOSTING_EMU $flags -o $target $objs $libs"]
}

# Link a program using ld, without including any libraries.
#
proc default_ld_simple_link { ld target objects } {
    global host_triplet
    global gcc_ld_flag
    global exec_output

    if [is_endian_output_format $objects] then {
	set flags [big_or_little_endian]
    } else {
	set flags ""
    }

    # If we are compiling with gcc, we want to add gcc_ld_flag to
    # flags.  Rather than determine this in some complex way, we guess
    # based on the name of the compiler.
    set ldexe $ld
    set ldparm [string first " " $ld]
    if { $ldparm > 0 } then {
	set ldexe [string range $ld 0 $ldparm]
    }
    set ldexe [string replace $ldexe 0 [string last "/" $ldexe] ""]
    if {[string match "*gcc*" $ldexe] || [string match "*++*" $ldexe]} then {
	set flags "$gcc_ld_flag $flags"
    }

    remote_file host delete $target

    set exec_output [run_host_cmd "$ld" "$flags -o $target $objects"]
    set exec_output [prune_warnings $exec_output]

    # We don't care if we get a warning about a non-existent start
    # symbol, since the default linker script might use ENTRY.
    regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output

    if [string match "" $exec_output] then {
	return 1
    } else {
	return 0
    }
}

# Compile an object using cc.
#
proc default_ld_compile { cc source object } {
    global CFLAGS
    global CXXFLAGS
    global srcdir
    global subdir
    global host_triplet
    global gcc_gas_flag

    set cc_prog $cc
    if {[llength $cc_prog] > 1} then {
	set cc_prog [lindex $cc_prog 0]
    }
    if {![is_remote host] && [which $cc_prog] == 0} then {
	perror "$cc_prog does not exist"
	return 0
    }

    remote_file build delete "$object"
    remote_file host delete "$object"

    set flags "-I$srcdir/$subdir"

    # If we are compiling with gcc, we want to add gcc_gas_flag to
    # flags.  Rather than determine this in some complex way, we guess
    # based on the name of the compiler.
    set ccexe $cc
    set ccparm [string first " " $cc]
    set ccflags ""
    if { $ccparm > 0 } then {
	set ccflags [string range $cc $ccparm end]
	set ccexe [string range $cc 0 $ccparm]
	set cc $ccexe
    }
    set ccexe [string replace $ccexe 0 [string last "/" $ccexe] ""]
    if {[string match "*gcc*" $ccexe] || [string match "*++*" $ccexe]} then {
	set flags "$gcc_gas_flag $flags"
    }

    if {[string match "*++*" $ccexe]} {
	set flags "$flags $CXXFLAGS"
    } else {
	set flags "$flags $CFLAGS"
    }

    if [board_info [target_info name] exists multilib_flags] {
	append flags " [board_info [target_info name] multilib_flags]"
    }

    verbose -log "$cc $flags $ccflags -c $source -o $object"

    set status [remote_exec host [concat sh -c [list "$cc $flags $ccflags -c $source -o $object 2>&1"]] "" "/dev/null" "ld.tmp"]
    remote_upload host "ld.tmp"
    set exec_output [file_contents "ld.tmp"]
    remote_file build delete "ld.tmp"
    remote_file host delete "ld.tmp"
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
	if {![file exists $object]} then {
	    regexp ".*/(\[^/\]*)$" $source all dobj
	    regsub "\\.c" $dobj ".o" realobj
	    verbose "looking for $realobj"
	    if {[remote_file host exists $realobj]} then {
		verbose -log "mv $realobj $object"
		remote_upload "$realobj" "$object"
	    } else {
		perror "$object not found after compilation"
		return 0
	    }
	}
	return 1
    } else {
	verbose -log "$exec_output"
	perror "$source: compilation failed"
	return 0
    }
}

# Assemble a file.
#
proc default_ld_assemble { as source object } {
    global ASFLAGS
    global host_triplet

    if ![info exists ASFLAGS] { set ASFLAGS "" }

    set flags [big_or_little_endian]
    set exec_output [run_host_cmd "$as" "$flags $ASFLAGS -o $object $source"]
    set exec_output [prune_warnings $exec_output]
    if [string match "" $exec_output] then {
	return 1
    } else {
	perror "$source: assembly failed"
	return 0
    }
}

# Run nm on a file, putting the result in the array nm_output.
#
proc default_ld_nm { nm nmflags object } {
    global NMFLAGS
    global nm_output
    global host_triplet

    if {[info exists nm_output]} {
      unset nm_output
    }

    if ![info exists NMFLAGS] { set NMFLAGS "" }

    # Ensure consistent sorting of symbols
    if {[info exists env(LC_ALL)]} {
	set old_lc_all $env(LC_ALL)
    }
    set env(LC_ALL) "C"

    verbose -log "$nm $NMFLAGS $nmflags $object >tmpdir/nm.out"

    set status [remote_exec host [concat sh -c [list "$nm $NMFLAGS $nmflags $object 2>ld.stderr"]] "" "/dev/null" "tmpdir/nm.out"]
    if {[info exists old_lc_all]} {
	set env(LC_ALL) $old_lc_all
    } else {
	unset env(LC_ALL)
    }
    remote_upload host "ld.stderr"
    remote_upload host "tmpdir/nm.out" "tmpdir/nm.out"
    set exec_output [prune_warnings [file_contents "ld.stderr"]]
    remote_file host delete "ld.stderr"
    remote_file build delete "ld.stderr"
    if [string match "" $exec_output] then {
	set file [open tmpdir/nm.out r]
	while { [gets $file line] != -1 } {
	    verbose "$line" 2
	    if [regexp "^(\[0-9a-fA-F\]+) \[a-zA-Z0-9\] \\.*(.+)$" $line whole value name] {
                set name [string trimleft $name "_"]
		verbose "Setting nm_output($name) to 0x$value" 2
		set nm_output($name) 0x$value
	    }
	}
	close $file
	return 1
    } else {
	verbose -log "$exec_output"
	perror "$object: nm failed"
	return 0
    }
}

# True if the object format is known to be ELF.
#
proc is_elf_format {} {
    if { ![istarget *-*-sysv4*] \
	 && ![istarget *-*-unixware*] \
	 && ![istarget *-*-elf*] \
	 && ![istarget *-*-eabi*] \
	 && ![istarget hppa*64*-*-hpux*] \
	 && ![istarget *-*-linux*] \
	 && ![istarget frv-*-uclinux*] \
	 && ![istarget bfin-*-uclinux] \
	 && ![istarget *-*-irix5*] \
	 && ![istarget *-*-irix6*] \
	 && ![istarget *-*-netbsd*] \
	 && ![istarget *-*-solaris2*] } {
	return 0
    }

    if { [istarget *-*-linux*aout*] \
	 || [istarget *-*-linux*oldld*] } {
	return 0
    }

    if { ![istarget *-*-netbsdelf*] \
	 && ([istarget *-*-netbsd*aout*] \
	     || [istarget *-*-netbsdpe*] \
	     || [istarget arm*-*-netbsd*] \
	     || [istarget sparc-*-netbsd*] \
	     || [istarget i*86-*-netbsd*] \
	     || [istarget m68*-*-netbsd*] \
	     || [istarget vax-*-netbsd*] \
	     || [istarget ns32k-*-netbsd*]) } {
    	return 0
    }
    return 1
}

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

    set readelf_size ""
    catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got

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

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

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

    return 0
}

# True if the object format is known to be a.out.
#
proc is_aout_format {} {
    if { [istarget *-*-*\[ab\]out*] \
	     || [istarget *-*-linux*oldld*] \
	     || [istarget *-*-msdos*] \
	     || [istarget arm-*-netbsd] \
	     || [istarget i?86-*-netbsd] \
	     || [istarget i?86-*-mach*] \
	     || [istarget i?86-*-vsta] \
	     || [istarget pdp11-*-*] \
	     || [istarget m68*-ericsson-ose] \
	     || [istarget m68k-hp-bsd*] \
	     || [istarget m68*-*-hpux*] \
	     || [istarget m68*-*-netbsd] \
	     || [istarget m68*-*-netbsd*4k*] \
	     || [istarget m68k-sony-*] \
	     || [istarget m68*-sun-sunos\[34\]*] \
	     || [istarget m68*-wrs-vxworks*] \
	     || [istarget ns32k-*-*] \
	     || [istarget sparc*-*-netbsd] \
	     || [istarget sparc-sun-sunos4*] \
	     || [istarget vax-dec-ultrix*] \
	     || [istarget vax-*-netbsd] } {
	return 1
    }
    return 0
}

# True if the object format is known to be PE COFF.
#
proc is_pecoff_format {} {
    if { ![istarget *-*-mingw*] \
	 && ![istarget *-*-cygwin*] \
	 && ![istarget *-*-cegcc*] \
	 && ![istarget *-*-pe*] } {
	return 0
    }

    return 1
}

# Compares two files line-by-line.
#   Returns differences if exist.
#   Returns null if file(s) cannot be opened.
#
proc simple_diff { file_1 file_2 } {
    global target

    set eof -1
    set differences 0

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

    if [file exists $file_2] then {
	set file_b [open $file_2 r]
    } else {
	fail "$file_2 doesn't exist"
	return
    }

    verbose "# Diff'ing: $file_1 $file_2\n" 2

    while { [gets $file_a line] != $eof } {
	if [regexp "^#.*$" $line] then {
	    continue
	} else {
	    lappend list_a $line
	}
    }
    close $file_a

    while { [gets $file_b line] != $eof } {
	if [regexp "^#.*$" $line] then {
	    continue
	} else {
	    lappend list_b $line
	}
    }
    close $file_b

    for { set i 0 } { $i < [llength $list_a] } { incr i } {
	set line_a [lindex $list_a $i]
	set line_b [lindex $list_b $i]

	verbose "\t$file_1: $i: $line_a\n" 3
	verbose "\t$file_2: $i: $line_b\n" 3
	if [string compare $line_a $line_b] then {
	    verbose -log "\t$file_1: $i: $line_a\n"
	    verbose -log "\t$file_2: $i: $line_b\n"

	    fail "Test: $target"
	    return
	}
    }

    if { [llength $list_a] != [llength $list_b] } {
	fail "Test: $target"
	return
    }

    if $differences<1 then {
	pass "Test: $target"
    }
}

# run_dump_test FILE
# Copied from gas testsuite, tweaked and further extended.
#
# Assemble a .s file, then run some utility on it and check the output.
#
# There should be an assembly language file named FILE.s in the test
# suite directory, and a pattern file called FILE.d.  `run_dump_test'
# will assemble FILE.s, run some tool like `objdump', `objcopy', or
# `nm' on the .o file to produce textual output, and then analyze that
# with regexps.  The FILE.d file specifies what program to run, and
# what to expect in its output.
#
# The FILE.d file begins with zero or more option lines, which specify
# flags to pass to the assembler, the program to run to dump the
# assembler's output, and the options it wants.  The option lines have
# the syntax:
#
#         # OPTION: VALUE
#
# OPTION is the name of some option, like "name" or "objdump", and
# VALUE is OPTION's value.  The valid options are described below.
# Whitespace is ignored everywhere, except within VALUE.  The option
# list ends with the first line that doesn't match the above syntax
# (hmm, not great for error detection).
#
# 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.
#
#   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 after all input files.
#
#   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 (which
#	may in turn *also* be objcopy).
#
#   PROG: PROGRAM-NAME
#       The name of the program to run to analyze the .o file produced
#       by the assembler or the linker output.  This can be omitted;
#       run_dump_test will guess which program to run by seeing which of
#       the flags options below is present.
#
#   objdump: FLAGS
#   nm: FLAGS
#   objcopy: FLAGS
#	Use the specified program to analyze the assembler or linker
#       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.
#
#   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.
#
#   xfail: TARGET
#       The test is expected to fail on TARGET.  This may occur more than
#       once.
#
#   target: TARGET
#       Only run the test for TARGET.  This may occur more than once; the
#       target being tested must match at least one.  You may provide target
#       name "cfi" for any target supporting the CFI statements.
#
#   notarget: TARGET
#       Do not run the test for TARGET.  This may occur more than once;
#       the target being tested must not match any of them.
#
#   error: REGEX
#	An error with message matching REGEX must be emitted for the test
#	to pass.  The PROG, objdump, nm and objcopy options have no
#	meaning and need not supplied if this is present.
#
#   warning: REGEX
#	Expect a linker warning matching REGEX.  It is an error to issue
#	both "error" and "warning".
#
# 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.  `regexp_diff' is defined later in this file; see
# further comments there.
#
proc run_dump_test { name } {
    global subdir srcdir
    global OBJDUMP NM AS OBJCOPY READELF LD
    global OBJDUMPFLAGS NMFLAGS ASFLAGS OBJCOPYFLAGS READELFFLAGS LDFLAGS
    global host_triplet runtests
    global env verbose

    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 opts(as) {}
    set opts(ld) {}
    set opts(ld_after_inputfiles) {}
    set opts(xfail) {}
    set opts(target) {}
    set opts(notarget) {}
    set opts(objdump) {}
    set opts(nm) {}
    set opts(objcopy) {}
    set opts(readelf) {}
    set opts(name) {}
    set opts(PROG) {}
    set opts(source) {}
    set opts(error) {}
    set opts(warning) {}
    set opts(objcopy_linked_file) {}
    set asflags(${file}.s) {}

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

	switch -- $opt_name {
	    xfail {}
	    target {}
	    notarget {}
	    source {
		# Move any source-specific as-flags to a separate array to
		# simplify processing.
		if { [llength $opt_val] > 1 } {
		    set asflags([lindex $opt_val 0]) [lrange $opt_val 1 end]
		    set opt_val [lindex $opt_val 0]
		} else {
		    set asflags($opt_val) {}
		}
	    }
	    default {
		if [string length $opts($opt_name)] {
		    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
		}
	    }
	}
	if { $opt_name == "as" || $opt_name == "ld" } {
	    set opt_val [subst $opt_val]
	}
	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)
    }

    # Decide early whether we should run the test for this target.
    if { [llength $opts(target)] > 0 } {
	set targmatch 0
	foreach targ $opts(target) {
	    if [istarget $targ] {
		set targmatch 1
		break
	    }
	}
	if { $targmatch == 0 } {
	    return
	}
    }
    foreach targ $opts(notarget) {
	if [istarget $targ] {
	    return
	}
    }

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

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

    if { $opts(source) == "" } {
	set sourcefiles [list ${file}.s]
    } else {
	set sourcefiles {}
	foreach sf $opts(source) {
	    if { [string match "/*" $sf] } {
		lappend sourcefiles "$sf"
	    } else {
		lappend sourcefiles "$srcdir/$subdir/$sf"
	    }
	    # Must have asflags indexed on source name.
	    set asflags($srcdir/$subdir/$sf) $asflags($sf)
	}
    }

    # Time to setup xfailures.
    foreach targ $opts(xfail) {
	setup_xfail $targ
    }

    # Assemble each file.
    set objfiles {}
    for { set i 0 } { $i < [llength $sourcefiles] } { incr i } {
	set sourcefile [lindex $sourcefiles $i]

	set objfile "tmpdir/dump$i.o"
	catch "exec rm -f $objfile" exec_output
	lappend objfiles $objfile
	set cmd "$AS $ASFLAGS $opts(as) $asflags($sourcefile) -o $objfile $sourcefile"

	send_log "$cmd\n"
	set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
	remote_upload host "ld.tmp"
	set comp_output [prune_warnings [file_contents "ld.tmp"]]
	remote_file host delete "ld.tmp"
	remote_file build delete "ld.tmp"

	if { [lindex $cmdret 0] != 0 || ![string match "" $comp_output] } then {
	    send_log "$comp_output\n"
	    verbose "$comp_output" 3

	    set exitstat "succeeded"
	    if { $cmdret != 0 } { set exitstat "failed" }
	    verbose -log "$exitstat with: <$comp_output>"
	    fail $testname
	    return
	}
    }

    set expmsg $opts(error)
    if { $opts(warning) != "" } {
	if { $expmsg != "" } {
	    perror "$testname: mixing error and warning test-directives"
	    return
	}
	set expmsg $opts(warning)
    }

    # Perhaps link the file(s).
    if { $run_ld } {
	set objfile "tmpdir/dump"
	catch "exec rm -f $objfile" exec_output

	# Add -L$srcdir/$subdir so that the linker command can use
	# linker scripts in the source directory.
	set cmd "$LD $LDFLAGS -L$srcdir/$subdir \
		   $opts(ld) -o $objfile $objfiles $opts(ld_after_inputfiles)"

	send_log "$cmd\n"
	set cmdret [remote_exec host [concat sh -c [list "$cmd 2>&1"]] "" "/dev/null" "ld.tmp"]
	remote_upload host "ld.tmp"
	set comp_output [file_contents "ld.tmp"]
	remote_file host delete "ld.tmp"
	remote_file build delete "ld.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" "ld.tmp"]
	    remote_upload host "ld.tmp"
	    append comp_output [file_contents "ld.tmp"]
	    remote_file host delete "ld.tmp"
	    remote_file build delete "ld.tmp"
	    set cmdret [lindex $cmdret 0]
	}

	regsub "\n$" $comp_output "" comp_output
	if { $cmdret != 0 || $comp_output != "" || $expmsg != "" } then {
	    set exitstat "succeeded"
	    if { $cmdret != 0 } { set exitstat "failed" }
	    verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"
	    send_log "$comp_output\n"
	    verbose "$comp_output" 3

	    if { [regexp $expmsg $comp_output] \
		    && (($cmdret == 0) == ($opts(warning) != "")) } {
		# We have the expected output from ld.
		if { $opts(error) != "" || $program == "" } {
		    pass $testname
		    return
		}
	    } else {
		verbose -log "$exitstat with: <$comp_output>, expected: <$expmsg>"
		fail $testname
		return
	    }
	}
    } else {
	set objfile "tmpdir/dump0.o"
    }

    # We must not have expected failure if we get here.
    if { $opts(error) != "" } {
	fail $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
    }

    if { $progopts1 == "" } { set $progopts1 "-r" }
    verbose "running $binary $progopts $progopts1" 3

    # Objcopy, unlike the other two, won't send its output to stdout,
    # so we have to run it specially.
    set cmd "$binary $progopts $progopts1 $objfile > $dumpfile"
    if { $program == "objcopy" } {
	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>ld.tmp"]] "" "/dev/null"]
    remote_upload host "ld.tmp"
    set comp_output [prune_warnings [file_contents "ld.tmp"]]
    remote_file host delete "ld.tmp"
    remote_file build delete "ld.tmp"
    if {[info exists old_lc_all]} {
	set env(LC_ALL) $old_lc_all
    } else {
	unset env(LC_ALL)
    }
    if ![string match "" $comp_output] then {
	send_log "$comp_output\n"
	fail $testname
	return
    }

    if { $verbose > 2 } then { verbose "output is [file_contents $dumpfile]" 3 }
    if { [regexp_diff $dumpfile "${file}.d"] } then {
	fail $testname
	if { $verbose == 2 } then { verbose "output is [file_contents $dumpfile]" 2 }
	return
    }

    pass $testname
}

proc slurp_options { file } {
    if [catch { set f [open $file r] } x] {
	#perror "couldn't open `$file': $x"
	perror "$x"
	return -1
    }
    set opt_array {}
    # whitespace expression
    set ws  {[ 	]*}
    set nws {[^ 	]*}
    # whitespace is ignored anywhere except within the options list;
    # option names are alphabetic plus underscore only.
    set pat "^#${ws}(\[a-zA-Z_\]*)$ws:${ws}(.*)$ws\$"
    while { [gets $f line] != -1 } {
	set line [string trim $line]
	# Whitespace here is space-tab.
	if [regexp $pat $line xxx opt_name opt_val] {
	    # match!
	    lappend opt_array [list $opt_name $opt_val]
	} else {
	    break
	}
    }
    close $f
    return $opt_array
}

# regexp_diff, copied from gas, based on simple_diff above.
#	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
		    set diff_pass 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
}

# Create an archive using ar
#
proc ar_simple_create { ar aropts target objects } {
    remote_file host delete $target

    set exec_output [run_host_cmd "$ar" "$aropts rc $target $objects"]
    set exec_output [prune_warnings $exec_output]

    if [string match "" $exec_output] then {
	send_log "$exec_output\n"
	return 1
    } else {
	return 0
    }
}

# List contains test-items with 3 items followed by 2 lists, one item and
# one optional item:
# 0:name 1:ld/ar options 2:assembler options
# 3:filenames of assembler files 4: action and options. 5: name of output file
# 6:compiler flags (optional)
#
# 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 ar
    global objdump
    global READELF
    global srcdir
    global subdir
    global env
    global CC
    global CFLAGS
    global runtests

    foreach testitem $ldtests {
	set testname [lindex $testitem 0]

	if ![runtest_file_p $runtests $testname] then {
	    continue
	}

	set ld_options [lindex $testitem 1]
	set as_options [lindex $testitem 2]
	set src_files  [lindex $testitem 3]
	set actions [lindex $testitem 4]
	set binfile tmpdir/[lindex $testitem 5]
	set cflags [lindex $testitem 6]
	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 "src_files is $src_files"
#	verbose -log "actions is $actions"
#	verbose -log "binfile is $binfile"

	# Assemble each file in the test.
	foreach src_file $src_files {
	    set objfile "tmpdir/[file rootname $src_file].o"
	    lappend objfiles $objfile

	    if { [file extension $src_file] == ".c" } {
		set as_file "tmpdir/[file rootname $src_file].s"
		if ![ld_compile "$CC -S $CFLAGS $cflags" $srcdir/$subdir/$src_file $as_file] {
		    set is_unresolved 1
		    break
		}
	    } else {
		set as_file "$srcdir/$subdir/$src_file"
	    }
	    if ![ld_assemble $as "$as_options $as_file" $objfile] {
		set is_unresolved 1
		break
	    }
	}

	# Catch assembler errors.
	if { $is_unresolved != 0 } {
	    unresolved $testname
	    continue
	}

	if { [regexp ".*a$" $binfile] } {
	    if { ![ar_simple_create $ar $ld_options $binfile "$objfiles"] } {
		fail $testname
		set failed 1
	    } else {
		set failed 0
	    }
	} elseif { ![ld_simple_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] } {
	    fail $testname
	    set failed 1
	} else {
	    set failed 0
	}

	if { $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"
    		    set status [remote_exec host [concat sh -c [list "$cmd >dump.out 2>ld.stderr"]] "" "/dev/null"]
		    send_log "$cmd\n"
    		    remote_upload host "ld.stderr"
    		    set comp_output [prune_warnings [file_contents "ld.stderr"]]
    		    remote_file host delete "ld.stderr"
    		    remote_file build delete "ld.stderr"
                    
		    if {[info exists old_lc_all]} {
			set env(LC_ALL) $old_lc_all
		    } else {
			unset env(LC_ALL)
		    }

		    if ![string match "" $comp_output] then {
			send_log "$comp_output\n"
			set failed 1
			break
		    }

		    remote_upload host "dump.out"

		    if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then {
			verbose "output is [file_contents "dump.out"]" 2
			set failed 1
		   	remote_file build delete "dump.out"
		   	remote_file host delete "dump.out"
			break
		    }
		    remote_file build delete "dump.out"
		    remote_file host delete "dump.out"
		}
	    }

	    if { $failed != 0 } {
		fail $testname
	    } else { if { $is_unresolved == 0 } {
		pass $testname
	    } }
	}

	# Catch action errors.
	if { $is_unresolved != 0 } {
	    unresolved $testname
	    continue
	}
    }
}

# This definition is taken from an unreleased version of DejaGnu.  Once
# that version gets released, and has been out in the world for a few
# months at least, it may be safe to delete this copy.
if ![string length [info proc prune_warnings]] {
    #
    # prune_warnings -- delete various system verbosities from TEXT
    #
    # An example is:
    # ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9
    #
    # Sites with particular verbose os's may wish to override this in site.exp.
    #
    proc prune_warnings { text } {
	# This is from sun4's.  Do it for all machines for now.
	# The "\\1" is to try to preserve a "\n" but only if necessary.
	regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text

	# It might be tempting to get carried away and delete blank lines, etc.
	# Just delete *exactly* what we're ask to, and that's it.
	return $text
    }
}

# targets_to_xfail is a list of target triplets to be xfailed.
# ldtests contains test-items with 3 items followed by 1 lists, 2 items
# and 3 optional items:
#   0:name
#   1:ld options
#   2:assembler options
#   3:filenames of source files
#   4:name of output file
#   5:expected output
#   6:compiler flags (optional)
#   7:language (optional)
#   8:linker warning (optional)

proc run_ld_link_exec_tests { targets_to_xfail ldtests } {
    global ld
    global as
    global srcdir
    global subdir
    global env
    global CC
    global CXX
    global CFLAGS
    global CXXFLAGS
    global errcnt
    global exec_output

    foreach testitem $ldtests {
	foreach target $targets_to_xfail {
	    setup_xfail $target
	}
	set testname [lindex $testitem 0]
	set ld_options [lindex $testitem 1]
	set as_options [lindex $testitem 2]
	set src_files  [lindex $testitem 3]
	set binfile tmpdir/[lindex $testitem 4]
	set expfile [lindex $testitem 5]
	set cflags [lindex $testitem 6]
	set lang [lindex $testitem 7]
	set warning [lindex $testitem 8]
	set objfiles {}
	set failed 0

#	verbose -log "Testname is $testname"
#	verbose -log "ld_options is $ld_options"
#	verbose -log "as_options is $as_options"
#	verbose -log "src_files is $src_files"
#	verbose -log "actions is $actions"
#	verbose -log "binfile is $binfile"

	# Assemble each file in the test.
	foreach src_file $src_files {
	    set objfile "tmpdir/[file rootname $src_file].o"
	    lappend objfiles $objfile

	    # We ignore warnings since some compilers may generate
	    # incorrect section attributes and the assembler will warn
	    # them.
	    if { [ string match "c++" $lang ] } {
		ld_compile "$CXX -c $CXXFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
	    } else {
		ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
	    }

	    # We have to use $CC to build PIE and shared library.
	    if { [ string match "c" $lang ] } {
		set link_proc ld_simple_link
		set link_cmd $CC
	    } elseif { [ string match "c++" $lang ] } {
		set link_proc ld_simple_link
		set link_cmd $CXX
	    } elseif { [ string match "-shared" $ld_options ] \
		 || [ string match "-pie" $ld_options ] } {
		set link_proc ld_simple_link
		set link_cmd $CC
	    } else {
		set link_proc ld_link
		set link_cmd $ld
	    }

	    if ![$link_proc $link_cmd $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
		set failed 1
	    } else {
		set failed 0
	    }

	    # Check if exec_output is expected.
	    if { $warning != "" } then {
		verbose -log "returned with: <$exec_output>, expected: <$warning>"
		if { [regexp $warning $exec_output] } then {
		    set failed 0
		} else {
		    set failed 1
		}
	    }

	    if { $failed == 0 } {
		send_log "Running: $binfile > $binfile.out\n"
		verbose "Running: $binfile > $binfile.out"
		catch "exec $binfile > $binfile.out" exec_output
	    
		if ![string match "" $exec_output] then {
		    send_log "$exec_output\n"
		    verbose "$exec_output" 1
		    set failed 1
		} else {
		    send_log "diff $binfile.out $srcdir/$subdir/$expfile\n"
		    verbose "diff $binfile.out $srcdir/$subdir/$expfile"
		    catch "exec diff $binfile.out $srcdir/$subdir/$expfile" exec_output
		    set exec_output [prune_warnings $exec_output]

		    if ![string match "" $exec_output] then {
			send_log "$exec_output\n"
			verbose "$exec_output" 1
			set failed 1
		    }
		}
	    }

	    if { $failed != 0 } {
		fail $testname
	    } else {
		set errcnt 0
		pass $testname
	    }
	}
    }
}

# List contains test-items with 3 items followed by 2 lists, one item and
# one optional item:
#  0:name
#  1:ld or ar options
#  2:compile options
#  3:filenames of source files
#  4:action and options.
#  5:name of output file
#  6:language (optional)
#
# 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_cc_link_tests { ldtests } {
    global nm
    global objdump
    global READELF
    global srcdir
    global subdir
    global env
    global CC
    global CXX
    global CFLAGS
    global CXXFLAGS
    global ar

    foreach testitem $ldtests {
	set testname [lindex $testitem 0]
	set ldflags [lindex $testitem 1]
	set cflags [lindex $testitem 2]
	set src_files  [lindex $testitem 3]
	set actions [lindex $testitem 4]
	set binfile tmpdir/[lindex $testitem 5]
	set lang [lindex $testitem 6]
	set objfiles {}
	set is_unresolved 0
	set failed 0

	# Compile each file in the test.
	foreach src_file $src_files {
	    set objfile "tmpdir/[file rootname $src_file].o"
	    lappend objfiles $objfile

	    # We ignore warnings since some compilers may generate
	    # incorrect section attributes and the assembler will warn
	    # them.
	    if { [ string match "c++" $lang ] } {
		ld_compile "$CXX -c $CXXFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
	    } else {
		ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
	    }
	}

	# Clear error and warning counts.
	reset_vars

	if { [ string match "c++" $lang ] } {
	    set cc_cmd $CXX
	} else {
	    set cc_cmd $CC
	}

	if { [regexp ".*a$" $binfile] } {
	    if { ![ar_simple_create $ar $ldflags $binfile "$objfiles"] } {
		fail $testname
		set failed 1
	    } else {
		set failed 0
	    }
	} elseif { ![ld_simple_link $cc_cmd $binfile "-L$srcdir/$subdir $ldflags $objfiles"] } {
	    fail $testname
	    set failed 1
	} else {
	    set failed 0
	}

	if { $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
	}
    }
}

# Returns true if --gc-sections is supported on the target.

proc check_gc_sections_available { } {
    global gc_sections_available_saved
    global ld
    
    if {![info exists gc_sections_available_saved]} {
	# Some targets don't support gc-sections despite whatever's
	# advertised by ld's options.
	if { [istarget alpha*-*-*]
	     || [istarget mep-*-*]
	     || [istarget ia64-*-*]
	     || [istarget *-*-cygwin]
	     || [istarget *-*-mingw*] } {
	    set gc_sections_available_saved 0
	    return 0
	}

	# elf2flt uses -q (--emit-relocs), which is incompatible with
	# --gc-sections.
	if { [board_info target exists ldflags]
	     && [regexp " -elf2flt\[ =\]" " [board_info target ldflags] "] } {
	    set gc_sections_available_saved 0
	    return 0
	}

	# Check if the ld used by gcc supports --gc-sections.
	set ld_output [remote_exec host $ld "--help"]
	if { [ string first "--gc-sections" $ld_output ] >= 0 } {
	    set gc_sections_available_saved 1
	} else {
	    set gc_sections_available_saved 0
	}
    }
    return $gc_sections_available_saved
}

# Check if the assembler supports CFI statements.

proc check_as_cfi { } {
    global check_as_cfi_result
    global as
    if [info exists check_as_cfi_result] {
	return $check_as_cfi_result
    }
    set as_file "tmpdir/check_as_cfi.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 CFI support:"
    rename "perror" "check_as_cfi_perror"
    proc perror { args } { }
    set success [ld_assemble $as $as_file "/dev/null"]
    rename "perror" ""
    rename "check_as_cfi_perror" "perror"
    #remote_file host delete $as_file
    set check_as_cfi_result $success
    return $success
}

# Provide virtual target "cfi" for targets supporting CFI.

rename "istarget" "istarget_ld"
proc istarget { target } {
    if {$target == "cfi"} {
	return [check_as_cfi]
    }
    return [istarget_ld $target]
}
