#   Copyright (C) 1997-2022 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]

    global expect_ice
    # 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.
    # "Error reporting routines re-entered" ICE says "Internal" rather than
    # "internal", so match that too.
    if [regexp -line -- {[Ii]nternal compiler error.*} $comp_output ice] {
	upvar 2 name name
	if { $expect_ice == 0 } {
	  fail "$name ($ice)"
	} else {
	  # We expected an ICE and we got it.
	  xfail "$name ($ice)"
	  # Prune the ICE from the output.
	  set comp_output [prune_ices $comp_output]
	}
    } elseif { $expect_ice == 1 } {
	upvar 2 name name
	# We expected an ICE but we didn't get it.
	xpass "$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
    }
    set var [lindex $args 1]
    set value [lindex $args 2]
    verbose "dg-set-target-env-var $var $value" 2
    lappend set_target_env_var [list $var $value]
}

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]
    verbose "dg-set-compiler-env-var $var $value" 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
    }
}

# Check if frontend has CTF support
proc gcc-dg-frontend-supports-ctf { target_compile trivial } {
    global srcdir subdir

    set comp_output [$target_compile \
	    "$srcdir/$subdir/$trivial" "trivial.S" assembly \
	    "additional_flags=-gctf"]
    if { ! [string match \
	    "*CTF debug info requested, but not supported for * frontend*" \
	    $comp_output] } {
	remove-build-file "trivial.S"
	return 1
    }
    return 0
}

# Check if the target system supports the debug format
proc gcc-dg-target-supports-debug-format { target_compile trivial type } {
    global srcdir subdir

    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"
	return 1
    }
    return 0
}

proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } {
    if ![info exists DEBUG_TORTURE_OPTIONS] {
	set DEBUG_TORTURE_OPTIONS ""
	foreach type {-gctf -gdwarf-2 -gstabs -gstabs+ -gxcoff -gxcoff+} {
	    if [expr [gcc-dg-target-supports-debug-format \
		      $target_compile $trivial $type]] {
		if { $type == "-gctf" } {
		    if [expr [gcc-dg-frontend-supports-ctf \
			      $target_compile $trivial]] {
			# At this time, running tests with various opt levels or
			# ctf debug info levels does not add value.
			lappend DEBUG_TORTURE_OPTIONS  [list "${type}"]
		    }
		    continue
		}
		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
	    }

	    # These tests check for information which is not emitted for CTF
	    # as CTF type information is emitted for entities at file and 
	    # global scope only.
	    if { ([string match {*/debug-[126].c} "$nshort"] \
		  || [string match {*/enum-[12].C} "$nshort"] ) \
		  && [string match "*ctf*" "$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 expect_ice
	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
	set expect_ice 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
	}

	initialize_prune_notes
    }

    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 useline [lindex $dgargs 0]

	# Resolve absolute line number.
	set line [get-absolute-line $useline [lindex $dgargs 4]]
	set dgargs [lreplace $dgargs 4 4 $line]

	if { $line != $useline } {
	    # Make sure that we get unique test names if different USELINEs
	    # refer to the same LINE.
	    set comment "[lindex $dgargs 2] at line $useline"
	    set dgargs [lreplace $dgargs 2 2 $comment]
	}
    }

    # 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-warning "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-warning "missed:" "$args"
}

# Look for messages with 'note: ' prefixes.
# In addition to standard compiler diagnostics ('DK_NOTE', 'inform' functions,
# "for additional details on an error message"),
# this also includes output from '-fopt-info' for 'MSG_NOTE':
# a general optimization info.
# By default, any *excess* notes are pruned, meaning their appearance doesn't
# trigger *excess errors*.  However, if 'dg-note' is used at least once in a
# testcase, they're not pruned and instead must *all* be handled explicitly.
# Thus, if looking for just single instances of messages with 'note: ' prefixes
# without caring for all of them, use 'dg-message "note: [...]"' instead of
# 'dg-note', or use 'dg-note' together with 'dg-prune-output "note: "'.

variable prune_notes

proc initialize_prune_notes { } {
    global prune_notes
    set prune_notes 1
}

initialize_prune_notes

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

    global prune_notes
    set prune_notes 0

    process-message saved-dg-warning "note:" "$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 ""
