# Copyright (C) 1992-1998, 1999, 2000, 2007, 2008, 2010
# 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 3 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# This file was written by Rob Savoye. (rob@cygnus.com)

load_lib target-supports.exp
load_lib file-format.exp
load_lib target-libpath.exp

# The default option list can be overridden by
# TORTURE_OPTIONS="{ { list1 } ... { listN } }"

if [info exists TORTURE_OPTIONS] {
    set C_TORTURE_OPTIONS $TORTURE_OPTIONS
} else {
    # It is theoretically beneficial to group all of the O2/O3 options together,
    # as in many cases the compiler will generate identical executables for
    # all of them--and the c-torture testsuite will skip testing identical
    # executables multiple times.
    # Also note that -finline-functions is explicitly included in one of the
    # items below, even though -O3 is also specified, because some ports may
    # choose to disable inlining functions by default, even when optimizing.
    set C_TORTURE_OPTIONS [list \
	{ -O0 } \
	{ -O1 } \
	{ -O2 } \
	{ -O3 -fomit-frame-pointer } \
	{ -O3 -fomit-frame-pointer -funroll-loops } \
	{ -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions } \
	{ -O3 -g } \
	{ -Os } ]
}

if [info exists ADDITIONAL_TORTURE_OPTIONS] {
    set C_TORTURE_OPTIONS \
	[concat $C_TORTURE_OPTIONS $ADDITIONAL_TORTURE_OPTIONS]
}

global GCC_UNDER_TEST
if ![info exists GCC_UNDER_TEST] {
    set GCC_UNDER_TEST "[find_gcc]"
}

global orig_environment_saved

# This file may be sourced, so don't override environment settings
# that have been previously setup.
if { $orig_environment_saved == 0 } {
    append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST]
    set_ld_library_path_env_vars
}

#
# c-torture-compile -- runs the Tege C-torture test
#
# SRC is the full pathname of the testcase.
# OPTION is the specific compiler flag we're testing (eg: -O2).
#
proc c-torture-compile { src option } {
    global output
    global srcdir tmpdir
    global host_triplet

    set output "$tmpdir/[file tail [file rootname $src]].o"

    regsub "(?q)$srcdir/" $src "" testcase
    # If we couldn't rip $srcdir out of `src' 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] {
	set testcase "[file tail [file dirname $src]]/[file tail $src]"
    }

    verbose "Testing $testcase, $option" 1

    # Run the compiler and analyze the results.
    set options ""
    lappend options "additional_flags=-w $option"

    set comp_output [gcc_target_compile "$src" "$output" object $options]
    gcc_check_compile $testcase $option $output $comp_output
    file_on_host delete $output
}

