# Expect script for ld-shared tests
#   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
#   2004, 2005, 2007, 2008, 2009, 2010, 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.
#
# Written by Ian Lance Taylor (ian@cygnus.com)
#

# Make sure that ld can generate ELF shared libraries.
# Note that linking against ELF shared libraries is tested by the
# bootstrap test.

# This test can only be run if ld generates native executables.
if ![isnative] then {return}

# This test can only be run on a couple of ELF platforms.
# Square bracket expressions seem to confuse istarget.
if { ![istarget hppa*64*-*-hpux*] \
     && ![istarget hppa*-*-linux*] \
     && ![istarget i?86-*-sysv4*] \
     && ![istarget i?86-*-unixware] \
     && ![istarget i?86-*-elf*] \
     && ![istarget i?86-*-linux*] \
     && ![istarget i?86-*-gnu*] \
     && ![istarget *-*-nacl*] \
     && ![istarget ia64-*-elf*] \
     && ![istarget ia64-*-linux*] \
     && ![istarget m68k-*-linux*] \
     && ![istarget mips*-*-irix5*] \
     && ![istarget mips*-*-linux*] \
     && ![istarget powerpc*-*-elf*] \
     && ![istarget powerpc*-*-linux*] \
     && ![istarget powerpc*-*-sysv4*] \
     && ![istarget sparc*-*-elf] \
     && ![istarget sparc*-*-solaris2*] \
     && ![istarget sparc*-*-sunos4*] \
     && ![istarget sparc*-*-linux*] \
     && ![istarget arm*-*-linux*] \
     && ![istarget alpha*-*-linux*] \
     && ![istarget rs6000*-*-aix*] \
     && ![istarget powerpc*-*-aix*] \
     && ![istarget s390*-*-linux*] \
     && ![istarget aarch64*-*-linux*] \
     && ![istarget x86_64-*-linux*] } {
    return
}

if { [istarget *-*-linux*aout*] \
     || [istarget *-*-linux*oldld*] } {
    return
}

set tmpdir tmpdir
set SHCFLAG ""
set shared_needs_pic "no"

if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {

    # AIX shared libraries do not seem to support useful features,
    # like overriding the shared library function or letting the
    # shared library refer to objects defined in the main program.  We
    # avoid testing those features.
    set SHCFLAG "-DXCOFF_TEST"

    # The AIX 3.2.5 loader appears to randomly fail when loading
    # shared libraries from NSF mounted partitions, so we avoid any
    # potential problems by using a local directory.
    catch {exec /bin/sh -c "echo $$"} pid
    set tmpdir /usr/tmp/ld.$pid
    catch "exec mkdir $tmpdir" exec_status

    # On AIX, we need to explicitly export the symbols the shared
    # library is going to provide, and need.
    set file [open $tmpdir/xcoff.exp w]
    puts $file shlibvar1
    puts $file shlibvar2
    puts $file shlib_shlibvar1
    puts $file shlib_shlibvar2
    puts $file shlib_shlibcall
    puts $file shlib_shlibcalled
    puts $file shlib_checkfunptr1
    puts $file shlib_getfunptr1
    puts $file shlib_check
    close $file
}

if [istarget arm*-*-linux*] {
    # On ARM section anchors can change the symbol pre-emptability for
    # non-PIC shared libraries, causing these tests to fail.  Turn section
    # anchors off.
    set SHCFLAG "-fno-section-anchors"

    # On targets that have MOVW the compiler will emit relocations which
    # the linker doesn't support when compiling -shared without -fpic.  The
    # test to find out whether we want to XFAIL the non-PIC tests requires
    # a compile - so we pre-calculate it here.  We also note that this can
    # only affect arm*-*-*eabi* targets as the old ABI doesn't support v7.
    if [istarget arm*-*-*eabi*] {
	set file [open $tmpdir/movw-detect.c w]
	puts $file "void foo(void) { __asm (\"movw r0, #0\"); }"
	close $file
	if [run_host_cmd_yesno "$CC" "$CFLAGS -c $tmpdir/movw-detect.c -o $tmpdir/movw-detect.o"] {
	    set shared_needs_pic "yes"
	}
    }
}

