# Expect script for LD Bootstrap Tests
#   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004,
#   2005, 2006, 2007, 2009, 2010  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 tests will fail.
    if { $flags == "--static" && $plugins == "yes" } then {
	untested $testname
	continue
    }

    # If we only have a shared libbfd, we probably can't run the
    # --static test.
    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 $extralibs"] {
		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 $extralibs"] {
		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
