# Expect script for ld-auto-import 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.
#
# Written by Ralf.Habacker@freenet.de
# Based on ls-shared/shared.exp by Ian Lance Taylor (ian@cygnus.com)
#
 
# Note: 
# 
# This script tests some auto-import functionality:
#
#  A. "auto importing direct from a dll" functionality, which dramatically reduces the 
#     linking time for big libraries and applications by skipping creating/using 
#     import libraries. Instead it links directly to the related dll or to a symlinked 
#     dll for replacing regular import libraries. The test has 6 stages: 
#  
#     1. compile and link a test dll exporting some text and data symbols and a 
#     standard import library
#
#     2. create a symbolic link to this dll to simulate a replaced import library. 
#
#     3. compile and link a client application with the standard import library. 
#     This should produce no errors. 
#
#     4. compile and link a client application with the created dll. 
#     This should also produce no errors. 
#
#     5. compile and link a client application using the "import library". 
#     This should also produce no errors. 
#
#     6. compile and link a client application with auto-import disabled. 
#     This should produce a linking error. 
#
# B. runtime check if there are no segfaults when importing const data variables 
#

# 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 platforms.
# Square bracket expressions seem to confuse istarget.
if { ![istarget *-pc-cygwin]    
     && ![istarget *-pc-mingw*] } {
    return
}

if [istarget *-pc-mingw*] {
    # FIXME: Add support for this target.
    unsupported "mingw currently not supported"
}

# No compiler, no test.
if { [which $CC] == 0 } {
    untested "Auto import test (compiler not found)"
    return
}

# ld_special_link
#	link a program using ld, without including any libraries
#
proc ld_special_link { ld target objects } {
    global host_triplet
    global link_output

    if { [which $ld] == 0 } then {
	perror "$ld does not exist"
	return 0
    }

    if [is_endian_output_format $objects] then {
	set flags [big_or_little_endian]
    } else {
	set flags ""
    }

    verbose -log "$ld $flags -o $target $objects"

    catch "exec $ld $flags -o $target $objects" link_output
    set exec_output [prune_warnings $link_output]

    # We don't care if we get a warning about a non-existent start
    # symbol, since the default linker script might use ENTRY.
    regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output

    # We don't care if we get a message about creating a library file.
    regsub -all "(^|\n)(Creating library file\[^\n\]*\n?)" $exec_output "\\1" exec_output

    if [string match "" $exec_output] then {
	return 1
    }

    verbose -log "$exec_output"
    return 0
}

set tmpdir tmpdir
set SHCFLAG ""

if [istarget *-pc-cygwin] {
    # Set some libs needed for cygwin.
    set MYLIBS "-L/usr/lib -lcygwin -L/usr/lib/w32api -lkernel32"
    
    # Compile the dll.
    if ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/dll.c $tmpdir/dll.o] {
	fail "compiling shared lib"
    }
    if ![ld_special_link "$ld -shared --enable-auto-import -e __cygwin_dll_entry@12 --out-implib=$tmpdir/libstandard.dll.a" $tmpdir/dll.dll "$tmpdir/dll.o $MYLIBS"] {
	fail "linking shared lib"
    }

    # Create symbolic link.
    catch "exec ln -fs dll.dll $tmpdir/libsymlinked_dll.dll.a" ln_catch

    # Compile and link the client program.
    if ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/client.c $tmpdir/client.o] {
        fail "compiling client"
    }

    # Check linking with import library.
    set msg "linking auto-import client using a standard import library"
    if [ld_special_link $ld $tmpdir/client-linklib.exe "--enable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -lstandard $MYLIBS"] {
	pass $msg
    } else {
	fail $msg 
    }

    # Check linking directly with dll.
    set msg "linking auto-import client using the dll"
    if [ld_special_link $ld $tmpdir/client-linkdll.exe "--enable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -ldll $MYLIBS"] {
	pass $msg
    } else {
	fail $msg 
    }

    # Check linking with symlinked dll.
    set msg "linking auto-import client using symbolic linked dll"
    if [ld_special_link $ld $tmpdir/client-symlinkeddll.exe "--enable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -lsymlinked_dll $MYLIBS"] {
	pass $msg
    } else {
	fail $msg 
    }

    # Check linking with disabled auto-import, this must produce linking error.
    set msg "linking with disabled auto-import"
    if ![ld_special_link $ld $tmpdir/client-failed.exe "--disable-auto-import --enable-runtime-pseudo-reloc /lib/crt0.o $tmpdir/client.o -L$tmpdir -ldll $MYLIBS"] {
	pass $msg
    } else {
	fail $msg
    }

    # Check that the app works - ie that there is output when the applications runs.
    set msg "application runtime segfault check" 
    catch "exec $tmpdir/client-linklib.exe" exec_output
    if ![string match "" $exec_output] then {
    	pass $msg
    } else {
    	fail $msg
    }
}
