#   Copyright (C) 1997-2020 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/>.

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 scanrtl.exp
load_lib scantree.exp
load_lib scanltranstree.exp
load_lib scanipa.exp
load_lib scanwpaipa.exp
load_lib scanlang.exp
load_lib timeout.exp
load_lib timeout-dg.exp
load_lib prune.exp
load_lib libgloss.exp
load_lib target-libpath.exp
load_lib torture-options.exp
load_lib fortran-modules.exp
load_lib multiline.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

# Many hosts now default to a non-ASCII C locale, however, so
# they can set a charset encoding here if they need.
if { [ishost "*-*-cygwin*"] } {
  setenv LC_ALL C.ASCII
  setenv LANG C.ASCII
}

# Avoid sporadic data-losses with expect
match_max -d 10000

# Ensure GCC_COLORS is unset, for the rare testcases that verify
# how output is colorized.
if [info exists ::env(GCC_COLORS) ] {
    unsetenv GCC_COLORS
}

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

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

# Some torture-options cause intermediate code output, unusable for
# testing using e.g. scan-assembler.  In this variable are the options
# how to force it, when needed.
global gcc_force_conventional_output
set gcc_force_conventional_output ""

set LTO_TORTURE_OPTIONS ""
if [info exists TORTURE_OPTIONS] {
    set DG_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 DG_TORTURE_OPTIONS [list \
	{ -O0 } \
	{ -O1 } \
	{ -O2 } \
	{ -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions } \
	{ -O3 -g } \
	{ -Os } ]

    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 }
           ]
        }
        set gcc_force_conventional_output "-ffat-lto-objects"
    }
}

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

proc dg-final { args } {
    upvar dg-final-code final-code

    if { [llength $args] > 2 } {
	error "[lindex $args 0]: too many arguments"
    }
    set line [lindex $args 0]
    set code [lindex $args 1]
    set directive [lindex $code 0]
    switch $directive {
	gdb-test {
	    set code [linsert $code 1 $line]
	}
    }
    append final-code "$code\n"
}

global orig_environment_saved

