# 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 {    ! [istarget arc-*-*]
     && ! [istarget avr-*-*]
     && ! [istarget cr16-*-*]
     && ! [istarget cris*-*-*]
     && ! [istarget crx-*-*]
     && ! [istarget d10v-*-*]
     && ! [istarget d30v-*-*]
     && ! [istarget dlx-*-*]
     && ! [istarget fr30-*-*]
     && ! [istarget frv-*-*]
     && ! [istarget h8300-*-*]
     && ! [istarget i860-*-*]
     && ! [istarget i960-*-*]
     && ! [istarget ip2k-*-*]
     && ! [istarget iq2000-*-*]
     && ! [istarget lm32-*-*]
     && ! [istarget m32c-*-*]
     && ! [istarget m32r-*-*]
     && ! [istarget mcore*-*-*]
     && ! [istarget mep-*-*]
     && ! [istarget microblaze-*-*]
     && ! [istarget mn10200-*-*]
     && ! [istarget moxie-*-*]
     && ! [istarget ms1-*-*]
     && ! [istarget msp430-*-*]
     && ! [istarget openrisc-*-*]
     && ! [istarget or32-*-*]
     && ! [istarget pj-*-*]
     && ! [istarget rx-*-*]
     && ! [istarget spu-*-*]
     && ! [istarget v850*-*-*]
     && ! [istarget xstormy16-*-*]
     && ! [istarget *-*-irix*]
     && ! [istarget *-*-rtems] } {
  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
}

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
