# Test that the linker can handle fastcall symbols correctly.
# Copyright 2002, 2006 Free Software Foundation, Inc.
#
# This file 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.

set testname "ld (fastcall symbols)"

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

if {  !([istarget "i*86-*-*pe*"] && ![istarget "i*86-*-opensd*"]) \
    && ![istarget "i*86-*-cygwin*"] \
    && ![istarget "x86_64-*-mingw*"] \
    && ![istarget "i*86-*-mingw*"] } {
    return
}

set ldflags ""

if ![ld_assemble $as $srcdir/$subdir/export.s tmpdir/export.o] {
    verbose "Unable to assemble test file!" 1
    unresolved $testname
    return
}

if ![ld_assemble $as $srcdir/$subdir/import.s tmpdir/import.o] {
    verbose "Unable to assemble test file!" 1
    unresolved $testname
    return
}

if ![ld_simple_link $ld tmpdir/extern.x "$ldflags tmpdir/export.o tmpdir/import.o"] {
    fail $testname
} else {
    pass $testname
}