# Deduce generated files from tool flags, return finalcode string
proc schedule-cleanups { opts } {
    global additional_sources
    set finalcode ""
    set testcases {}
    lappend testcases [lindex [testname-for-summary] 0]
    verbose "Cleanup testcases: $testcases" 4
    if { [info exists additional_sources] && $additional_sources != "" } {
	lappend testcases $additional_sources
	verbose "Cleanup testcases, additional: $additional_sources" 4
    }
    verbose "Cleanup all options: $opts" 4

    # First some fixups to transform stuff to something manageable ..
    # --dump= should translate to -d with joined operand.
    if [regexp -- {(^|\s+)--dump=[^\s]+(\s+|$)} $opts] {
	regsub -all -- {--dump=} $opts {-d} opts
    }
    # -da and -dx are treated as shorthand for -fdump-rtl-all here
    if [regexp -- {(^|\s+)-d[ax](\s+|$)} $opts] {
	verbose "Cleanup -d seen" 4
	lappend opts "-fdump-rtl-all"
    }
    # .. and don't question why there is --dump=? and -d?

    # Then handle options that generate non-dump files
    # TODO
    # -fprofile-generate -> cleanup-coverage-files()
    # -fstack-usage -> cleanup-stack-usage()
    if [regexp -- {(^|\s+)-fstack-usage(\s+|$)} $opts] {
	verbose "Cleanup -fstack-usage seen" 4
#	append finalcode "cleanup-stack-usage\n"
    }
    global keep_saved_temps_suffixes
    if [info exists keep_saved_temps_suffixes ] {
	verbose "dg-keep-saved-temps ${keep_saved_temps_suffixes}" 2
    }
    # -save-temps -> cleanup-saved-temps()
    if [regexp -- {(^|\s+)-save-temps(\s+|$)} $opts] {
	verbose "Cleanup -save-temps seen" 4
	if [info exists keep_saved_temps_suffixes] {
	    append finalcode "cleanup-saved-temps ${keep_saved_temps_suffixes}\n"
	} else {
	    append finalcode "cleanup-saved-temps\n"
	}
    } else {
	if [info exists keep_saved_temps_suffixes ] {
	    error "dg-keep-saved-temps specified but testcase does not -save-temps"
	    return
	}
    }
    # Finally see if there are any dumps in opts, otherwise we are done
    if [regexp -- {(?=(?:^|[ \t]+)?)-fdump-[^ \t]+(?=(?:$|[ \t]+)?)} $opts] {
        # Lang, Ipa, Rtl, Tree for simplicity
        set ptn "{l,i,r,t}"
    } else {
        return $finalcode
    }
    # stem.ext.<passnum><fam>.<passname><pass-instances>
    # (tree)passes can have multiple instances, thus optional trailing *
    set ptn "\[0-9\]\[0-9\]\[0-9\]$ptn.*"
    # Handle ltrans files around -flto
    if [regexp -- {(^|\s+)-flto(\s+|$)} $opts] {
	verbose "Cleanup -flto seen" 4
	set ltrans "{ltrans\[0-9\]*.,}"
    } else {
	set ltrans ""
    }
    set ptn "$ltrans$ptn"
    verbose "Cleanup final ptn: $ptn" 4
    set tfiles {}
    foreach src $testcases {
	set basename [file tail $src]
	if { $ltrans != "" } {
	    # ??? should we use upvar 1 output_file instead of this (dup ?)
	    set stem [file rootname $basename]
	    set basename_ext [file extension $basename]
	    if {$basename_ext != ""} {
		regsub -- {^.*\.} $basename_ext {} basename_ext
	    }
	    lappend tfiles "$stem.{$basename_ext,exe}"
	    unset basename_ext
	} else {
	    lappend tfiles $basename
	}
    }
    if { [llength $tfiles] > 1 } {
	set tfiles [join $tfiles ","]
	set tfiles "{$tfiles}"
    }
    verbose "Cleanup final testcases: $tfiles" 4
    # We have to quote the regex
    regsub -all {([][$^?+*()|\\{}])} "$tfiles.$ptn" {\\\1} ptn
    set final ""
    append final {remove-build-file }
    append final "\"$ptn\""
    verbose "Cleanup final: $final" 4
    append finalcode "$final\n"

    return $finalcode
}

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

    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.
	    catch { remote_file build delete $output_file }
	}
	default {
	    perror "$do_what: not a valid dg-do keyword"
	    return ""
	}
    }

    # Let { dg-final { action } } force options as returned by an
    # optional proc ${action}_required_options.
    upvar 2 dg-final-code finalcode
    foreach x [split $finalcode "\n"] {
	set finalcmd [lindex $x 0]
	if { [info procs ${finalcmd}_required_options] != "" } {
	    foreach req [${finalcmd}_required_options] {
		if { $req != ""
		     && [lsearch -exact $extra_tool_flags $req] == -1 } {
		    lappend extra_tool_flags $req
		}
	    }
	}
    }

    append finalcode [schedule-cleanups "$options $extra_tool_flags"]
    if { $extra_tool_flags != "" } {
	lappend options "additional_flags=$extra_tool_flags"
    }

    verbose "$target_compile $prog $output_file $compile_type $options" 4
    set comp_output [$target_compile "$prog" "$output_file" "$compile_type" $options]

    # Look for an internal compiler error, which sometimes masks the fact
    # that we didn't get an expected error message.  XFAIL an ICE via
    # dg-xfail-if and use { dg-prune-output ".*internal compiler error.*" }
    # to avoid a second failure for excess errors.
    if [string match "*internal compiler error*" $comp_output] {
	upvar 2 name name
	fail "$name (internal compiler error)"
    }

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

# Global: should blank lines be allowed in the output?
# By default, they should not be.  (PR other/69006)
# However, there are some ways for them to validly occur.
# If this variable is 0, blank lines are not allowed in output,
# if it is 1, they are allowed for a single testcase only and gcc-dg-prune
# will clear it again after checking it, if it is 2, they are disabled
# for all tests.
set allow_blank_lines 0

if { [check_effective_target_llvm_binutils] } {
    set allow_blank_lines 2
}

# A command for use by testcases to mark themselves as expecting
# blank lines in the output.