# The test procedure.
proc shared_test { progname testname main sh1 sh2 dat args } {
    global CC
    global srcdir
    global subdir
    global exec_output
    global host_triplet
    global tmpdir

    if [llength $args] { set shldflags [lindex $args 0] } else { set shldflags "" }

    # Build the shared library.
    # On AIX, we need to use an export file.
    set shared -shared
    if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	set shared "-bM:SRE -bE:$tmpdir/xcoff.exp"
    }
    if {![ld_simple_link $CC $tmpdir/$progname.so "$shared $shldflags $tmpdir/$sh1 $tmpdir/$sh2"]} {
        fail "$testname"
    	return
    }

    # Link against the shared library.  Use -rpath so that the
    # dynamic linker can locate the shared library at runtime.
    # On AIX, we must include /lib in -rpath, as otherwise the loader
    # can not find -lc.
    set rpath $tmpdir
    if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	set rpath /lib:$tmpdir
    }
    if ![ld_simple_link $CC $tmpdir/$progname "-Wl,-rpath,$rpath $tmpdir/$main $tmpdir/$progname.so"] {
    	fail "$testname"
    	return
    }

    # Run the resulting program
    send_log "$tmpdir/$progname >$tmpdir/$progname.out\n"
    verbose "$tmpdir/$progname >$tmpdir/$progname.out"
    catch "exec $tmpdir/$progname >$tmpdir/$progname.out" exec_output
    if ![string match "" $exec_output] then {
	send_log "$exec_output\n"
	verbose "$exec_output"
	fail "$testname"
    	return
    }

    send_log "diff $tmpdir/$progname.out $srcdir/$subdir/$dat.dat\n"
    verbose "diff $tmpdir/$progname.out $srcdir/$subdir/$dat.dat"
    catch "exec diff $tmpdir/$progname.out $srcdir/$subdir/$dat.dat" exec_output
    set exec_output [prune_warnings $exec_output]

    if {![string match "" $exec_output]} then {
	send_log "$exec_output\n"
	verbose "$exec_output"
	fail "$testname"
        return
    }

    pass "$testname"
}

# Old version of GCC for MIPS default to enabling -fpic
# and get confused if it is used on the command line.
if { [istarget mips*-*-*] && ! [at_least_gcc_version 4 3] } then {
    set picflag ""
} else {
    # Unfortunately, the gcc argument is -fpic and the cc argument is
    # -KPIC.  We have to try both.
    set picflag "-fpic"
    send_log "$CC $picflag\n"
    verbose "$CC $picflag"
    catch "exec $CC $picflag" exec_output
    send_log "$exec_output\n"
    verbose "--" "$exec_output"
    if { [string match "*illegal option*" $exec_output] \
	 || [string match "*option ignored*" $exec_output] \
	 || [string match "*unrecognized option*" $exec_output] \
	 || [string match "*passed to ld*" $exec_output] } {
	if [istarget *-*-sunos4*] {
	    set picflag "-pic"
	} else {
	    set picflag "-KPIC"
	}
    }
}
verbose "Using $picflag to compile PIC code"

