# Expect script for LD Bootstrap Tests
#   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001
#   Free Software Foundation, Inc.
#
# 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 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"] {
	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"] {
	fail $testname
	continue
    }

    if ![ld_link tmpdir/ld2 tmpdir/ld3 "$flags $OFILES $BFDLIB $LIBIBERTY"] {
	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
	    }
	}
    }

    send_log "compare (tail of) tmpdir/ld2 tmpdir/ld3\n"
    verbose  "compare (tail of) tmpdir/ld2 tmpdir/ld3"
    if {[istarget "*-*-pe"]
	|| [istarget "*-*-wince"]
	|| [istarget "*-*-cygwin*"]
	|| [istarget "*-*-winnt*"]
	|| [istarget "*-*-mingw32*"]
	|| [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.
        exec tail +140 tmpdir/ld2 >tmpdir/ld2tail
        exec tail +140 tmpdir/ld3 >tmpdir/ld3tail
        catch "exec cmp tmpdir/ld2tail tmpdir/ld3tail" exec_output
        exec rm tmpdir/ld2tail tmpdir/ld3tail
    } 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
    }
}
