# Expect script for LD Bootstrap Tests
#   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004,
#   2006, 2007  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
}

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

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

    # 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
