# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This file was written by Janis Johnson, <janis187@us.ibm.com>


# Test interoperability of two compilers that follow the same ABI, or
# compatibility of two versions of GCC.
#
# Each test has a main program that does nothing but call a function,
# plus two additional source files that contain parts of a program that
# rely on the ABI.  those source files are compiled into relocatable
# object files with both compilers.  Executables are built using various
# combinations of those object files, with the main program compiled
# with the compiler under test and using that compiler's runtime support.

# The including .exp file must define these callback procedures.
if [string match "" [info procs "compat-use-alt-compiler"]] then {
    error "Proc compat-use-alt-compiler is not defined."
}
if [string match "" [info procs "compat-use-tst-compiler"]] then {
    error "Proc compat-use-tst-compiler is not defined."
}

# Each test is run with each pair of compiler options from this list.
# The first set of options in each pair is used by the compiler under
# test, and the second set is used by the alternate compiler.
# The default option lists can be overridden by
# COMPAT_OPTIONS="[list [list {tst_1} {alt_1}]...[list {tst_n} {alt_n}]]"
# where tst_i and alt_i are lists of options.  You can put this in the
# environment before site.exp is written or add it to site.exp directly.
if ![info exists COMPAT_OPTIONS] {
    set COMPAT_OPTIONS [list \
	[list {} {}]]
}

set option_list $COMPAT_OPTIONS

# Subsets of tests can be selectively disabled by members of this list:
#  - ATTRIBUTE: disable all tests using the __attribute__ extension,
#  - COMPLEX_INT: disable all tests using the complex integral types extension,
#  - VA: disable all tests using the variable number of arguments feature,
#  - ZERO_ARRAY: disable all tests using the zero-sized arrays extension.
# The default skip lists can be overriden by
# COMPAT_SKIPS="[list {skip_1}...{skip_n}]"
# where skip_i are skip identifiers.  You can put this in the environment
# before site.exp is written or add it to site.exp directly.
if ![info exists COMPAT_SKIPS] {
    set COMPAT_SKIPS [list {}]
}

set skip_list $COMPAT_SKIPS

load_lib dg.exp
load_lib gcc-dg.exp

#
# compat-obj -- compile to an object file
#
# SOURCE is the source file
# DEST is the object file
# OPTALL is the list of compiler options to use with all tests
# OPTFILE is the list of compiler options to use with this file
# OPTSTR is the options to print with test messages
# XFAILDATA is the xfail data to be passed to the compiler
#
proc compat-obj { source dest optall optfile optstr xfaildata } {
    global testcase
    global tool
    global compiler_conditional_xfail_data
    global skip_list

    # Add the skip specifiers.
    foreach skip $skip_list {
	if { ![string match $skip ""] } {
	    lappend optall "-DSKIP_$skip"
	}
    }

    # Set up the options for compiling this file.
    set options ""
    lappend options "additional_flags=$optfile $optall"

    set compiler_conditional_xfail_data $xfaildata
    set comp_output [${tool}_target_compile "$source" "$dest" object $options]
    ${tool}_check_compile "$testcase $dest compile" $optstr $dest $comp_output
}

# compat-run -- link and run an executable
#
# TESTNAME is the mixture of object files to link
# OBJLIST is the list of object files to link
# DEST is the name of the executable
# OPTALL is a list of compiler and linker options to use for all tests
# OPTFILE is a list of compiler and linker options to use for this test
# OPTSTR is the list of options to list in messages
#
proc compat-run { testname objlist dest optall optfile optstr } {
    global testcase
    global tool

    # Check that all of the objects were built successfully.
    foreach obj [split $objlist] {
	if ![file exists $obj] then {
	    unresolved "$testcase $testname link $optstr"
	    unresolved "$testcase $testname execute $optstr"
	    return
	}
    }

    # Set up the options for linking this test.
    set options ""
    lappend options "additional_flags=$optfile $optall"

    # Link the objects into an executable.
    set comp_output [${tool}_target_compile "$objlist" $dest executable \
		     "$options"]
    if ![${tool}_check_compile "$testcase $testname link" "" \
	 $dest $comp_output] then {
	unresolved "$testcase $testname execute $optstr"
	return
    }

    # Run the self-checking executable.
    if ![string match "*/*" $dest] then {
	set dest "./$dest"
    }
    set result [${tool}_load $dest "" ""]
    set status [lindex $result 0]
    if { $status == "pass" } then {
	remote_file build delete $dest
    }
    $status "$testcase $testname execute $optstr"
}

