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

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

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