# Expect script for various ELF tests.
#   Copyright (C) 2002-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.
#

# 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" }
	}
	# bfin does not currently support copy relocs.
	setup_xfail "bfin-*-*"
	run_ld_link_tests {
	    {"PR ld/14170"
		"tmpdir/pr14170a.o tmpdir/pr14170.so" "" "" "pr14170c.s"
		{ } "pr14170" }
	}
    }
}

# Only run these tests on targets that support creating shared libraries.
if { [check_shared_lib_support] } then {
    # 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.
    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" }
    }
    setup_xfail "tic6x-*-*"
    run_ld_link_tests {
	{"Build pr17068.so"
	    "-shared" "" ""
	    {pr17068d.s} {} "pr17068.so"}
	{"Build pr17068a.a"
	    "" "" ""
	    {pr17068a.s pr17068c.s pr17068ez.s} {} "pr17068a.a"}
	{"Build pr17068b.a"
	    "" "" ""
	    {pr17068b.s pr17068e.s} {} "pr17068b.a"}
    }
    # bfin does not currently support copy relocs.
    setup_xfail "bfin-*-*"
    run_ld_link_tests {
	{"pr17068 link --as-needed lib in group"
	    "--as-needed" "--start-group tmpdir/pr17068a.a tmpdir/pr17068.so tmpdir/pr17068b.a --end-group" ""
	    {start.s pr17068.s} {} "pr17068"}
    }
    # xfail on tic6x due to non-PIC/non-PID warnings
    setup_xfail "tic6x-*-*"
    # Fails on MIPS because ABI trickery means that a NULL reloc is also emitted.
    setup_xfail "mips*-*-*"
    # Fails on bfin because relocations are not created.
    setup_xfail "bfin-*-*"
    run_ld_link_tests {
	{"-Bsymbolic-functions"
	    "-shared -Bsymbolic-functions" "" ""
	    {symbolic-func.s} {{readelf {-r --wide} symbolic-func.r}}
	    "symbolic-func.so"}
    }
}

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