#
# compat-get-options-main -- get target requirements for a test and
# options for the primary source file and the test as a whole
#
# SRC is the full pathname of the primary source file.
#
proc compat-get-options-main { src } {
    # dg-options sets a variable called dg-extra-tool-flags.
    set dg-extra-tool-flags ""

    # dg-require-* sets dg-do-what.
    upvar dg-do-what dg-do-what 

    set tmp [dg-get-options $src]
    foreach op $tmp {
	set cmd [lindex $op 0]
	if { ![string compare "dg-options" $cmd] \
	     || [string match "dg-require-*" $cmd]  } {
	    set status [catch "$op" errmsg]
	    if { $status != 0 } {
		perror "src: $errmsg for \"$op\"\n"
		unresolved "$src: $errmsg for \"$op\""
		return
	    }
	} elseif { ![string compare "dg-xfail-if" $cmd] } {
	    warning "compat.exp does not support $cmd in primary source file"
	} else {
	    # Ignore unrecognized dg- commands, but warn about them.
	    warning "compat.exp does not support $cmd"
	}
    }

    # Return flags to use for compiling the primary source file and for
    # linking.
    return ${dg-extra-tool-flags}
}

#
# compat-get-options -- get special tool flags to use for a secondary
# source file
#
# SRC is the full pathname of the source file.
# The result is a list of options to use.
#
# This code is copied from proc dg-test in dg.exp from DejaGNU.
#
proc compat-get-options { src } {
    # dg-options sets a variable called dg-extra-tool-flags.
    set dg-extra-tool-flags ""

    # dg-xfail-if sets compiler_conditional_xfail_data.
    global compiler_conditional_xfail_data
    set compiler_conditional_xfail_data ""

    # dg-xfail-if needs access to dg-do-what.
    upvar dg-do-what dg-do-what 

    set tmp [dg-get-options $src]
    foreach op $tmp {
	set cmd [lindex $op 0]
	if { ![string compare "dg-options" $cmd] \
	     || ![string compare "dg-xfail-if" $cmd] } {
	    set status [catch "$op" errmsg]
	    if { $status != 0 } {
		perror "src: $errmsg for \"$op\"\n"
		unresolved "$src: $errmsg for \"$op\""
		return
	    }
	} elseif { [string match "dg-require-*" $cmd] } {
	    warning "compat.exp does not support $cmd in secondary source files"
	} else {
	    # Ignore unrecognized dg- commands, but warn about them.
	    warning "compat.exp does not support $cmd"
	}
    }

    return ${dg-extra-tool-flags}
}

