# Expect script for various ELF tests.
#   Copyright 2002, 2003, 2005, 2007, 2009, 2010, 2011, 2012
#   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.
#

# Exclude non-ELF targets.

if ![is_elf_format] {
    return
}

set old_ldflags $LDFLAGS
if { [istarget spu*-*-*] } {
    set LDFLAGS "$LDFLAGS --local-store 0:0"
}
if { [istarget alpha*-*-* ] } {
    # The compress1 test is written expecting 32-bit addresses; force the
    # executable down into the low address space to match.
    # ??? How can we adjust just the one testcase?
    set LDFLAGS "$LDFLAGS -Ttext-segment 0x1000000"
}

if { [istarget "*-*-nacl*"] } {
    # The eh[1-4] cases are written to expect ELFCLASS64 layout on x86-64.
    # But the target default is ELFCLASS32.  So the cases explicitly use
    # -melf_x86_64 to select that, but NaCl needs a different emulation name.
    set options_regsub(ld) {-melf_x86_64 -melf_x86_64_nacl}
}

if { [istarget "*-*-solaris*"] } {
    # Same for Solaris
    set options_regsub(ld) {-melf_x86_64 -melf_x86_64_sol2}
}

if { [is_remote host] } then {
    remote_download host merge.ld
}

if { ![istarget hppa64*-hpux*] } {
    run_ld_link_tests {
	{"Build symbol3.a"
	    "" "" ""
	    {symbol3.s} {} "symbol3.a"}
	{"Build symbol3w.a"
	    "" "" ""
	    {symbol3w.s} {} "symbol3w.a"}
    }

    if { [check_shared_lib_support] } then {
	run_ld_link_tests {
	    {"Build pr14170a.o" "" "" "" "pr14170a.s" {} "pr14170.a" }
	}
	setup_xfail "tic6x-*-*"
	run_ld_link_tests {
	    {"Build shared library for pr14170"
		"-shared" "" "" "pr14170b.s" {} "pr14170.so" }
	    {"PR ld/14170"
		"tmpdir/pr14170a.o tmpdir/pr14170.so" "" "" "pr14170c.s"
		{ } "pr14170" }
	}
    }
}

# Run a test to check linking a shared library with a broken linker
# script that accidentally marks dynamic sections as notes.  The
# resulting executable is not expected to work, but the linker
# should not seg-fault whilst creating the binary.
#
# Only run the test on targets thats support creating shared libraries.
if { [check_shared_lib_support] } then {
    setup_xfail "tic6x-*-*"
    run_ld_link_tests {
	{"Build shared library for next test"
	    "-shared" "" "" "note-3.s" {} "note-3.so" }
	{"Link using broken linker script"
	    "--script note-3.t tmpdir/note-3.so" "" "" ""
	    { { ld "note-3.l" } }
	    "a.out" }
    }
}

set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
foreach t $test_list {
    # We need to strip the ".d", but can leave the dirname.
    verbose [file rootname $t]
    run_dump_test [file rootname $t]
}

if { [istarget *-*-linux*]
     || [istarget *-*-nacl*]
     || [istarget *-*-gnu*] } {
    run_ld_link_tests {
	{"Weak symbols in dynamic objects 1 (support)"
	    "-shared" "" "" {weak-dyn-1a.s}
	    {}
	    "libweakdyn1a.so"}
	{"Weak symbols in dynamic objects 1 (main test)"
	    "-shared tmpdir/libweakdyn1a.so -Tweak-dyn-1.ld" "" "" {weak-dyn-1b.s}
	    {{readelf {--relocs --wide} weak-dyn-1.rd}}
	    "libweakdyn1b.so"}
    }
}

#v850 gas complains about .tbss.var section attributes.
if { [check_gc_sections_available] && ![istarget "v850-*-*"] } {
    run_ld_link_tests {
	{"--gc-sections on tls variable"
	    "--gc-section" "" "" {tls_gc.s} {} "tls_gc"}
    }
}

if { [istarget *-*-*linux*]
     || [istarget *-*-nacl*]
     || [istarget *-*-gnu*] } {
    run_ld_link_tests {
	{"stack exec" "-z execstack" "" "" {stack.s}
	    {{readelf {-Wl} stack-exec.rd}} "stack-exec.exe"}
	{"stack size" "-z stack-size=0x123400" "" "" {stack.s}
	    {{readelf {-Wl} stack-size.rd}} "stack-size.exe"}
    }
}

set LDFLAGS $old_ldflags

# The following tests require running the executable generated by ld.
if ![isnative] {
    return
}

if [check_gc_sections_available] {
    run_cc_link_tests {
	{"PR ld/13195" "-Wl,--gc-sections" ""
	 {pr13195.c} {} "pr13195"}
    }
}

set array_tests {
    {"preinit array" "" "" {preinit.c} "preinit" "preinit.out"}
    {"init array" "" "" {init.c} "init" "init.out"}
    {"fini array" "" "" {fini.c} "fini" "fini.out"}
    {"init array mixed" "" "" {init-mixed.c} "init-mixed" "init-mixed.out" "-I."}
}
set array_tests_pie {
    {"PIE preinit array" "-pie" "" {preinit.c} "preinit" "preinit.out" "-fPIE" }
    {"PIE init array" "-pie" "" {init.c} "init" "init.out" "-fPIE"}
    {"PIE fini array" "-pie" "" {fini.c} "fini" "fini.out" "-fPIE"}
    {"PIE init array mixed" "-pie" "" {init-mixed.c} "init-mixed" "init-mixed.out" "-I. -fPIE"}
    {"PIE PR ld/14525" "-pie" "" {pr14525.c} "pr14525" "pr14525.out" "-fPIE"}
}
set array_tests_static {
    {"static preinit array" "-static" "" {preinit.c} "preinit" "preinit.out"}
    {"static init array" "-static" "" {init.c} "init" "init.out"}
    {"static fini array" "-static" "" {fini.c} "fini" "fini.out"}
    {"static init array mixed" "-static" "" {init-mixed.c} "init-mixed" "init-mixed.out" "-I."}
}

# NetBSD ELF systems do not currently support the .*_array sections.
set xfails [list "*-*-netbsdelf*"]
run_ld_link_exec_tests $xfails $array_tests

if { [istarget *-*-linux*]
     || [istarget *-*-nacl*]
     || [istarget *-*-gnu*] } {
    run_ld_link_exec_tests $xfails $array_tests_pie
}

# Be cautious to not XFAIL for *-*-linux-gnu*, *-*-kfreebsd-gnu*, etc.
switch -regexp $target_triplet {
    ^\[^-\]*-\[^-\]*-gnu.*$ {
	# <http://www.gnu.org/software/hurd/open_issues/binutils.html#static>
	lappend xfails "*-*-*"
    }
}
run_ld_link_exec_tests $xfails $array_tests_static

catch "exec rm -f tmpdir/preinit tmpdir/init tmpdir/fini tmpdir/init-mixed" status
