# Expect script for complex PE tests that require a C compiler and the ability
# to run target executables natively, in addition to the just-built binutils.
#   Copyright 2006, 2007, 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 Pedro Alves <pedro_alves@portugalmail.pt>
#
 
# Note:
# 
# This test checks the "direct linking to a dll" functionality.
# 
# The test has 7 stages:
# 
# 1. compile and link a test dll with ".dll" extension.
#
# 2. compile and link a test dll with ".sl" (i.e. != ".dll") extension.
#
# 3. compile and link a client application linking directly to the ".dll" dll built in 1.
#    This should produce no errors.
#
# 4. compile and link a client application linking directly to the ".sl" dll built in 2.
#    This should produce no errors.
#
# 5. compile and link a client application linking directly to a symlink into 
#    the ".dll" dll built in 1.
#    This should produce no errors.
#
# 6. compile and link a client application linking directly to a symlink into 
#    the ".sl" dll built in 1.
#    This should produce no errors.
#
# 7. run the produced executables

# This test can only be run on PE/COFF platforms.
if {![is_pecoff_format]} {
    return
}

# No compiler, no test.
if { [which $CC] == 0 } {
    untested "Direct linking to dll test"
    return
}

set tmpdir tmpdir

proc test_direct_link_dll {} {
    global CC
    global CFLAGS
    global srcdir
    global subdir
    global tmpdir

    # Compile the dll.
    if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_dll.c $tmpdir/direct_dll.o ] {
	fail "compiling shared lib"
    } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.dll "$tmpdir/direct_dll.o" ] {
	fail "linking shared lib (.dll)"
    } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.sl "$tmpdir/direct_dll.o" ] {
	fail "linking shared lib (.sl)"
    } else {
	# Compile and link the client program.
	if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_client.c $tmpdir/direct_client.o ] {
	    fail "compiling client"
	} else {
	    # Check linking directly to direct_dll.dll.
	    set msg "linking client (.dll)"
	    if [ld_simple_link "$CC -Wl,--enable-auto-import" $tmpdir/direct_client_dll.exe \
	      "$tmpdir/direct_client.o $tmpdir/direct_dll.dll" ] {
		pass $msg
	    } else {
		fail $msg 
	    }

	    # Check linking directly to direct_dll.sl.
	    set msg "linking client (.sl)"
	    if [ld_simple_link "$CC -Wl,--enable-auto-import" $tmpdir/direct_client_sl.exe \
	      "$tmpdir/direct_client.o $tmpdir/direct_dll.sl" ] {
		pass $msg
	    } else {
		fail $msg 
	    }

	    # Check dll direct linking through symlink to .dll.
	    # Create symbolic link.
	    catch "exec ln -fs direct_dll.dll $tmpdir/libdirect_dll.dll.a" ln_catch
	    set msg "linking client (symlink -> .dll)"
	    if [ld_simple_link "$CC -Wl,--enable-auto-import" $tmpdir/direct_client_symlink_dll.exe \
	      "$tmpdir/direct_client.o $tmpdir/libdirect_dll.dll.a" ] {
	        pass $msg
	    } else {
		fail $msg
	    }
		
	    # Check dll direct linking through symlink to .sl.
	    # Create symbolic link.
	    catch "exec ln -fs direct_dll.sl $tmpdir/libdirect_sl.dll.a" ln_catch
	    set msg "linking client (symlink -> .sl)"
	    if [ld_simple_link "$CC -Wl,--enable-auto-import" $tmpdir/direct_client_symlink_sl.exe \
	      "$tmpdir/direct_client.o $tmpdir/libdirect_sl.dll.a" ] {
		pass $msg
	    } else {
		fail $msg 
	    }
	}
    }
}

proc directdll_execute {exe msg} {
    set expected ""
    catch "exec $exe" prog_output
    if [string match $expected $prog_output] then {
        pass $msg
    } else {
        verbose $prog_output
        fail $msg
    }
}

test_direct_link_dll

# This is as far as we can go with a cross-compiler
if ![isnative] then {
    verbose "Not running natively, so cannot execute binaries"
    return
}

directdll_execute "$tmpdir/direct_client_dll.exe" "running direct linked dll (.dll)"
directdll_execute "$tmpdir/direct_client_sl.exe" "running direct linked dll (.sl)"
directdll_execute "$tmpdir/direct_client_symlink_sl.exe" "running direct linked dll (symlink -> .sl)"
directdll_execute "$tmpdir/direct_client_symlink_dll.exe" "running direct linked dll (symlink -> .dll)"