#
# compat-execute -- compile with compatible compilers
#
# SRC1 is the full pathname of the main file of the testcase.
# SID identifies a test suite in the names of temporary files.
# USE_ALT is nonzero if we're using an alternate compiler as well as
#   the compiler under test.
#
proc compat-execute { src1 sid use_alt } {
    global srcdir tmpdir
    global option_list
    global tool
    global verbose
    global testcase
    global gluefile
    global compiler_conditional_xfail_data
    global dg-do-what-default

    # Get extra flags for this test from the primary source file, and
    # process other dg-* options that this suite supports.  Warn about
    # unsupported flags.
    verbose "compat-execute: $src1" 1
    set dg-do-what [list ${dg-do-what-default} "" P]
    set extra_flags_1 [compat-get-options-main $src1]

    # Check whether this test is supported for this target.
    if { [lindex ${dg-do-what} 1 ] == "N" } {
	unsupported "$src1"
	verbose "$src1 not supported on this target, skipping it" 3
	return
    }

    # Set up the names of the other source files.
    regsub "_main.*" $src1 "" base
    regsub ".*/" $base "" base
    regsub "_main" $src1 "_x" src2
    regsub "_main" $src1 "_y" src3

    # Use the dg-options mechanism to specify extra flags for this test. 
    # The extra flags in each file are used to compile that file, and the
    # extra flags in *_main.* are also used for linking.
    set extra_flags_2 [compat-get-options $src2]
    set compile_xfail_2 $compiler_conditional_xfail_data
    set extra_flags_3 [compat-get-options $src3]
    set compile_xfail_3 $compiler_conditional_xfail_data

    # Define the names of the object files.
    regsub "sid" "sid_main_tst.o" $sid obj1
    regsub "sid" "sid_x_tst.o" $sid obj2_tst
    regsub "sid" "sid_x_alt.o" $sid obj2_alt
    regsub "sid" "sid_y_tst.o" $sid obj3_tst
    regsub "sid" "sid_y_alt.o" $sid obj3_alt

    # Get the base name of this test, for use in messages.
    set testcase "$src1"
    # Remove the $srcdir and $tmpdir prefixes from $src1.  (It would
    # be possible to use "regsub" here, if we were careful to escape
    # all regular expression characters in $srcdir and $tmpdir, but
    # that would be more complicated that this approach.) 
    if {[string first "$srcdir/" "$src1"] == 0} {
	set testcase [string range "$src1" [string length "$srcdir/"] end]
    }
    if {[string first "$tmpdir/" "$testcase"] == 0} {
	set testcase [string range "$testcase" [string length "$tmpdir/"] end]
	set testcase "tmpdir-$testcase"
    }
    regsub "_main.*" $testcase "" testcase
    # Set up the base name of executable files so they'll be unique.
    regsub -all "\[./\]" $testcase "-" execbase

    # If we couldn't rip $srcdir out of `src1' then just do the best we can.
    # The point is to reduce the unnecessary noise in the logs.  Don't strip
    # out too much because different testcases with the same name can confuse
    # `test-tool'.
    if [string match "/*" $testcase] then {
        set testcase "[file tail [file dirname $src1]]/[file tail $src1]"
    }

    # Loop through all of the option lists used for this test.

    set count 0
    foreach option_pair $option_list {

	# Pick out each set of options.
	set tst_option [lindex $option_pair 0]
	set alt_option [lindex $option_pair 1]
	set optstr ""
	if { ![string match $tst_option ""] \
	     || ![string match $alt_option ""] } then {
	    set optstr "\"$tst_option\",\"$alt_option\""
	}
	verbose "Testing $testcase, $optstr" 1

	# There's a unique name for each executable we generate, based on
	# the set of options and how the pieces of the tests are compiled.
	set execname1 "${execbase}-${count}1"
	set execname2 "${execbase}-${count}2"
	set execname3 "${execbase}-${count}3"
	set execname4 "${execbase}-${count}4"
	incr count

	remote_file build delete $execname1
	remote_file build delete $execname2
	remote_file build delete $execname3
	remote_file build delete $execname4

	# Compile pieces with the alternate compiler; we'll catch problems
	# later.  Skip this if we don't have an alternate compiler.
	if { $use_alt != 0 } then {
	    compat-use-alt-compiler
	    compat-obj "$src2" "$obj2_alt" $alt_option $extra_flags_2 \
		       $optstr $compile_xfail_2
	    compat-obj "$src3" "$obj3_alt" $alt_option $extra_flags_3 \
		       $optstr $compile_xfail_3
	}

	# Compile pieces with the compiler under test.
	compat-use-tst-compiler
	compat-obj "$src1" "$obj1" $tst_option $extra_flags_1 $optstr ""
	compat-obj "$src2" "$obj2_tst" $tst_option $extra_flags_2 \
		   $optstr $compile_xfail_2
	compat-obj "$src3" "$obj3_tst" $tst_option $extra_flags_3 \
		   $optstr $compile_xfail_3

	# Link (using the compiler under test), run, and clean up tests.
	compat-run "${obj2_tst}-${obj3_tst}" \
	    "$obj1 $obj2_tst $obj3_tst" $execname1 \
	    $tst_option $extra_flags_1 $optstr

	# If we've got an alternate compiler try some combinations.
	if { $use_alt != 0 } then {
	    compat-run "${obj2_tst}-${obj3_alt}" "$obj1 $obj2_tst $obj3_alt" \
		       $execname2 $tst_option $extra_flags_1 $optstr
	    compat-run "${obj2_alt}-${obj3_tst}" "$obj1 $obj2_alt $obj3_tst" \
		       $execname3 $tst_option $extra_flags_1 $optstr
	    compat-run "${obj2_alt}-${obj3_alt}" "$obj1 $obj2_alt $obj3_alt" \
		       $execname4 $tst_option $extra_flags_1 $optstr
	}

	# Clean up object files.
	set files [glob -nocomplain ${sid}_*.o]
	if { $files != "" } {
	    foreach objfile $files {
		if { ![info exists gluefile] || $objfile != $gluefile } {
		    eval "remote_file build delete $objfile"
		}
	    }
	}
    }
}
