# Expect script for LD Bootstrap Tests
#   Copyright (C) 1993-2016 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.
set test_flags {"" "strip" "--static" "--traditional-format"
		"--no-keep-memory" "--relax"}
if { [istarget "powerpc-*-*"] } {
    lappend test_flags "--ppc476-workaround"
}

foreach flags $test_flags {
    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 ""
    }

    if { $partial_flags == "--ppc476-workaround" } {
	append partial_flags " -T $srcdir/$subdir/ppc476.t"
    }

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

    # Check if the system's zlib library is used.
    if {[file exists ../zlib/Makefile ]} then {
	set extralibs "$extralibs -L../zlib -lz"
    } else {
	set extralibs "$extralibs -lz"
    }

    # Plugin support requires linking with libdl.
    if { $plugins == "yes" } {
	if { ![istarget "*-*-freebsd*"]} {
	    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
