#   Copyright (C) 1997, 1999, 2000, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

load_lib dg.exp
load_lib file-format.exp
load_lib target-supports.exp
load_lib target-supports-dg.exp
load_lib scanasm.exp
load_lib scantree.exp
load_lib prune.exp
load_lib libgloss.exp
load_lib target-libpath.exp

# We set LC_ALL and LANG to C so that we get the same error messages as expected.
setenv LC_ALL C
setenv LANG C

if ![info exists TORTURE_OPTIONS] {
    # 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 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 } ]
}

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
}

# Split TORTURE_OPTIONS into two choices: one for testcases with loops and
# one for testcases without loops.

set torture_with_loops $TORTURE_OPTIONS
set torture_without_loops ""
foreach option $TORTURE_OPTIONS {
    if ![string match "*loop*" $option] {
	lappend torture_without_loops $option
    }
}

# Define gcc callbacks for dg.exp.

proc gcc-dg-test-1 { target_compile prog do_what extra_tool_flags } {
    # Set up the compiler flags, based on what we're going to do.

    set options [list]

    # Tests should be able to use "dg-do repo".  However, the dg test
    # driver checks the argument to dg-do against a list of acceptable
    # options, and "repo" is not among them.  Therefore, we resort to
    # this ugly approach.
    if [string match "*-frepo*" $extra_tool_flags] then {
	set do_what "repo"
    }

    switch $do_what {
	"preprocess" {
	    set compile_type "preprocess"
	    set output_file "[file rootname [file tail $prog]].i"
	}
	"compile" {
	    set compile_type "assembly"
	    set output_file "[file rootname [file tail $prog]].s"
	}
	"assemble" {
	    set compile_type "object"
	    set output_file "[file rootname [file tail $prog]].o"
	}
	"precompile" {
	    set compile_type "precompiled_header"
	    set output_file "[file tail $prog].gch"
	}
	"link" {
	    set compile_type "executable"
	    set output_file "[file rootname [file tail $prog]].exe"
	    # The following line is needed for targets like the i960 where
	    # the default output file is b.out.  Sigh.
	}
	"repo" {
	    set compile_type "object"
	    set output_file "[file rootname [file tail $prog]].o"
	}
	"run" {
	    set compile_type "executable"
	    # FIXME: "./" is to cope with "." not being in $PATH.
	    # Should this be handled elsewhere?
	    # YES.
	    set output_file "./[file rootname [file tail $prog]].exe"
	    # This is the only place where we care if an executable was
	    # created or not.  If it was, dg.exp will try to run it.
	    remote_file build delete $output_file;
	}
	default {
	    perror "$do_what: not a valid dg-do keyword"
	    return ""
	}
    }

    if { $extra_tool_flags != "" } {
	lappend options "additional_flags=$extra_tool_flags"
    }

    set comp_output [$target_compile "$prog" "$output_file" "$compile_type" $options];

    if { $do_what == "repo" } {
	set object_file "$output_file"
	set output_file "[file rootname [file tail $prog]].exe"
	set comp_output \
	    [ concat $comp_output \
		  [$target_compile "$object_file" "$output_file" \
		       "executable" $options] ]
    }

    return [list $comp_output $output_file]
}

proc gcc-dg-test { prog do_what extra_tool_flags } {
    return [gcc-dg-test-1 gcc_target_compile $prog $do_what $extra_tool_flags]
}

proc gcc-dg-prune { system text } {
    global additional_prunes

    set text [prune_gcc_output $text]

    foreach p $additional_prunes {
	if { [string length $p] > 0 } {
	    # Following regexp matches a complete line containing $p.
	    regsub -all "(^|\n)\[^\n\]*$p\[^\n\]*" $text "" text
	}
    }

    # If we see "region xxx is full" then the testcase is too big for ram.
    # This is tricky to deal with in a large testsuite like c-torture so
    # deal with it here.  Just mark the testcase as unsupported.
    if [regexp "(^|\n)\[^\n\]*: region \[^\n\]* is full" $text] {
	# The format here is important.  See dg.exp.
	return "::unsupported::memory full"
    }

    return $text
}

# Utility routines.

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

