# Expect script for complex PE tests that require a C compiler
# in addition to the just-built binutils.
#   Copyright 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.
#

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

# No compiler, no test.
if { [which $CC] == 0 } {
    untested "PE version scripts"
    untested "aligned common tests"
    # Add more "untested" directives here when adding more tests below.
    return
}

proc build_basefile1_o {} {
    global CC
    global CFLAGS
    global srcdir
    global subdir

    # Compile the object file.
    if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/basefile1.s tmpdir/basefile1.o] {
	fail "compiling basefile1 object"
    }
}

proc run_basefile_test { testname } {
    global LD
    global DLLTOOL
    global srcdir
    global subdir
    global verbose

    if ![ld_simple_link "$LD -e start \
	    --base-file=tmpdir/$testname.base \
	    --export-all-symbols" tmpdir/$testname.dll \
	    "tmpdir/basefile1.o"] {
	fail "linking DLL"
	return
    }

    if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.base]" 3 }

    catch "exec wc -c tmpdir/$testname.base" err

    if ![string match "0 tmpdir/$testname.base" [string trim $err]] then {
      send_log "$err\n"
      if { $verbose == 2 } then { verbose "$err" 2 }
      fail $testname
      return
    }

    pass "$testname"
}

proc build_vers_script_dll_o {} {
    global CC
    global CFLAGS
    global srcdir
    global subdir

    # Compile the object file.
    if ![ld_compile "$CC $CFLAGS -shared" $srcdir/$subdir/vers-script-dll.c tmpdir/vers-script-dll.o] {
	fail "compiling shared lib object"
    }
}

proc run_ver_script_test { testname } {
    global CC
    global srcdir
    global subdir
    global verbose

    if ![ld_simple_link "$CC -shared \
	    -Wl,--version-script,$srcdir/$subdir/$testname.ver \
	    -Wl,--output-def,tmpdir/$testname.def" tmpdir/$testname.dll \
	    "tmpdir/vers-script-dll.o"] {
	fail "linking DLL"
    }

    if { $verbose > 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 3 }
    if { [regexp_diff tmpdir/$testname.def $srcdir/$subdir/$testname.d] } then {
	fail $testname
	if { $verbose == 2 } then { verbose "output is [file_contents tmpdir/$testname.def]" 2 }
	return
    }

    pass "$testname"
}


build_vers_script_dll_o

run_ver_script_test "vers-script-1"
run_ver_script_test "vers-script-2"
run_ver_script_test "vers-script-3"
run_ver_script_test "vers-script-4"

if {[istarget i*86-*-cygwin*]
    || [istarget i*86-*-pe]
    || [istarget i*86-*-mingw*]
    || [istarget x86_64-*-mingw*] } {

   build_basefile1_o
   run_basefile_test "basefile-secrel"
 } else {
    untested "PE basefile test"
 }

set align_tests {
  {"aligned common 1" "" "" {aligncomm-1.c}
   {{nm -C aligncomm.d}} "aligncomm-1.x"}
  {"aligned common 2" "" "" {aligncomm-2.c}
   {{nm -C aligncomm.d}} "aligncomm-2.x"}
  {"aligned common 3" "" "" {aligncomm-3.c}
   {{nm -C aligncomm.d}} "aligncomm-3.x"}
  {"aligned common 4" "" "" {aligncomm-4.c}
   {{nm -C aligncomm.d}} "aligncomm-4.x"}
}

run_ld_link_tests $align_tests
