# Copyright (C) 2002, 2003, 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.
#
# This file was written by Jakub Jelinek, <jakub@redhat.com>
# Based on compat.exp writte by Janis Johnson, <janis187@us.ibm.com>


# Test interoperability of two compilers that follow the same ABI.
#
# Break simple tests into two pieces and see that they work when linked
# together.  If an alternate compiler is specified then the two main
# pieces of each test are compiled with different compilers.  The
# alternate compiler must be installed, and is specified by defining
# ALT_CC_UNDER_TEST in the environment.
#
# struct-layout-1 are generated structure layout interoperability tests,
# so a generator first needs to be compiled on host, run there and the
# generated tests then compiled on build and executed on target.

if $tracelevel then {
    strace $tracelevel
}

global GCC_UNDER_TEST
global compat_save_gcc_under_test
global compat_use_alt
global compat_same_alt
global compat_have_dfp

# Load procedures from common libraries. 
load_lib standard.exp
load_lib gcc.exp

# Load the language-dependent compabibility support procedures.
load_lib c-compat.exp

# Load the language-independent compabibility support procedures.
load_lib compat.exp

gcc_init

# Save variables for the C compiler under test, which each test will
# change a couple of times.  This must be done after calling gcc-init.
set compat_save_gcc_under_test $GCC_UNDER_TEST

# Define an identifier for use with this suite to avoid name conflicts
# with other compat tests running at the same time.
set sid "c_compat"

# Find out whether there is an alternate compiler to test.  If the
# variable is defined but is set to "same", that means we use the same
# compiler twice, which is meaningful if the two parts of COMPAT_OPTIONS
# are different.
set compat_use_alt 0
set compat_same_alt 0

if [info exists ALT_CC_UNDER_TEST] then {
    set compat_use_alt 1
    if [string match "same" $ALT_CC_UNDER_TEST] then {
	set compat_same_alt 1
    }
}

compat_setup_dfp

if { $compat_have_dfp == 0 } {
    set skip_dfp "-DSKIP_DECIMAL_FLOAT"
} else {
    set skip_dfp ""
}

set tstobjdir "$tmpdir/gcc.dg-struct-layout-1"
set generator "$tmpdir/gcc.dg-struct-layout-1_generate"

set generator_src "$srcdir/$subdir/struct-layout-1_generate.c"
set generator_src "$generator_src $srcdir/$subdir/generate-random.c"
set generator_src "$generator_src $srcdir/$subdir/generate-random_r.c"
set generator_cmd "-o $generator $skip_dfp $generator_src"

set status [remote_exec host "$HOSTCC $HOSTCFLAGS $generator_cmd"]
set status [lindex $status 0]
if { $status == 0 } then {
    file delete -force $tstobjdir
    file mkdir $tstobjdir
    set generator_args "-s $srcdir/$subdir -d $tstobjdir"
    if [info exists env(RUN_ALL_COMPAT_TESTS) ] then {
	set generator_args "$generator_args -n 15000"
    }
    if [check_effective_target_short_enums] then {
	set generator_args "-e $generator_args"
    }
    set status [remote_exec host "$generator $generator_args"]
    set status [lindex $status 0]
    if { $status == 0 } then {
	foreach src [lsort [find $tstobjdir *_main.c]] {
	    # If we're only testing specific files and this isn't one
	    # of them, skip it.
	    if ![runtest_file_p $runtests $src] then {
		continue
	    }

	    compat-execute $src $sid $compat_use_alt
	}
    } else {
	warning "Could not execute gcc.dg/compat/struct-layout-1 generator"
    }
} else {
    warning "Could not compile gcc.dg/compat/struct-layout-1 generator"
}

# Restore the original compiler under test.
compat-use-tst-compiler