# Modified dg-runtest that can cycle through a list of optimization options
# as c-torture does.
proc gcc-dg-runtest { testcases default-extra-flags } {
    global runtests

    foreach test $testcases {
	# If we're only testing specific files and this isn't one of
	# them, skip it.
	if ![runtest_file_p $runtests $test] {
	    continue
        }

	# 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 $test "for*("]+[search_for $test "while*("]] {
	    set option_list $torture_with_loops
	} else {
	    set option_list $torture_without_loops
	}

	set nshort [file tail [file dirname $test]]/[file tail $test]

	foreach flags $option_list {
	    verbose "Testing $nshort, $flags" 1
	    dg-test $test $flags ${default-extra-flags}
	}
    }
}

proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } {
    global srcdir subdir

    if ![info exists DEBUG_TORTURE_OPTIONS] {
	set DEBUG_TORTURE_OPTIONS ""
	foreach type {-gdwarf-2 -gstabs -gstabs+ -gxcoff -gxcoff+ -gcoff} {
	    set comp_output [$target_compile \
		    "$srcdir/$subdir/$trivial" "trivial.S" assembly \
		    "additional_flags=$type"]
	    if { ! [string match "*: target system does not support the * debug format*" \
		    $comp_output] } {
		foreach level {1 "" 3} {
		    lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}"]
		    foreach opt $opt_opts {
			lappend DEBUG_TORTURE_OPTIONS \
				[list "${type}${level}" "$opt" ]
		    }
		}
	    }
	}
    }

    verbose -log "Using options $DEBUG_TORTURE_OPTIONS"

    global runtests

    foreach test $testcases {
	# If we're only testing specific files and this isn't one of
	# them, skip it.
	if ![runtest_file_p $runtests $test] {
	    continue
	}

	set nshort [file tail [file dirname $test]]/[file tail $test]

	foreach flags $DEBUG_TORTURE_OPTIONS {
	    set doit 1
	    if { [string match {*/debug-[126].c} "$nshort"] \
		    && [string match "*1" [lindex "$flags" 0] ] } {
		set doit 0
	    }

    # High optimization can remove the variable whose existence is tested.
    # Dwarf debugging with commentary (-dA) preserves the symbol name in the
    # assembler output, but stabs debugging does not.
    # http://gcc.gnu.org/ml/gcc-regression/2003-04/msg00095.html
	    if { [string match {*/debug-[12].c} "$nshort"] \
		    && [string match "*O*" "$flags"] \
		    && ( [string match "*coff*" "$flags"] \
			 || [string match "*stabs*" "$flags"] ) } {
		set doit 0
	    }

	    if { $doit } {
		verbose -log "Testing $nshort, $flags" 1
		dg-test $test $flags ""
	    }
	}
    }
}

# Prune any messages matching ARGS[1] (a regexp) from test output.
proc dg-prune-output { args } {
    global additional_prunes

    if { [llength $args] != 2 } {
	error "[lindex $args 1]: need one argument"
	return
    }

    lappend additional_prunes [lindex $args 1]
}

# We need to make sure that additional_* are cleared out after every
# test.  It is not enough to clear them out *before* the next test run
# because gcc-target-compile gets run directly from some .exp files
# (outside of any test).  (Those uses should eventually be eliminated.)

# Because the DG framework doesn't provide a hook that is run at the
# end of a test, we must replace dg-test with a wrapper.

if { [info procs saved-dg-test] == [list] } {
    rename dg-test saved-dg-test

    proc dg-test { args } {
	global additional_files
	global additional_sources
	global additional_prunes
	global errorInfo
	global compiler_conditional_xfail_data

	if { [ catch { eval saved-dg-test $args } errmsg ] } {
	    set saved_info $errorInfo
	    set additional_files ""
	    set additional_sources ""
	    set additional_prunes ""
	    if [info exists compiler_conditional_xfail_data] {
		unset compiler_conditional_xfail_data
	    }
	    error $errmsg $saved_info
	}
	set additional_files ""
	set additional_sources ""
	set additional_prunes ""
	if [info exists compiler_conditional_xfail_data] {
	    unset compiler_conditional_xfail_data
	}
    }
}

set additional_prunes ""
