# Expect script for ld-auto-import tests
#   Copyright 2002, 2005, 2007, 2008, 2009
#   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
    }
}