proc dg-allow-blank-lines-in-output { args } {
    global allow_blank_lines
    if { !$allow_blank_lines } {
	set allow_blank_lines 1
    }
}

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

    # Extra prune rules that will apply to tests defined in a .exp file.
    # Always remember to clear it in .exp file after executed all tests.
    global dg_runtest_extra_prunes

    # Complain about blank lines in the output (PR other/69006)
    global allow_blank_lines
    if { !$allow_blank_lines } {
	set num_blank_lines [llength [regexp -all -inline "\n\n" $text]]
	if { $num_blank_lines } {
	    global testname_with_flags
	    fail "$testname_with_flags $num_blank_lines blank line(s) in output"
	}
    }
    if { $allow_blank_lines == 1 } {
	set allow_blank_lines 0
    }

    set text [prune_gcc_output $text]

    foreach p "$additional_prunes $dg_runtest_extra_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"
    }

    if { [regexp "(^|\n)\[^\n\]*: relocation truncated to fit" $text]
          && [check_effective_target_tiny] } {
        return "::unsupported::memory full"
    }

    if [regexp "(^|\n)\[^\n\]* section.*will not fit in region" $text] {
	return "::unsupported::memory full"
    }

    if [regexp "(^|\n)\[^\n\]* region.*overflowed by" $text] {
	return "::unsupported::memory full"
    }

    if { [string match "*error: function pointers not supported*" $text]
	  && ![check_effective_target_function_pointers] } {
	# The format here is important.  See dg.exp.
	return "::unsupported::funcptr"
    }
    if { [string match "*error: large return values not supported*" $text]
    	  && ![check_effective_target_large_return_values] } {
	# The format here is important.  See dg.exp.
	return "::unsupported::large return values"
    }

    # If exceptions are disabled, mark tests expecting exceptions to be enabled
    # as unsupported.
    if { ![check_effective_target_exceptions_enabled] } {
	if [regexp "(^|\n)\[^\n\]*: error: exception handling disabled" $text] {
	    return "::unsupported::exception handling disabled"
	}

	if [regexp "(^|\n)\[^\n\]*: error: #error .__cpp_exceptions." $text] {
	    return "::unsupported::exception handling disabled"
	}
    }

    return $text
}

# Replace ${tool}_load with a wrapper to provide for an expected nonzero
# exit status.  Multiple languages include this file so this handles them
# all, not just gcc.
if { [info procs ${tool}_load] != [list] \
      && [info procs saved_${tool}_load] == [list] } {
    rename ${tool}_load saved_${tool}_load

    proc ${tool}_load { program args } {
	global tool
	global shouldfail
	global set_target_env_var

	set saved_target_env_var [list]
	if { [info exists set_target_env_var] \
	     && [llength $set_target_env_var] != 0 } {
	    if { [is_remote target] } {
		return [list "unsupported" ""]
	    }
	    set-target-env-var
	}
	set result [eval [list saved_${tool}_load $program] $args]
	if { [info exists set_target_env_var] \
	     && [llength $set_target_env_var] != 0 } {
	    restore-target-env-var
	}
	if { $shouldfail != 0 } {
	    switch [lindex $result 0] {
		"pass" { set status "fail" }
		"fail" { set status "pass" }
		default { set status [lindex $result 0] }
	    }
	    set result [list $status [lindex $result 1]]
	}

	set result [list [lindex $result 0] [prune_file_path [lindex $result 1]]]
	return $result
    }
}

proc dg-set-target-env-var { args } {
    global set_target_env_var
    if { [llength $args] != 3 } {
	error "dg-set-target-env-var: need two arguments"
	return
    }
    lappend set_target_env_var [list [lindex $args 1] [lindex $args 2]]
}

proc set-target-env-var { } {
    global set_target_env_var
    upvar 1 saved_target_env_var saved_target_env_var
    foreach env_var $set_target_env_var {
	set var [lindex $env_var 0]
	set value [lindex $env_var 1]
	if [info exists ::env($var)] {
	    lappend saved_target_env_var [list $var 1 $::env($var)]
	} else {
	    lappend saved_target_env_var [list $var 0]
	}
	setenv $var $value
    }
}

proc restore-target-env-var { } {
    upvar 1 saved_target_env_var saved_target_env_var
    for { set env_vari [llength $saved_target_env_var] } {
          [incr env_vari -1] >= 0 } {} {
	set env_var [lindex $saved_target_env_var $env_vari]
	set var [lindex $env_var 0]
	if [lindex $env_var 1] {
	    setenv $var [lindex $env_var 2]
	} else {
	    unsetenv $var
	}
    }
}

