# Copyright (C) 1992-2021 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
load_lib target-utils.exp

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
}

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

set LTO_TORTURE_OPTIONS ""
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 -funroll-loops -fpeel-loops -ftracer -finline-functions } \
	{ -O3 -g } \
	{ -Os } \
	{ -Og -g } ]

    if [check_effective_target_lto] {
        # When having plugin test both slim and fat LTO and plugin/nonplugin
        # path.
        if [check_linker_plugin_available] {
          set LTO_TORTURE_OPTIONS [list \
    	      { -O2 -flto -fno-use-linker-plugin -flto-partition=none } \
	      { -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects }
          ]
        } else {
          set LTO_TORTURE_OPTIONS [list \
	      { -O2 -flto -flto-partition=none } \
	      { -O2 -flto }
          ]
        }
    }
}

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

#
# 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"
    }
}
