# Copyright 2002, 2004, 2006, 2007, 2009 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 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.

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

if {![istarget "i*86-*-*pe*"] \
    && ![istarget "i*86-*-cygwin*"] \
    && ![istarget "i*86-*-mingw32*"] \
    && ![istarget "x86_64-*-mingw*"] } {
    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)"
}
