# 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_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"

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
