# Expect script for linker support of size relocations.
#
#   Copyright (C) 2013-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.
#


# Size relications have only been implemented for the ix86 and x86_64,
# so far.
if {!(([istarget "i?86-*-*"]
       || [istarget "x86_64-*-*"])
      && ([istarget "*-*-elf*"]
	  || [istarget "*-*-nacl*"]
	  || (([istarget "*-*-linux*"]
	       || [istarget "*-*-gnu*"])
	      && ![istarget "*-*-*aout*"]
	      && ![istarget "*-*-*oldld*"]))) } {
    verbose "Size relocations tests not run - no target support"
    return
}

# So as to avoid rewriting every last test case here in a nacl variant,
# we use black magic to massage the generic cases into nacl-variant cases.
if [istarget "*-*-nacl*"] {
    # Change all the -melf_i386 to -melf_i386_nacl so linking can succeed.
    set options_regsub(ld) {-m(\\S+) -m\\1_nacl}
}

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]
}

# We need a native system.
if ![isnative] {
    verbose "Native size relocation tests not run - not a native toolchain"
    return
}

# We need a working compiler.
if { [which $CC] == 0 } {
    verbose "Native size relocation tests not run - no compiler available"
    return
}

# Add $NOPIE_CFLAGS and $NOPIE_LDFLAGS if non-PIE is required.
global NOPIE_CFLAGS NOPIE_LDFLAGS

run_cc_link_tests [list \
    [list \
	"Build libsize-1.so" \
	"-shared" \
	"-fPIC" \
	{size-1a.c size-1b.c} \
	{} \
	"libsize-1.so" \
    ] \
    [list \
	"Build libsize-2.so" \
	"-shared" \
	"-fPIC" \
	{size-2a.c size-2b.c} \
	{} \
	"libsize-2.so" \
    ] \
    [list \
	"Build libsize-3a.so" \
	"-shared" "-fPIC" \
	{size-3a.c} \
	{} \
	"libsize-3a.so" \
    ] \
    [list \
	"Build libsize-3b.so" \
	"-shared" \
	"-fPIC" \
	{size-3b.c} \
	{} \
	"libsize-3b.so" \
    ] \
    [list \
	"Build libsize-3c.so" \
	"-shared" \
	"-fPIC" \
	{size-3c.c} \
	{} \
	"libsize-3c.so" \
    ] \
    [list \
	"Build libsize-6b.so" \
	"-shared" \
	"-fPIC" \
	{size-6b.c} \
	{} \
	"libsize-6b.so" \
    ] \
    [list \
	"Build libsize-7.so" \
	"-shared" \
	"-fPIC" \
	{size-7b.c} \
	{} \
	"libsize-7.so" \
    ] \
    [list \
	"Build size-7" \
	"$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libsize-7.so" \
	"$NOPIE_CFLAGS" \
	{size-7a.c} \
	{{readelf -rW size-7.rd}} \
	"size-7.exe" \
    ] \
    [list \
	"Build libsize-8.so" \
	"-shared" "-fPIC" \
	{size-8b.c} \
	{} \
	"libsize-8.so" \
    ] \
    [list \
	"Build size-8" \
	"$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libsize-8.so" \
	"$NOPIE_CFLAGS" \
	{size-8a.c} \
	{{readelf -rW size-8.rd}} \
	"size-8.exe" \
    ] \
    [list \
	"Build libsize-9.so" \
	"-shared" \
	"-fPIC" \
	{size-9b.c} \
	{{readelf -rW size-9.rd}} \
	"libsize-9.so" \
    ] \
    [list \
	"Build libsize-10.so" \
	"-shared" \
	"-fPIC" \
	{size-10b.c} \
	{{readelf -rW size-10.rd}} \
	"libsize-10.so" \
    ] \
]

# Check if size relocation works at run-time.
catch "exec tmpdir/size-7.exe > tmpdir/dump.out" exec_output
if ![string match "" $exec_output] then {
    send_log "No run-time size relocation support: $exec_output\n"
    verbose "No run-time size relocation support: $exec_output" 1
    return
}

if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/size-7.out" ] } then {
    verbose "output is [file_contents "tmpdir/dump.out"]" 2
    fail "Run-time size relocation"
    return
}

# Run-time size relocation tests.
run_ld_link_exec_tests [] [list \
    [list \
	"Run size-1" \
	"tmpdir/libsize-1.so" \
	"" \
	{size-1.c} \
	"size-1" \
	"size-1.out" \
    ] \
    [list \
	"Run size-2" \
	"tmpdir/libsize-2.so" \
	"" \
	{size-2.c} \
	"size-2" \
	"size-2.out" \
    ] \
    [list \
	"Run size-3a" \
	"" \
	"" \
	{size-3.c size-3a.c} \
	"size-3a" \
	"size-3.out" \
    ] \
    [list \
	"Run size-3b" \
	"tmpdir/libsize-3a.so" \
	"" \
	{size-3.c} \
	"size-3b" \
	"size-3.out" \
    ] \
    [list \
	"Run size-3c" \
	"" \
	"" \
	{size-3.c size-3b.c} \
	"size-3c" \
	"size-3.out" \
    ] \
    [list \
	"Run size-3d (1)" \
	"tmpdir/libsize-3b.so" \
	"" \
	{size-3.c} \
	"size-3d1" \
	"size-3.out" \
    ] \
    [list \
	"Run size-3d (2)" \
	"" \
	"" \
	{size-3.c size-3c.c} \
	"size-3d2" \
	"size-3.out" \
    ] \
    [list \
    {"Run size-3e"
     "tmpdir/libsize-3c.so" ""
     {size-3.c} "size-3e" "size-3.out"}
    ] \
    [list \
	"Run size-4a" \
	"" \
	"" \
	{size-4a.c size-4b.c} \
	"size-4a" \
	"size-4.out" \
	"$NOPIE_CFLAGS" \
    ] \
    [list \
	"Run size-4b" \
	"" \
	"" \
	{size-4b.c size-4a.c} \
	"size-4b" \
	"size-4.out" \
	"$NOPIE_CFLAGS" \
    ] \
    [list \
	"Run size-5a" \
	"" \
	"" \
	{size-5a.c size-5b.c} \
	"size-5a" \
	"size-5.out" \
	"$NOPIE_CFLAGS" \
    ] \
    [list \
	"Run size-5b" \
	"" \
	"" \
	{size-5b.c size-5a.c} \
	"size-5b" \
	"size-5.out" \
	"$NOPIE_CFLAGS" \
    ] \
    [list \
	"Run size-6" \
	"tmpdir/libsize-6b.so" \
	"" \
	{size-6a.c} \
	"size-6" \
	"size-6.out" \
	"$NOPIE_CFLAGS" \
    ] \
    [list \
	"Run size-8" \
	"tmpdir/libsize-8.so --hash-styl=gnu" \
	"" \
	{size-8a.c} \
	"size-8" \
	"size-8.out" \
	"$NOPIE_CFLAGS" \
    ] \
    [list \
	"Run size-9" \
	"tmpdir/libsize-9.so" \
	"" \
	{size-9a.c} \
	"size-9" \
	"size-9.out" \
    ] \
    [list \
	"Run size-10" \
	"tmpdir/libsize-10.so" \
	"" \
	{size-10a.c} \
	"size-10" \
	"size-10.out" \
    ] \
]
