# APPLE LOCAL file x86_64
# Copyright (C) 1988, 90-96, 1997, 2000, 2001, 2002 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.

# This file used to be gcc.c-torture/special/special.exp, which
# was written by Rob Savoye. (rob@cygnus.com)
# All the other tests driven by that file have since been moved elsewhere.

if [isnative] then {
    set lines [gcc_target_compile "$srcdir/$subdir/linkage-x.c" "linkage-x.o" object {additional_flags="-w"}]
    if ![string match "" $lines] then {
	fail "$subdir/linkage.c compile"
    } else {
	# This is a completely bogus test. Sorry.

	# Need to ensure ABI for native compiler matches gcc
	set native_cflags ""
	if  [istarget "mips-sgi-irix6*"] {
	    set file_string [exec file "linkage-x.o"]
	    if [ string match "*64*" $file_string ] {
		set native_cflags "-64"
	    }
	    if [ string match "*ELF 32*" $file_string ] {
		set native_cflags "-32"
	    }
	    if [ string match "*N32*" $file_string ] {
		set native_cflags "-n32"
	    }
	}
	if  [istarget "mips-sgi-iris6*o32" ] {
	    set native_cflags "-32"
	}
	if  [istarget "sparc*-sun-solaris2*"] {
	    set file_string [exec file "linkage-x.o"]
	    if [ string match "*64*" $file_string ] {
		set native_cflags "-xarch=v9"
	    }
	}
	if [istarget "s390*-*-linux*"] {
	    set file_string [exec file "linkage-x.o"]
	    if [ string match "*32-bit*" $file_string ] {
		set native_cflags "-m31"
	    }
	    if [ string match "*64-bit*" $file_string ] {
		set native_cflags "-m64"
	    }
	} elseif [istarget "x86_64-*-linux*"] {
	    set file_string [exec file "linkage-x.o"]
	    if [ string match "*32-bit*" $file_string ] {
		set native_cflags "-m32"
	    }
	} elseif [istarget "*-hp-hpux*"] {
	    set file_string [exec file "linkage-x.o"]
	    if [ string match "*ELF-64*" $file_string ] {
		set native_cflags "+DD64"
	    }
	} elseif [istarget "powerpc*-*-linux*"] {
	    set file_string [exec file "linkage-x.o"]
	    if [ string match "*64-bit*" $file_string ] {
		set native_cflags "-m64"
	    } elseif [ string match "*32-bit*" $file_string ] {
		set native_cflags "-m32"
	    }
        } elseif [istarget "*-*-darwin*"] {
            set file_string [exec file "linkage-x.o"]
            if [ string match "*64-bit*" $file_string ] {
                set native_cflags "-m64"
            } elseif [ string match "*32-bit*" $file_string ] {
                set native_cflags "-m32"
            }
        }

	if [file exists "linkage-y.o"] then {
	    file delete "linkage-y.o"
	}
	send_log "cc -c $native_cflags $srcdir/$subdir/linkage-y.c >&/dev/null\n"
	catch { exec cc -c $native_cflags "$srcdir/$subdir/linkage-y.c" >&/dev/null }
	if ![file exists "linkage-y.o"] then {
	    send_log "c89 -c $native_cflags $srcdir/$subdir/linkage-y.c >&/dev/null\n"
	    catch { exec c89 -c $native_cflags "$srcdir/$subdir/linkage-y.c" >&/dev/null }
	}
	if [file exists "linkage-y.o"] then {
	    set lines [gcc_target_compile "linkage-y.o linkage-x.o" "linkage.exe" executable ""]
	    if [string match "" $lines] then {
		pass "$subdir/linkage.c link"
		file delete "linkage.exe"
	    } else {
		fail "$subdir/linkage.c link"
	    }
	    file delete "linkage-y.o"
	} else {
	    unsupported "$subdir/linkage.c native compile failed"
	}
	file delete "linkage-x.o"
    }
}
