# Copyright 2002, 2004, 2006 Free Software Foundation, Inc.

# 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 2 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.

if {![istarget "i*86-*-*"] && ![istarget "x86_64-*-mingw64*"] } {
    return
}

if {![istarget "i*86-*-*pe*"] \
    && ![istarget "i*86-*-cygwin*"] \
    && ![istarget "i*86-*-mingw32*"] \
    && ![istarget "x86_64-*-mingw64*"] } {
    set target_xfail "yes"
} else {
    set target_xfail "no"
}

if {![info exists DLLTOOL]} then {
    return
}

if {[which $DLLTOOL] == 0} then {
    return
}

verbose "$DLLTOOL -d $srcdir/$subdir/fastcall.def" 1
catch "exec $DLLTOOL -d $srcdir/$subdir/fastcall.def" err

if ![string match "" $err] then {
    send_log "$err\n"
    verbose "$err" 1
    fail "dlltool (fastcall export)"
} else {
    pass "dlltool (fastcall export)"
}

if { "$target_xfail" == "yes" } {
    setup_xfail *-*
}

verbose "$DLLTOOL -p prefix -l tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" 1
catch "exec $DLLTOOL -p prefix -l tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" err

if ![string match "" $err] then {
    send_log "$err\n"
    verbose "$err" 1
    fail "dlltool -p (execution)"
    continue
}

pass "dlltool -p (execution)"

set got [binutils_run $NM "tmpdir/libalias.a"]
set want "00000000 I __imp__prefix_symbol.*00000000 T _prefix_symbol.*00000000 I __imp__symbol.*00000000 T _symbol"

if [regexp $want $got] then {
    pass "dlltool -p (symbol names)"
} else {
    fail "dlltool -p (symbol names)"
}

set got [binutils_run $OBJDUMP "-s -j .idata\$6 tmpdir/libalias.a"]
set want "(Contents of section .idata\\\$6:.*\\.\\.symbol\\.\\..*){2,2}"

if [regexp $want $got] then {
    pass "dlltool -p (import name)"
} else {
    fail "dlltool -p (import name)"
}
