# Copyright 2002, 2004 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-*-*"]} {
    return
}

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