# Copyright (C) 2002, 2003, 2004, 2005 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_CXX_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 GXX_UNDER_TEST
global ld_library_path

# Load procedures from common libraries. 
load_lib standard.exp
load_lib g++.exp
load_lib target-libpath.exp

#
# compat-use-alt-compiler -- make the alternate compiler the default
# 
proc compat-use-alt-compiler { } {
    global GXX_UNDER_TEST ALT_CXX_UNDER_TEST
    global CXXFLAGS
    global ALWAYS_CXXFLAGS
    global ld_library_path alt_ld_library_path
    global same_alt

    # We don't need to do this if the alternate compiler is actually
    # the same as the compiler under test.
    if { $same_alt == 0 } then {
	set GXX_UNDER_TEST $ALT_CXX_UNDER_TEST
	set CXXFLAGS ""
	set ALWAYS_CXXFLAGS ""
	set ld_library_path $alt_ld_library_path
	set_ld_library_path_env_vars
    }
}

#
# compat-use-tst-compiler -- make compiler under test the default
#
proc compat-use-tst-compiler { } {
    global GXX_UNDER_TEST save_gxx_under_test
    global CXXFLAGS save_cxxflags
    global ALWAYS_CXXFLAGS save_always_cxxflags
    global ld_library_path save_ld_library_path
    global same_alt

    # We don't need to do this if the alternate compiler is actually
    # the same as the compiler under test.

    if { $same_alt == 0 } then {
	set GXX_UNDER_TEST $save_gxx_under_test
	set CXXFLAGS $save_cxxflags
	set ALWAYS_CXXFLAGS $save_always_cxxflags
	set ld_library_path $save_ld_library_path
	set_ld_library_path_env_vars
    }
}

# Load the language-independent compabibility support procedures.
# This must be done after the compat-use-*-compiler definitions.
load_lib compat.exp

g++_init

# Save variables for the C++ compiler under test, which each test will
# change a couple of times.  This must be done after calling g++-init.
set save_gxx_under_test $GXX_UNDER_TEST
set save_cxxflags $CXXFLAGS
set save_always_cxxflags $ALWAYS_CXXFLAGS
set save_ld_library_path $ld_library_path

# Define an identifier for use with this suite to avoid name conflicts
# with other compat tests running at the same time.
set sid "cp_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 use_alt 0
set same_alt 0
set alt_ld_library_path "."
if [info exists ALT_CXX_UNDER_TEST] then {
    set use_alt 1
    if [string match "same" $ALT_CXX_UNDER_TEST] then {
	set same_alt 1
    } else {
	if [info exists ALT_LD_LIBRARY_PATH] then {
	    append alt_ld_library_path ":${ALT_LD_LIBRARY_PATH}"
	}
    }
}

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

set generator_src "$srcdir/$subdir/struct-layout-1_generate.c"
set generator_src "$generator_src $srcdir/$subdir/../../gcc.dg/compat/generate-random.c"
set generator_src "$generator_src $srcdir/$subdir/../../gcc.dg/compat/generate-random_r.c"
set generator_cmd "-o $generator $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 $use_alt
	}
    } else {
	warning "Could not execute g++.dg/compat/struct-layout-1 generator"
    }
} else {
    warning "Could not compile g++.dg/compat/struct-layout-1 generator"
}

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