# Copyright (C) 2006-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 gcc-dg.exp

# Remove VALUE from LIST_VARIABLE.
proc lremove {list_variable value} {
    upvar 1 $list_variable var
    set idx [lsearch -exact $var $value]
    set var [lreplace $var $idx $idx]
}

# Define gcc callbacks for dg.exp.

proc gnat-dg-test { prog do_what extra_tool_flags } {
    if { $do_what == "compile" } {
	lappend extra_tool_flags "-c"
	lappend extra_tool_flags "-u"
    }
    set result [gcc-dg-test-1 gnat_target_compile $prog $do_what $extra_tool_flags]

    # Remove additional output files apart from $output_file, which may be
    # needed by dg-final.
    set output_file [lindex $result 1]
    set basename [file rootname $output_file]
    set clean_result [remote_exec host [find_gnatclean] "-c -q -n $basename"]
    if { [lindex $clean_result 0] != -1 } {
	set clean_files [lindex $clean_result 1]
	# Purge NL from clean_files.
	regsub -all "\[\r\n\]+" $clean_files " " clean_files
	# Remove ./ so lremove works.
	regsub -all "\./" $clean_files "" clean_files
	lremove clean_files $output_file
	eval remote_file host delete $clean_files
    }

    return $result
}

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

    lappend additional_prunes "gnatmake"
    lappend additional_prunes "compilation abandoned"
    lappend additional_prunes "fatal error: maximum errors reached"
    lappend additional_prunes "linker input file"

    return [gcc-dg-prune $system $text]
}

# Utility routines.

#
# gnat_load -- wrapper around default gnat_load to declare tasking tests
# unsupported on platforms that lack such support
#

if { [info procs gnat_load] != [list] \
      && [info procs prev_gnat_load] == [list] } {
    rename gnat_load prev_gnat_load

    proc gnat_load { program args } {
	upvar name testcase

	set result [eval [list prev_gnat_load $program] $args]
	set output [lindex $result 1]
	if { [regexp "tasking not implemented" $output] } {
	    return [list "unsupported" $output]
	}
	return $result
    }
}

# Local Variables:
# tcl-indent-level:4
# End:
