# Expect script for LD Bootstrap Tests
#   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004,
#   2005, 2006, 2007, 2009  Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# This program 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.
#
# Written by Jeffrey Wheat (cassidy@cygnus.com)
# Rewritten by Ian Lance Taylor (ian@cygnus.com)
#

# Make sure that ld can bootstrap itself.

# This test can only be run if ld generates native executables.
if ![isnative] {
    return
}

# Determine if plugin support is present.
remote_exec host "$nm --help" "" "/dev/null" "plugin-support"
set tmp [file_contents "plugin-support"]
regexp ".*\(--plugin\).*\n" $tmp foo plugins
if [info exists plugins] then {
    set plugins "yes"
} else {
    set plugins "no"
}

# LD can have plugin support even if BFD does not.
if [check_plugin_api_available] {
    set plugins "yes"
}

# Bootstrap ld.  First link the object files together using -r, in
# order to test -r.  Then link the result into an executable, ld1, to
# really test -r.  Use ld1 to link a fresh ld, ld2.  Use ld2 to link a
# new ld, ld3.  ld2 and ld3 should be identical.

foreach flags {"" "strip" "--static" "--traditional-format"
	       "--no-keep-memory" "--relax"} {
    set do_strip "no"
    if {"$flags" == "strip"} { 
	set testname "bootstrap with $flags"
        set flags ""
	set do_strip "yes"
    } else { if {"$flags" != ""} { 
	set testname "bootstrap with $flags"
    } else {
	set testname "bootstrap"
    }}

    # --static is meaningless and --relax is incompatible with -r.
    set partial_flags "$flags"
    if { "$flags" == "--static" || "$flags" == "--relax" } {
	set partial_flags ""
    }

    # This test can only be run if we have the ld build directory,
    # since we need the object files.
    if {$ld != "$objdir/ld-new"} {
	untested $testname
	continue
    }

    # Plugin support requires linking with a dynamic library which
    # means that these
    if { $flags == "--static" && $plugins == "yes" } then {
	untested $testname
	continue
    }

    # If we only have a shared libbfd, we probably can't run the
    # --static test.will fail.
    if { $flags == "--static" && ! [string match "*libbfd.a*" $BFDLIB] } then {
	untested $testname
	continue
    }

    if ![ld_relocate $ld tmpdir/ld-partial.o "$partial_flags $OFILES"] {
	fail $testname
	continue
    }

    # On AIX, you need to specify an import list when using --static.
    # You only want the import list when creating the final
    # executable.
    if { [istarget "*-*-aix*"] 
         && ![istarget "ia64-*-aix*"]} {
	if {"$flags" == "--static"} {
	    set flags "--static -bI:/lib/syscalls.exp"
	}
    }

    # On Cygwin, -lintl may require -liconv when linking statically.
    set extralibs ""
    if { [istarget "*-*-cygwin*"]} {
	if {"$flags" == "--static"} {
	    set extralibs "-liconv"
	}
    }

    # Plugin support requires linking with libdl.
    if { $plugins == "yes" } {
	set extralibs "$extralibs -ldl"
    }

    # On Irix 5, linking with --static only works if all the files are
    # compiled using -non_shared.
    if {"$flags" == "--static"} {
	setup_xfail "mips*-*-irix5*"
    }

    if ![ld_link $ld tmpdir/ld1 "$flags tmpdir/ld-partial.o $BFDLIB $LIBIBERTY $extralibs"] {
	fail $testname
	continue
    }

    if {"$do_strip" == "yes"} { 
	verbose -log "$strip tmpdir/ld1"     
	catch "exec $strip tmpdir/ld1" exec_output
	if ![string match "" $exec_output] then {
	    verbose -log "$exec_output"
	    fail $testname
	    continue
	}
    }

    if ![ld_link tmpdir/ld1 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY $extralibs"] {
	fail $testname
	continue
    }

    if ![ld_link tmpdir/ld2 tmpdir/ld3 "$flags $OFILES $BFDLIB $LIBIBERTY $extralibs"] {
	fail $testname
	continue
    }

    if {"$flags" == "--static"} {
	if { [istarget ia64-*-elf*]
	     || [istarget ia64-*-linux*] } {
	    # On ia64, tmpdir/ld2 != tmpdir/ld3 is normal since they are
	    # generated by different linkers, tmpdir/ld1 and tmpdir/ld2.
	    # So we rebuild tmpdir/ld2 with tmpdir/ld3.
	    if ![ld_link tmpdir/ld3 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY"] {
		fail $testname
		continue
	    }
	}
    } else {
	if { [istarget mips*-*-linux*] } {
	    # On Linux/mips, tmpdir/ld2 != tmpdir/ld3 is normal since
	    # they are generated by different linkers, tmpdir/ld1 and
	    # tmpdir/ld2. So we rebuild tmpdir/ld2 with tmpdir/ld3.
	    if ![ld_link tmpdir/ld3 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY"] {
		fail $testname
		continue
	    }
	}
    }

    if {[istarget "*-*-pe"]
	|| [istarget "*-*-wince"]
	|| [istarget "*-*-cygwin*"]
	|| [istarget "*-*-winnt*"]
	|| [istarget "*-*-mingw*"]
	|| [istarget "*-*-interix*"]
	|| [istarget "*-*-beospe*"]
	|| [istarget "*-*-netbsdpe*"]} {
	# Trim off the date present in PE binaries by only looking
	#   at the ends of the files
	# Although this works, a way to set the date would be better.
	# Removing or zeroing the date stamp in the binary produced by
	# the linker is not possible as it is required by the target OS.
	set do_compare [string map {16 220 f1 tmpdir/ld2 f2 tmpdir/ld3 tmp-foo1 tmpdir/ld2tail tmp-foo2 tmpdir/ld3tail} $DO_COMPARE]
	send_log "$do_compare\n"
	verbose  "$do_compare"
	catch "exec sh -c [list $do_compare]" exec_output
    } else {
	send_log "cmp tmpdir/ld2 tmpdir/ld3\n"
	verbose  "cmp tmpdir/ld2 tmpdir/ld3"
	catch "exec cmp tmpdir/ld2 tmpdir/ld3" exec_output
    }
    set exec_output [prune_warnings $exec_output]

    if [string match "" $exec_output] then {
	pass $testname
    } else {
	send_log "$exec_output\n"
	verbose "$exec_output" 1

	fail $testname
    }
}

catch "exec rm -f tmpdir/ld-partial.o tmpdir/ld1 tmpdir/ld2 tmpdir/ld3" status
catch "exec rm -f tmpdir/ld2tail tmpdir/ld3tail" status