# Compile the main program.
if ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o] {
    unresolved "shared (non PIC)"
    unresolved "shared"
} else {
    # The shared library is composed of two files.  First compile them
    # without using -fpic.  That should work on an ELF system,
    # although it will be less efficient because the dynamic linker
    # will need to do more relocation work.  However, note that not
    # using -fpic will cause some of the tests to return different
    # results.
    if { ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/sh1.c $tmpdir/sh1np.o]
	 || ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/sh2.c $tmpdir/sh2np.o] } {
	unresolved "shared (non PIC)"
    } else { if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	shared_test shnp "shared (nonPIC)" mainnp.o sh1np.o sh2np.o xcoff
    } else {
	# SunOS non PIC shared libraries don't permit some cases of
	# overriding.
	setup_xfail "*-*-sunos4*"
	setup_xfail "ia64-*-linux*"
	setup_xfail "alpha*-*-linux*"
	setup_xfail "powerpc64*-*-*"
	if { ![istarget hppa*64*-*-linux*] } {
	    setup_xfail "hppa*-*-linux*"
	}
	if { [istarget sparc*-*-linux*] && [is_elf64 $tmpdir/mainnp.o] } {
	    setup_xfail "sparc*-*-linux*"
	}
	if { [is_elf64 $tmpdir/mainnp.o] } {
	    setup_xfail "x86_64-*-linux*"
	}
	setup_xfail "x86_64-*-linux-gnux32"
	setup_xfail "s390x-*-linux*"
	if [ string match $shared_needs_pic "yes" ] {
	    setup_xfail "arm*-*-linux*"
	}
	shared_test shnp "shared (non PIC)" mainnp.o sh1np.o sh2np.o shared

	# Test ELF shared library relocations with a non-zero load
	# address for the library.  Near as I can tell, the R_*_RELATIVE
	# relocations for various targets are broken in the case where
	# the load address is not zero (which is the default).
	setup_xfail "*-*-sunos4*"
	setup_xfail "*-*-linux*libc1"
	setup_xfail "powerpc*-*-linux*"
	setup_xfail "ia64-*-linux*"
	setup_xfail "alpha*-*-linux*"
	setup_xfail "mips*-*-linux*"
	if { ![istarget hppa*64*-*-linux*] } {
	    setup_xfail "hppa*-*-linux*"
	}
	if { [istarget sparc*-*-linux*] && [is_elf64 $tmpdir/mainnp.o] } {
	    setup_xfail "sparc*-*-linux*"
	}
	if { [is_elf64 $tmpdir/mainnp.o] } {
	    setup_xfail "x86_64-*-linux*"
	}
	setup_xfail "x86_64-*-linux-gnux32"
	setup_xfail "s390x-*-linux*"
	if [ string match $shared_needs_pic "yes" ] {
	    setup_xfail "arm*-*-linux*"
	}
	shared_test shnp "shared (non PIC, load offset)" \
		mainnp.o sh1np.o sh2np.o shared \
		"-T $srcdir/$subdir/elf-offset.ld"
    } }

    # Now compile the code using -fpic.

    if { ![ld_compile "$CC $CFLAGS $SHCFLAG $picflag" $srcdir/$subdir/sh1.c $tmpdir/sh1p.o]
	 || ![ld_compile "$CC $CFLAGS $SHCFLAG $picflag" $srcdir/$subdir/sh2.c $tmpdir/sh2p.o] } {
	unresolved "shared"
    } else {
	# SunOS can not compare function pointers correctly
	if [istarget "*-*-sunos4*"] {
	    shared_test shp "shared" mainnp.o sh1p.o sh2p.o sun4
	} else { if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	    shared_test shp "shared" mainnp.o sh1p.o sh2p.o xcoff
	} else {
	    shared_test shp "shared" mainnp.o sh1p.o sh2p.o shared
	    ld_compile "$CC $CFLAGS -DSYMBOLIC_TEST -DXCOFF_TEST $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o
	    ld_compile "$CC $CFLAGS -DSYMBOLIC_TEST -DXCOFF_TEST $SHCFLAG $picflag" $srcdir/$subdir/sh1.c $tmpdir/sh1p.o
	    shared_test shp "shared -Bsymbolic" mainnp.o sh1p.o sh2p.o symbolic "-Bsymbolic"
	    ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o
	    ld_compile "$CC $CFLAGS $SHCFLAG $picflag" $srcdir/$subdir/sh1.c $tmpdir/sh1p.o
	} }
    }
}

# Now do the same tests again, but this time compile main.c PIC.
if ![ld_compile "$CC $CFLAGS $SHCFLAG $picflag" $srcdir/$subdir/main.c $tmpdir/mainp.o] {
    unresolved "shared (PIC main, non PIC so)"
    unresolved "shared (PIC main)"
} else {
    if { [file exists $tmpdir/sh1np.o ] && [ file exists $tmpdir/sh2np.o ] } {
        if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	    shared_test shmpnp "shared (PIC main, non PIC so)" mainp.o sh1np.o sh2np.o xcoff
	} else {
	    # SunOS non PIC shared libraries don't permit some cases of
	    # overriding.
	    setup_xfail "*-*-sunos4*"
	    setup_xfail "ia64-*-linux*"
	    setup_xfail "alpha*-*-linux*"
	    setup_xfail "powerpc64*-*-*"
	    if { ![istarget hppa*64*-*-linux*] } {
		setup_xfail "hppa*-*-linux*"
	    }
	    if { [istarget sparc*-*-linux*] && [is_elf64 $tmpdir/mainp.o] } {
		setup_xfail "sparc*-*-linux*"
	    }
	    if { [is_elf64 $tmpdir/mainp.o] } {
		setup_xfail "x86_64-*-linux*"
	    }
	    setup_xfail "x86_64-*-linux-gnux32"
	    setup_xfail "s390x-*-linux*"
	    if [ string match $shared_needs_pic "yes" ] {
		setup_xfail "arm*-*-linux*"
	    }
	    shared_test shmpnp "shared (PIC main, non PIC so)" mainp.o sh1np.o sh2np.o shared
	}
    } else {
	unresolved "shared (PIC main, non PIC so)"
    }

    if { [file exists $tmpdir/sh1p.o ] && [ file exists $tmpdir/sh2p.o ] } {
        if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	    shared_test shmpp "shared (PIC main)" mainp.o sh1p.o sh2p.o xcoff
	} else {
	    shared_test shmpp "shared (PIC main)" mainp.o sh1p.o sh2p.o shared
	}
    } else {
	unresolved "shared (PIC main)"
    }
}

if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
    # Remove the temporary directory.
    catch "exec rm -rf $tmpdir" exec_status
}