proc dg-set-compiler-env-var { args } {
    global set_compiler_env_var
    global saved_compiler_env_var
    if { [llength $args] != 3 } {
	error "dg-set-compiler-env-var: need two arguments"
	return
    }
    set var [lindex $args 1]
    set value [lindex $args 2]
    if [info exists ::env($var)] {
      lappend saved_compiler_env_var [list $var 1 $::env($var)]
    } else {
      lappend saved_compiler_env_var [list $var 0]
    }
    setenv $var $value
    lappend set_compiler_env_var [list $var $value]
}

proc restore-compiler-env-var { } {
    global saved_compiler_env_var
    for { set env_vari [llength $saved_compiler_env_var] } {
          [incr env_vari -1] >= 0 } {} {
	set env_var [lindex $saved_compiler_env_var $env_vari]
	set var [lindex $env_var 0]
	if [lindex $env_var 1] {
	    setenv $var [lindex $env_var 2]
	} else {
	    unsetenv $var
	}
    }
}

# 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 flags default-extra-flags } {
    global runtests

    # Some callers set torture options themselves; don't override those.
    set existing_torture_options [torture-options-exist]
    if { $existing_torture_options == 0 } {
	global DG_TORTURE_OPTIONS LTO_TORTURE_OPTIONS
	torture-init
	set-torture-options $DG_TORTURE_OPTIONS [list {}] $LTO_TORTURE_OPTIONS
    }
    dump-torture-options

    foreach test $testcases {
	global torture_with_loops torture_without_loops
	# 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.
	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_t $option_list {
	    global torture_current_flags
	    set torture_current_flags "$flags_t"
	    verbose "Testing $nshort, $flags $flags_t" 1
	    dg-test $test "$flags $flags_t" ${default-extra-flags}
	}
    }

    if { $existing_torture_options == 0 } {
	torture-finish
    }
}

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+} {
	    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] } {
		remove-build-file "trivial.S"
		foreach level {1 "" 3} {
		    if { ($type == "-gdwarf-2") && ($level != "") } {
			lappend DEBUG_TORTURE_OPTIONS [list "${type}" "-g${level}"]
			foreach opt $opt_opts {
			    lappend DEBUG_TORTURE_OPTIONS \
				    [list "${type}" "-g${level}" "$opt" ]
			}
		    } else {
			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

	    # These tests check for information which may be deliberately
	    # suppressed at -g1.
	    if { ([string match {*/debug-[126].c} "$nshort"] \
		   || [string match {*/enum-1.c} "$nshort"] \
		   || [string match {*/enum-[12].C} "$nshort"]) \
		    && ([string match "*1" [lindex "$flags" 0] ]
			|| [lindex "$flags" 1] == "-g1") } {
		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]
}

# Remove files matching the pattern from the build machine.
proc remove-build-file { pat } {
    verbose "remove-build-file `$pat'" 2
    set file_list "[glob -nocomplain $pat]"
    verbose "remove-build-file `$file_list'" 2
    foreach output_file $file_list {
	if [is_remote host] {
	    # Ensure the host knows the file is gone by deleting there
	    # first.
	    remote_file host delete $output_file
	}
	remote_file build delete $output_file
    }
}

# Remove runtime-generated profile file for the current test.
proc cleanup-profile-file { } {
    remove-build-file "mon.out"
    remove-build-file "gmon.out"
}

# Remove compiler-generated coverage files for the current test.
proc cleanup-coverage-files { } {
    global additional_sources_used
    set testcase [testname-for-summary]
    # The name might include a list of options; extract the file name.
    set testcase [lindex $testcase 0]
    remove-build-file "[file rootname [file tail $testcase]].gc??"

    # Clean up coverage files for additional source files.
    if [info exists additional_sources_used] {
	foreach srcfile $additional_sources_used {
	    remove-build-file "[file rootname [file tail $srcfile]].gc??"
	}
    }
}

# Remove a final insns dump file for the current test.
proc cleanup-final-insns-dump { } {
    set testcase [testname-for-summary]
    # The name might include a list of options; extract the file name.
    set testcase [lindex $testcase 0]
    remove-build-file "[file rootname [file tail $testcase]].s.gkd"

    # Clean up files for additional source files.
    if [info exists additional_sources_used] {
	foreach srcfile $additional_sources_used {
	    remove-build-file "[file rootname [file tail $srcfile]].s.gkd"
	}
    }
}

# Remove a stack usage file for the current test.
proc cleanup-stack-usage { } {
    set testcase [testname-for-summary]
    # The name might include a list of options; extract the file name.
    set testcase [lindex $testcase 0]
    remove-build-file "[file rootname [file tail $testcase]].su"

    # Clean up files for additional source files.
    if [info exists additional_sources_used] {
	foreach srcfile $additional_sources_used {
	    remove-build-file "[file rootname [file tail $srcfile]].su"
	}
    }
}

# Remove an Ada spec file for the current test.
proc cleanup-ada-spec { } {
    global additional_sources_used
    set testcase [testname-for-summary]
    remove-build-file "[get_ada_spec_filename $testcase]"

    # Clean up files for additional source files.
    if [info exists additional_sources_used] {
	foreach srcfile $additional_sources_used {
	    remove-build-file "[get_ada_spec_filename $srcfile]"
	}
    }
}

# Remove files kept by --save-temps for the current test.
#
# Currently this is only .i, .ii, .s and .o files, but more can be added
# if there are tests generating them.
# ARGS is a list of suffixes to NOT delete.
proc cleanup-saved-temps { args } {
    global additional_sources_used
    set suffixes {}

    # add the to-be-kept suffixes
    foreach suffix {".mii" ".ii" ".i" ".s" ".o" ".gkd" ".res" ".ltrans.out"} {
	if {[lsearch $args $suffix] < 0} {
	    lappend suffixes $suffix
	}
    }

    set testcase [testname-for-summary]
    # The name might include a list of options; extract the file name.
    set testcase [lindex $testcase 0]
    foreach suffix $suffixes {
	remove-build-file "[file rootname [file tail $testcase]]$suffix"
	remove-build-file "[file rootname [file tail $testcase]].exe$suffix"
	remove-build-file "[file rootname [file tail $testcase]].exe.ltrans\[0-9\]*$suffix"
	# -fcompare-debug dumps
	remove-build-file "[file rootname [file tail $testcase]].gk$suffix"
    }

    # Clean up saved temp files for additional source files.
    if [info exists additional_sources_used] {
	foreach srcfile $additional_sources_used {
	    foreach suffix $suffixes {
		remove-build-file "[file rootname [file tail $srcfile]]$suffix"
		remove-build-file "[file rootname [file tail $srcfile]].exe$suffix"
		remove-build-file "[file rootname [file tail $srcfile]].exe.ltrans\[0-9\]*$suffix"

		# -fcompare-debug dumps
		remove-build-file "[file rootname [file tail $srcfile]].gk$suffix"
	    }
	}
    }
}


# Files to be kept after cleanup of --save-temps for the current test.
# ARGS is a list of suffixes to NOT delete.
proc dg-keep-saved-temps { args } {
    global keep_saved_temps_suffixes
    set keep_saved_temps_suffixes {}

    # add the to-be-kept suffixes
    foreach suffix {".mii" ".ii" ".i" ".s" ".o" ".gkd" ".res" ".ltrans.out"} {
	if {[lsearch $args $suffix] >= 0} {
	    lappend keep_saved_temps_suffixes $suffix
	}
    }
    if { [llength keep_saved_temps_suffixes] < 1 } {
	error "dg-keep-saved-temps ${args} did not match any known suffix"
    }
}

# Scan Fortran modules for a given regexp.
#
# Argument 0 is the module name
# Argument 1 is the regexp to match
proc scan-module { args } {
    set modfilename [string tolower [lindex $args 0]].mod
    set fd [open [list | gzip -dc $modfilename] r]
    set text [read $fd]
    close $fd

    set testcase [testname-for-summary]
    if [regexp -- [lindex $args 1] $text] {
      pass "$testcase scan-module [lindex $args 1]"
    } else {
      fail "$testcase scan-module [lindex $args 1]"
    }
}

# Scan Fortran modules for absence of a given regexp.
#
# Argument 0 is the module name
# Argument 1 is the regexp to match
proc scan-module-absence { args } {
    set modfilename [string tolower [lindex $args 0]].mod
    set fd [open [list | gzip -dc $modfilename] r]
    set text [read $fd]
    close $fd

    set testcase [testname-for-summary]
    if [regexp -- [lindex $args 1] $text] {
      fail "$testcase scan-module [lindex $args 1]"
    } else {
      pass "$testcase scan-module [lindex $args 1]"
    }
}

# Verify that the compiler output file exists, invoked via dg-final.
proc output-exists { args } {
    # Process an optional target or xfail list.
    if { [llength $args] >= 1 } {
	switch [dg-process-target [lindex $args 0]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    set testcase [testname-for-summary]
    # Access variable from gcc-dg-test-1.
    upvar 2 output_file output_file

    if [file exists $output_file] {
	pass "$testcase output-exists $output_file"
    } else {
	fail "$testcase output-exists $output_file"
    }
}

# Verify that the compiler output file does not exist, invoked via dg-final.
proc output-exists-not { args } {
    # Process an optional target or xfail list.
    if { [llength $args] >= 1 } {
	switch [dg-process-target [lindex $args 0]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    set testcase [testname-for-summary]
    # Access variable from gcc-dg-test-1.
    upvar 2 output_file output_file

    if [file exists $output_file] {
	fail "$testcase output-exists-not $output_file"
    } else {
	pass "$testcase output-exists-not $output_file"
    }
}

# 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

    # Helper function for cleanups that should happen after the call
    # to the real dg-test, whether or not it returns normally, or
    # fails with an error.
    proc cleanup-after-saved-dg-test { } {
	global additional_files
	global additional_sources
	global additional_sources_used
	global additional_prunes
	global compiler_conditional_xfail_data
	global shouldfail
	global testname_with_flags
	global set_target_env_var
	global set_compiler_env_var
	global saved_compiler_env_var
	global keep_saved_temps_suffixes
	global nn_line_numbers_enabled
	global multiline_expected_outputs
	global freeform_regexps
	global save_linenr_varnames

	set additional_files ""
	set additional_sources ""
	set additional_sources_used ""
	set additional_prunes ""
	set shouldfail 0
	if [info exists set_target_env_var] {
	    unset set_target_env_var
	}
	if [info exists set_compiler_env_var] {
	    restore-compiler-env-var
	    unset set_compiler_env_var
	    unset saved_compiler_env_var
	}
	if [info exists keep_saved_temps_suffixes] {
	    unset keep_saved_temps_suffixes
	}
	unset_timeout_vars
	if [info exists compiler_conditional_xfail_data] {
	    unset compiler_conditional_xfail_data
	}
	if [info exists testname_with_flags] {
	    unset testname_with_flags
	}
	set nn_line_numbers_enabled 0
	set multiline_expected_outputs []
	set freeform_regexps []

	if { [info exists save_linenr_varnames] } {
	    foreach varname $save_linenr_varnames {
		# Cleanup varname
		eval global $varname
		eval unset $varname

		# Cleanup varname_used, or generate defined-but-not-used
		# warning.
		set varname_used used_$varname
		eval global $varname_used
		eval set used [info exists $varname_used]
		if { $used } {
		    eval unset $varname_used
		} else {
		    regsub {^saved_linenr_} $varname "" org_varname
		    warning "dg-line var $org_varname defined, but not used"
		}
	    }
	    unset save_linenr_varnames
	}
    }

    proc dg-test { args } {
	global errorInfo

	if { [ catch { eval saved-dg-test $args } errmsg ] } {
	    set saved_info $errorInfo
	    cleanup-after-saved-dg-test
	    error $errmsg $saved_info
	}
	cleanup-after-saved-dg-test
    }
}

if { [info procs saved-dg-warning] == [list] \
     && [info exists gcc_warning_prefix] } {
    rename dg-warning saved-dg-warning

    proc dg-warning { args } {
	# Make this variable available here and to the saved proc.
	upvar dg-messages dg-messages
	global gcc_warning_prefix

 	process-message saved-dg-warning "$gcc_warning_prefix" "$args"
    }
}

if { [info procs saved-dg-error] == [list] \
     && [info exists gcc_error_prefix] } {
    rename dg-error saved-dg-error

    proc dg-error { args } {
	# Make this variable available here and to the saved proc.
	upvar dg-messages dg-messages
	global gcc_error_prefix

	process-message saved-dg-error "$gcc_error_prefix" "$args"
    }

    # Override dg-bogus at the same time.  It doesn't handle a prefix
    # but its expression should include a column number.  Otherwise the
    # line number can match the column number for other messages, leading
    # to insanity.
    rename dg-bogus saved-dg-bogus

    proc dg-bogus { args } {
	upvar dg-messages dg-messages
	process-message saved-dg-bogus "" $args
    }
}

# Set variable VARNAME to LINENR

proc dg-line { linenr varname } {
    set org_varname $varname
    set varname "saved_linenr_$varname"
    eval global $varname

    # Generate defined-but-previously-defined error.
    eval set var_defined [info exists $varname]
    if { $var_defined } {
	eval set deflinenr \$$varname
	error "dg-line var $org_varname defined at line $linenr, but previously defined at line $deflinenr"
	return
    }

    eval set $varname $linenr

    # Schedule cleanup of varname by cleanup-after-saved-dg-test
    global save_linenr_varnames
    if { [info exists save_linenr_varnames] } {
	lappend save_linenr_varnames $varname
    } else {
	set save_linenr_varnames [list $varname]
    }
}

# Get the absolute line number corresponding to:
# - a relative line number (a non-null useline is required), or
# - a line number variable reference.
# Argument 0 is the line number on which line was used
# Argument 1 is the relative line number or line number variable reference
#
proc get-absolute-line { useline line } {
    if { "$line" == "." } {
	return $useline
    }

    if { [regsub "^\.\[+-\](\[0-9\]+)$" $line "\\1" num] && $useline != "" } {
	# Handle relative line specification, .+1 or .-1 etc.
	set num [expr $useline [string index $line 1] $num]
	return $num
    }

    if { ! [regsub "^(\[a-zA-Z\]\[a-zA-Z0-9_\]*)$" $line "\\1" varname] } {
	return $line
    }

    # Handle linenr variable defined by dg-line
    set org_varname $varname
    set varname "saved_linenr_$varname"
    eval global $varname

    # Generate used-but-not-defined error.
    eval set var_defined [info exists $varname]
    if { ! $var_defined } {
	if { "$useline" != "" } {
	    error "dg-line var $org_varname used at line $useline, but not defined"
	} else {
	    error "dg-line var $org_varname used, but not defined"
	}
	return
    }

    # Note that varname has been used.
    set varname_used "used_$varname"
    eval global $varname_used
    eval set $varname_used 1

    # Get line number from var and use it.
    eval set num \$$varname
    set line $num
}

# Modify the regular expression saved by a DejaGnu message directive to
# include a prefix and to force the expression to match a single line.
# MSGPROC is the procedure to call.
# MSGPREFIX is the prefix to prepend.
# DGARGS is the original argument list.

proc process-message { msgproc msgprefix dgargs } {
    upvar dg-messages dg-messages

    if { [llength $dgargs] == 5 } {
	set num [get-absolute-line [lindex $dgargs 0] [lindex $dgargs 4]]
	set dgargs [lreplace $dgargs 4 4 $num]
    }

    # Process the dg- directive, including adding the regular expression
    # to the new message entry in dg-messages.
    set msgcnt [llength ${dg-messages}]
    eval $msgproc $dgargs

    # If the target expression wasn't satisfied there is no new message.
    if { [llength ${dg-messages}] == $msgcnt } {
	return;
    }

    # Get the entry for the new message.  Prepend the message prefix to
    # the regular expression and make it match a single line.
    set newentry [lindex ${dg-messages} end]
    set expmsg [lindex $newentry 2]

    set column ""
    # Handle column numbers from the specified expression (if there is
    # one) and set up the search expression that will be used by DejaGnu.
    if [regexp {^-:} $expmsg] {
	# The expected column is -, so shouldn't appear.
	set expmsg [string range $expmsg 2 end]
    } elseif [regexp {^[0-9]+:} $expmsg column] {
	# The expression in the directive included a column number.
	# Remove it from the original expression and move it
	# to the proper place in the search expression.
	set expmsg [string range $expmsg [string length $column] end]
	set column "$column "
    } elseif [string match "" [lindex $newentry 0]] {
	# The specified line number is 0; don't expect a column number.
    } else {
	# There is no column number in the search expression, but we
	# should expect one in the message itself.
	set column {[0-9]+: }
    }
    set expmsg "$column$msgprefix\[^\n\]*$expmsg"
    set newentry [lreplace $newentry 2 2 $expmsg]

    set dg-messages [lreplace ${dg-messages} end end $newentry]
    verbose "process-message:\n${dg-messages}" 3
}

# Look for messages that don't have standard prefixes.

proc dg-message { args } {
    upvar dg-messages dg-messages
    process-message saved-dg-warning "" $args
}

# Look for a location marker of the form
#   file:line:column:
# with no extra text (e.g. a line-span separator).

proc dg-locus { args } {
    upvar dg-messages dg-messages

    # Process the dg- directive, including adding the regular expression
    # to the new message entry in dg-messages.
    set msgcnt [llength ${dg-messages}]
    eval saved-dg-warning $args

    # If the target expression wasn't satisfied there is no new message.
    if { [llength ${dg-messages}] == $msgcnt } {
	return;
    }

    # Get the entry for the new message.  Prepend the message prefix to
    # the regular expression and make it match a single line.
    set newentry [lindex ${dg-messages} end]
    set expmsg [lindex $newentry 2]

    set newentry [lreplace $newentry 2 2 $expmsg]
    set dg-messages [lreplace ${dg-messages} end end $newentry]
    verbose "process-message:\n${dg-messages}" 3
}

# Handle output from -fopt-info for MSG_OPTIMIZED_LOCATIONS:
# a successful optimization.

proc dg-optimized { args } {
    # Make this variable available here and to the saved proc.
    upvar dg-messages dg-messages

    process-message saved-dg-error "optimized: " "$args"
}

# Handle output from -fopt-info for MSG_MISSED_OPTIMIZATION:
# a missed optimization.

proc dg-missed { args } {
    # Make this variable available here and to the saved proc.
    upvar dg-messages dg-messages

    process-message saved-dg-error "missed: " "$args"
}

# Check the existence of a gdb in the path, and return true if there
# is one.
#
# Set env(GDB_FOR_GCC_TESTING) accordingly.

proc gdb-exists { args } {
    if ![info exists ::env(GDB_FOR_GCC_TESTING)] {
	global GDB
	if ![info exists ::env(GDB_FOR_GCC_TESTING)] {
	    if [info exists GDB] {
		setenv GDB_FOR_GCC_TESTING "$GDB"
	    } else {
		setenv GDB_FOR_GCC_TESTING "[transform gdb]"
	    }
	}
    }
    if { [which $::env(GDB_FOR_GCC_TESTING)] != 0 } {
	return 1;
    }
    return 0;
}

# Helper function for scan-symbol and scan-symbol-not. It scans a symbol in
# the final executable and return 1 if present, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 handles expected failures and the like
proc scan-symbol-common { scan_directive args } {
    global nm
    global base_dir

    # Access variable from gcc-dg-test-1 or lto-execute.
    upvar 3 output_file output_file

    if { [llength $args] >= 2 } {
	switch [dg-process-target [lindex $args 1]] {
	    "S" { }
	    "N" { return }
	    "F" { setup_xfail "*-*-*" }
	    "P" { }
	}
    }

    # Find nm like we find g++ in g++.exp.
    if ![info exists nm]  {
	set nm [findfile $base_dir/../../../binutils/nm \
		$base_dir/../../../binutils/nm \
	        [findfile $base_dir/../../nm $base_dir/../../nm \
		      [findfile $base_dir/nm $base_dir/nm \
		       [transform nm]]]]
	verbose -log "nm is $nm"
    }

    set output_file "[glob -nocomplain $output_file]"
    if { $output_file == "" } {
	fail "$scan_directive $args: output file does not exist"
	return
    }

    set fd [open "| $nm $output_file" r]
    set text [read $fd]
    close $fd

    if [regexp -- [lindex $args 0] $text] {
	return 1
    } else {
	return 0
    }
}

# Utility for scanning a symbol in the final executable, invoked via dg-final.
# Call pass if pattern is present, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 handles expected failures and the like
proc scan-symbol { args } {
    set testcase [testname-for-summary]
    if { [scan-symbol-common "scan-symbol" $args]} {
	pass "$testcase   scan-symbol $args"
    } else {
	fail "$testcase   scan-symbol $args"
    }
}

# Utility for scanning a symbol in the final executable, invoked via dg-final.
# Call pass if pattern is absent, otherwise fail.
#
# Argument 0 is the regexp to match.
# Argument 1 handles expected failures and the like
proc scan-symbol-not { args } {
    set testcase [testname-for-summary]
    if { [scan-symbol-common "scan-symbol-not" $args]} {
	fail "$testcase   scan-symbol-not $args"
    } else {
	pass "$testcase   scan-symbol-not $args"
    }
}

set additional_prunes ""
set dg_runtest_extra_prunes ""