#
# c-torture-execute -- utility to compile and execute a testcase
#
# SOURCES is a list of full pathnames to the test source files.
# The first filename in this list forms the "testcase".
#
# If the testcase has an associated .x file, we source that to run the
# test instead.  We use .x so that we don't lengthen the existing filename
# to more than 14 chars.
#
proc c-torture-execute { sources args } {
    global tmpdir tool srcdir output compiler_conditional_xfail_data

    # Use the first source filename given as the filename under test.
    set src [lindex $sources 0]

    if { [llength $args] > 0 } {
	set additional_flags [lindex $args 0]
    } else {
	set additional_flags ""
    }
    # Check for alternate driver.
    if [file exists [file rootname $src].x] {
	verbose "Using alternate driver [file rootname [file tail $src]].x" 2
	set done_p 0
	catch "set done_p \[source [file rootname $src].x\]"
	if { $done_p } {
	    return
	}
    }

    # Look for a loop within the source code - if we don't find one,
    # don't pass -funroll[-all]-loops.
    global torture_with_loops torture_without_loops
    if [expr [search_for $src "for*("]+[search_for $src "while*("]] then {
	set option_list $torture_with_loops
    } else {
	set option_list $torture_without_loops
    }

    set executable $tmpdir/[file tail [file rootname $src].x]

    regsub "(?q)$srcdir/" $src "" testcase
    # If we couldn't rip $srcdir out of `src' 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] {
	set testcase "[file tail [file dirname $src]]/[file tail $src]"
    }

    set count 0
    set oldstatus "foo"
    foreach option $option_list {
	if { $count > 0 } {
	    set oldexec $execname
	}
	set execname "${executable}${count}"
	incr count

	# torture_{compile,execute}_xfail are set by the .x script
	# (if present)
	if [info exists torture_compile_xfail] {
	    setup_xfail $torture_compile_xfail
	}

	# torture_execute_before_{compile,execute} can be set by the .x script
	# (if present)
	if [info exists torture_eval_before_compile] {
            set ignore_me [eval $torture_eval_before_compile]
	}

	file_on_host delete $execname
	verbose "Testing $testcase, $option" 1

	set options ""
	lappend options "additional_flags=-w $option"
	if { $additional_flags != "" } {
	    lappend options "additional_flags=$additional_flags"
	}
	set comp_output [gcc_target_compile "$sources" "${execname}" executable $options]

	if ![gcc_check_compile "$testcase compilation" $option $execname $comp_output] {
	    unresolved "$testcase execution, $option"
	    file_on_host delete $execname
	    continue
	}

	# See if this source file uses "long long" types, if it does, and
	# no_long_long is set, skip execution of the test.
	if [target_info exists no_long_long] then {
	    if [expr [search_for $src "long long"]] then {
		unsupported "$testcase execution, $option"
		continue
	    }
	}

	if [info exists torture_execute_xfail] {
	    setup_xfail $torture_execute_xfail
	}

	if [info exists torture_eval_before_execute] {
            set ignore_me [eval $torture_eval_before_execute]
	}


	# Sometimes we end up creating identical executables for two
	# consecutive sets of different of compiler options.
	#
	# In such cases we know the result of this test will be identical
	# to the result of the last test.
	#
	# So in cases where the time to load and run/simulate the test
	# is relatively high, compare the two binaries and avoid rerunning
	# tests if the executables are identical.
	#
	# Do not do this for native testing since the cost to load/execute
	# the test is fairly small and the comparison step actually slows
	# the entire process down because it usually does not "hit".
	set skip 0
	if { ![isnative] && [info exists oldexec] } {
	    if { [file_on_host cmp $oldexec $execname] == 0 } {
		set skip 1
	    }
	}
	if { $skip == 0 } {
	    set result [gcc_load "$execname" "" ""]
	    set status [lindex $result 0]
	    set output [lindex $result 1]
	}
        if { $oldstatus == "pass" } {
	    file_on_host delete $oldexec
        }
	$status "$testcase execution, $option"
	set oldstatus $status
    }
    if [info exists status] {
	if { $status == "pass" } {
	    file_on_host delete $execname
	}
    }
}

#
# search_for -- looks for a string match in a file
#
proc search_for { file pattern } {
    set fd [open $file r]
    while { [gets $fd cur_line]>=0 } {
	if [string match "*$pattern*" $cur_line] then {
	    close $fd
	    return 1
	}
    }
    close $fd
    return 0
}

#
# c-torture -- the c-torture testcase source file processor
#
# This runs compilation only tests (no execute tests).
# SRC is the full pathname of the testcase, or just a file name in which case
# we prepend $srcdir/$subdir.
#
# If the testcase has an associated .x file, we source that to run the
# test instead.  We use .x so that we don't lengthen the existing filename
# to more than 14 chars.
#
proc c-torture { args } {
    global srcdir subdir compiler_conditional_xfail_data

    set src [lindex $args 0]
    if { [llength $args] > 1 } {
	set options [lindex $args 1]
    } else {
	set options ""
    }

    # Prepend $srdir/$subdir if missing.
    if ![string match "*/*" $src] {
	set src "$srcdir/$subdir/$src"
    }

    # Check for alternate driver.
    if [file exists [file rootname $src].x] {
	verbose "Using alternate driver [file rootname [file tail $src]].x" 2
	set done_p 0
	catch "set done_p \[source [file rootname $src].x\]"
	if { $done_p } {
	    return
	}
    }

    # Look for a loop within the source code - if we don't find one,
    # don't pass -funroll[-all]-loops.
    global torture_with_loops torture_without_loops
    if [expr [search_for $src "for*("]+[search_for $src "while*("]] then {
	set option_list $torture_with_loops
    } else {
	set option_list $torture_without_loops
    }

    # loop through all the options
    foreach option $option_list {
	# torture_compile_xfail is set by the .x script (if present)
	if [info exists torture_compile_xfail] {
	    setup_xfail $torture_compile_xfail
	}

	# torture_execute_before_compile is set by the .x script (if present)
	if [info exists torture_eval_before_compile] {
            set ignore_me [eval $torture_eval_before_compile]
	}

	c-torture-compile $src "$option $options"
    }
}
