# libstdc++ "tool init file" for DejaGNU

# Copyright (C) 2001-2025 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 this program; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.


# Define callbacks and load other libraries.  This file is loaded relatively
# early, and before any other file we write ourselves.  "load_lib" will
# find anything in the DejaGNU installation tree, or in our lib directory.
# "load_gcc_lib" will search the core compiler's .exp collection instead.
#
# The naming rule is that dg.exp looks for "tool-" and runtest.exp looks
# for "tool_" when finding callbacks.  Utility routines we define for
# our callbacks begin with "v3-".
#
# libstdc++_* callbacks we don't define, but could:
# ..._option_help           prints additional --help output
# ..._option_proc (--foo)   process our own options
# ..._init (normal.exp)     called once per test file
# ..._finish                bracketing function for libstdc++_init
# ...-dg-prune              removing output text, see top of system dg.exp
#
# Useful hook:  if ${hostname}_init exists, it will be called, almost
# the last thing before testing begins.  This can be defined in, e.g.,
# ~/.dejagnurc or $DEJAGNU.

proc load_gcc_lib { filename } {
    global srcdir loaded_libs

    load_file $srcdir/../../gcc/testsuite/lib/$filename
    set loaded_libs($filename) ""
}

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

# system routines
load_lib dg.exp
load_lib libgloss.exp
# compiler routines, then ours
load_gcc_lib target-supports.exp
load_gcc_lib target-supports-dg.exp
load_lib prune.exp
load_lib dg-options.exp
load_gcc_lib scanasm.exp
load_gcc_lib target-libpath.exp
load_gcc_lib timeout.exp
load_gcc_lib timeout-dg.exp
load_gcc_lib wrapper.exp
load_gcc_lib target-utils.exp
load_gcc_lib dg-test-cleanup.exp

# Useful for debugging.  Pass the name of a variable and the verbosity
# threshold (number of -v's on the command line).
proc v3track { var n } {
    upvar $var val
    verbose "++ $var is $val" $n
}

# Copy file to the target.
proc v3-copy-file {src dst} {
    if { [catch { set symlink [file readlink $src] } x] } then {
	remote_download target $src $dst
    } else {
	if { [regexp "^/" "$symlink"] } then {
	    remote_download target $symlink $dst
	} else {
	    set dirname [file dirname $f]
	    remote_download target $dirname/$symlink $dst
	}
    }
}

# Called by v3-init below.  "Static" to this file.
proc v3-copy-files {srcfiles} {
    foreach f $srcfiles {
	v3-copy-file $f [file tail $f]
    }
}

# Called once, during runtest.exp setup.
proc libstdc++_init { testfile } {
    global env
    global v3-sharedlib v3-libgomp
    global srcdir blddir objdir tool_root_dir
    global cc cxx cxxflags cxxpchflags cxxldflags cxxvtvflags
    global includes
    global gluefile wrap_flags
    global ld_library_path
    global target_triplet
    global flags_file
    global tool_timeout
    global DEFAULT_CXXFLAGS
    global STATIC_LIBCXXFLAGS

    # 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

    # LANGUAGE changes the behavior of GNU gettext(3) and causes
    # std::messages tests to fail.
    array unset env LANGUAGE

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

    set blddir [lookfor_file [get_multilibs] libstdc++-v3]
    set flags_file "${blddir}/scripts/testsuite_flags"
    set shlib_ext [get_shlib_extension]
    v3track flags_file 2

    # If a test doesn't have special options, use DEFAULT_CXXFLAGS.
    # Use this variable if the behavior
    #   1) only applies to libstdc++ testing
    #   2) might need to be negated
    # In particular, some tests have to be run without precompiled
    # headers, or without assertions.

    if ![info exists DEFAULT_CXXFLAGS] then {
	set DEFAULT_CXXFLAGS ""
	# Host specific goo here.
	if { [string match "powerpc-ibm-aix*" $target_triplet] } {
	    append DEFAULT_CXXFLAGS " -Wl,-bmaxdata:0x20000000"
	}
    }
    v3track DEFAULT_CXXFLAGS 2

    # By default, we assume we want to run program images.
    global dg-do-what-default
    set dg-do-what-default run

    set ld_library_path_tmp ""

    # Locate libgcc.a so we don't need to account for different values of
    # SHLIB_EXT on different platforms
    set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
    if {$gccdir != ""} {
	set gccdir [file dirname $gccdir]
	append ld_library_path_tmp ":${gccdir}"
    }
    v3track gccdir 3

    # Locate libatomic.
    set v3-libatomic 0
    set libatomicdir [lookfor_file $blddir/../libatomic .libs/libatomic.$shlib_ext]
    if {$libatomicdir != ""} {
	set v3-libatomic 1
	set libatomicdir [file dirname $libatomicdir]
	append ld_library_path_tmp ":${libatomicdir}"
	verbose -log "libatomic support detected"
    }
    v3track libatomicdir 3

    # Locate libgomp. This is only required for parallel mode.
    set v3-libgomp 0
    set libgompdir [lookfor_file $blddir/../libgomp .libs/libgomp.$shlib_ext]
    if {$libgompdir != ""} {
	set v3-libgomp 1
	set libgompdir [file dirname $libgompdir]
	append ld_library_path_tmp ":${libgompdir}"
	verbose -log "libgomp support detected"
    }
    v3track libgompdir 3

    # Locate libvtv. This is only required for --enable-vtable-verify.
    set v3-libvtv 0
    set libvtvdir [lookfor_file $blddir/../libvtv .libs/libvtv.$shlib_ext]
    if {$libvtvdir != ""} {
	set v3-libvtv 1
	set libvtvdir [file dirname $libvtvdir]
	append ld_library_path_tmp ":${libvtvdir}"
	verbose -log "libvtv support detected"
    }
    v3track libvtvdir 3

    # Locate libstdc++ shared library. (ie libstdc++.so.)
    set v3-sharedlib 0
    set sharedlibdir [lookfor_file $blddir src/.libs/libstdc++.$shlib_ext]
    if {$sharedlibdir != ""} {
	if { ([string match "*-*-gnu*" $target_triplet]
	      || [string match "*-*-linux*" $target_triplet]
	      || [string match "*-*-solaris*" $target_triplet])
	     && [isnative] } then {
	    set v3-sharedlib 1
	    verbose -log "shared library support detected"
	}
    }
    v3track v3-sharedlib 3

    set STATIC_LIBCXXFLAGS ""
    set staticlibdir [lookfor_file $blddir src/.libs/libstdc++.a]
    if {$staticlibdir != ""} {
	set staticlibdir [file dirname $staticlibdir]
	# Some targets use libstdc++.a%s in their specs, so they need a
	# -B option for uninstalled testing.
	set STATIC_LIBCXXFLAGS " -B${staticlibdir} "
    }

    # Compute what needs to be added to the existing LD_LIBRARY_PATH.
    if {$gccdir != ""} {
	set compiler ${gccdir}/xg++
	set ld_library_path ${ld_library_path_tmp}
	append ld_library_path ":${blddir}/src/.libs"

	if { [is_remote host] == 0 && [which $compiler] != 0 } {
	  foreach i "[exec $compiler --print-multi-lib]" {
	    set mldir ""
	    regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
	    set mldir [string trimright $mldir "\;@"]
	    if { "$mldir" == "." } {
	      continue
	    }
	    if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
	      append ld_library_path ":${gccdir}/${mldir}"
	    }
	  }
	}

	set_ld_library_path_env_vars
	if [info exists env(LD_LIBRARY_PATH)] {
	  verbose -log "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)"
	}
    } else {
	set compiler [transform "g++"]
    }

    # Set the default timeout for v3 tests.
    # You can override this in ~/.dejagnurc or a .exp file named by $DEJAGNU.
    if {![info exists tool_timeout]} {
      set tool_timeout 360
    }

    # Default settings.
    set cxx [transform "g++"]
    set cxxflags "-fmessage-length=0 -fno-show-column"
    set cxxpchflags ""
    set cxxvtvflags ""
    set cxxldflags ""
    set cc [transform "gcc"]
    # Locate testsuite_hooks.h and other testsuite headers.
    set includes "-I${srcdir}/util"
    # Adapt the defaults for special circumstances.
    if [is_remote host] {
	# A remote host does not, in general, have access to the
	# $srcdir so we copy the testsuite headers into the current
	# directory, and then add that to the search path.
	foreach src [glob "${srcdir}/util/*.h" \
			  "${srcdir}/util/*.cc" \
			  "${srcdir}/util/*.tcc" \
			  "${srcdir}/util/*.hpp" \
			  "${srcdir}/util/*/*.h" \
			  "${srcdir}/util/*/*.cc" \
			  "${srcdir}/util/*/*.tcc" \
			  "${srcdir}/util/*/*.hpp" \
			  "${srcdir}/util/*/*/*.h" \
			  "${srcdir}/util/*/*/*.cc" \
			  "${srcdir}/util/*/*/*.tcc" \
			  "${srcdir}/util/*/*/*.hpp" \
			  "${srcdir}/util/*/*/*/*.h" \
			  "${srcdir}/util/*/*/*/*.cc" \
			  "${srcdir}/util/*/*/*/*.tcc" \
			  "${srcdir}/util/*/*/*/*.hpp" \
			  "${srcdir}/util/*/*/*/*/*.h" \
			  "${srcdir}/util/*/*/*/*/*.cc" \
			  "${srcdir}/util/*/*/*/*/*.tcc" \
			  "${srcdir}/util/*/*/*/*/*.hpp" ] {
	    # Remove everything up to "util/..."
	    set dst [string range $src [string length "${srcdir}/"] end]
	    # Create the directory containing the file.
	    set dir [file dirname $dst]
	    remote_exec host "mkdir" [list "-p" "$dir"]
	    # Download the file.
	    set result [remote_download host $src $dst]
	    if { $result == "" } {
		verbose -log "Unable to download ${srcdir}/${src} to host."
		return "untested"
	    }
	}
	set includes "-Iutil"
    } elseif { [file exists $flags_file] } {
	# If we find a testsuite_flags file, we're testing in the build dir.
	set cxx [exec sh $flags_file --build-cxx]
	set cxxflags [exec sh $flags_file --cxxflags]
	set cxxpchflags [exec sh $flags_file --cxxpchflags]
	set cxxvtvflags [exec sh $flags_file --cxxvtvflags]
	set cxxldflags [exec sh $flags_file --cxxldflags]
	set cc [exec sh $flags_file --build-cc]
	set includes [exec sh $flags_file --build-includes]
    }
    append cxxflags " "
    append cxxflags [getenv CXXFLAGS]

    if ![regexp ".*-O" $cxxflags] {
	append cxxflags " -g -O2"
    }

    v3track cxxflags 2

    # Should be as good as -fdiagnostics-color=never, but more compatible
    setenv GCC_COLORS ""
    # Always use MO files built by this test harness.
    set ccflags "$cxxflags -DLOCALEDIR=\".\""
    set cxxflags "$cxxflags -DLOCALEDIR=\".\""

    # If a PCH file is available, use it.  We must delay performing
    # this check until $cxx and such have been initialized because we
    # perform a test compilation.  (Ideally, gcc --print-file-name would
    # list PCH files, but it does not.)
    if { $cxxpchflags != "" } {
	set src "config[pid].cc"
	set f [open $src "w"]
	puts $f "int main () {}"
	close $f

	# Fixme: "additional_flags=$cxxpchflags" fails, but would be
	# useful as then the requested variant of the pre-build PCH
	# files could be tested to see if it works.
	set lines [v3_target_compile $src "config[pid].o" object \
		   "additional_flags=-include additional_flags=bits/stdc++.h"]
	if { $lines != "" } {
	    verbose -log "Requested PCH file: $cxxpchflags"
	    verbose -log "is not working, and will not be used."
	    set cxxpchflags ""
	}
	file delete $src
     }
    v3track cxxpchflags 2

    global PCH_CXXFLAGS
    if ![info exists PCH_CXXFLAGS] then {
	set PCH_CXXFLAGS $cxxpchflags
	v3track PCH_CXXFLAGS 2
    }

    libstdc++_maybe_build_wrapper "${objdir}/testglue.o" "-fexceptions"
}

# Callback for cleanup routines.
proc libstdc++_exit { } {
    global gluefile;

    if [info exists gluefile] {
	file_on_build delete $gluefile;
	unset gluefile;
    }
}

# Callback from system dg-test.
proc libstdc++-dg-test { prog do_what extra_tool_flags } {
    # Set up the compiler flags, based on what we're going to do.
    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"
	}
	"link" {
	    set compile_type "executable"
	    set output_file "./[file rootname [file tail $prog]].exe"
	}
	"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 ""
	}
    }

    # Short-circut a bunch of complicated goo here for the special
    # case of compiling a test file as a "C" file, not as C++. Why? So
    # -nostdc++ doesn't trip us up. So all the extra object files
    # don't trip us up. So automatically linking in libstdc++ doesn't
    # happen. So CXXFLAGS don't error.
    set select_compile "v3_target_compile"
    set options ""
    if { $extra_tool_flags != "" } {
	verbose -log "extra_tool_flags are: $extra_tool_flags"
	if { [string first "-x c" $extra_tool_flags ] != -1 } {
	    verbose -log "compiling and executing as C, not C++"
	    set edit_tool_flags $extra_tool_flags
	    regsub -all ".x c" $edit_tool_flags "" edit_tool_flags
	    lappend options "additional_flags=$edit_tool_flags"
	    set select_compile "v3_target_compile_as_c"
	} else {
	    lappend options "additional_flags=$extra_tool_flags"
	}
    }

    # There is a libstdc++_compile made for us by default (via the tool-
    # and-target file), but the defaults are lacking in goodness.
    set comp_output [$select_compile "$prog" "$output_file" "$compile_type" $options];

    set unsupported_message [libstdc++_check_unsupported_p $comp_output]
    if { $unsupported_message != "" } {
	set comp_output "::unsupported::$unsupported_message"
    }

    return [list $comp_output $output_file]
}

# Override the DejaGnu dg-test in order to clear flags after a test, as
# is done for compiler tests in gcc-dg.exp.

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

    proc dg-test { args } {
	global additional_prunes
	global errorInfo
	global testname_with_flags

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

# Find the minimum standard required by a test, if higher than the default_std.
proc v3-minimum-std { test default_std max_std } {
    for {set s $default_std} {$s <= $max_std} {incr s 3} {
	if [search_for $test "\{ dg-do * \{ target c++$s"] {
	    return $s
	} elseif [search_for $test "\{ dg-require-effective-target c++$s"] {
	    return $s
	}
    }
    # TODO: replace all c++2a with c++20 and remove this case.
    if [search_for $test "\{ dg-do * \{ target c++2a"] {
	return 20
    }
    return $default_std
}

# Allow v3_std_list to be set in configuration files, e.g., ~/.dejagnurc
if ![info exists v3_std_list] {
    set v3_std_list { }
}
# Allow v3_std_list to be set from the environment.
if [info exists env(GLIBCXX_TESTSUITE_STDS)] {
    set v3_std_list [split $env(GLIBCXX_TESTSUITE_STDS) ","]
}

# Modified dg-runtest that runs tests in multiple standard modes,
# unless they specifically specify one standard.
proc v3-dg-runtest { testcases flags 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
	}

	# If the testcase specifies a standard, use that one.
	# If not, run it under several standards, allowing GNU extensions
	# unless strict_std is requested.
	if ![search_for $test "// \{ dg-*options*-std=*++"] {
	    if [search_for $test "{ dg-add-options strict_std }"] {
		set std_prefix "-std=c++"
	    } else {
		set std_prefix "-std=gnu++"
	    }

	    # See above for the initial value of this list.
	    global v3_std_list
	    if { [llength $v3_std_list] > 0 } {
		set std_list $v3_std_list
	    } else {
		# If the test requires a newer C++ version than which
		# is tested by default, use that C++ version for that
		# single test.
		# These should be adjusted whenever the default -std is
		# updated or newer C++ effective target is added.
		set default_std 17
		set max_std 26
		set min_std [v3-minimum-std $test $default_std $max_std]
		if { $min_std > $default_std } {
		    set std_list $min_std
		    if { $min_std != $max_std } {
			# Also test the latest version.
			lappend std_list "$max_std"
		    }
		} else {
		    # Only run each test once with the default -std option.
		    # This avoids increasing the run time for most testers.
		    # Libstdc++ developers can override this with v3_std_list.
		    set std_list $default_std
		}
	    }
	    set option_list { }
	    foreach x $std_list {
		if { $x eq "impcx" } then { set x "26 -fimplicit-constexpr" }
		lappend option_list "${std_prefix}$x"
	    }
	} else {
	    verbose "using -std option specified in [file tail $test]" 2
	    set option_list { "" }
	}

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

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


# True if the library supports wchar_t.
set v3-wchar_t 0

# True if the library supports threads.
set v3-threads 0

# True if the library supports symbol versioning.
set v3-symver 0

# Called from libstdc++-dg-test above.  Calls back into system's
# target_compile to actually do the work.
proc v3_target_compile { source dest type options } {
    global gluefile
    global wrap_flags
    global cxx
    global cxxflags
    global cxxvtvflags
    global cxxldflags
    global includes
    global STATIC_LIBCXXFLAGS
    global tool

    lappend options "additional_flags=-fdiagnostics-plain-output"

    if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
	lappend options "libs=${gluefile}"
	lappend options "ldflags=${wrap_flags}"
    }

    set cxx_final $cxx
    set cxxlibglossflags  [libgloss_link_flags]
    set cxx_final [concat $cxx_final $cxxlibglossflags]
    set cxx_final [concat $cxx_final $STATIC_LIBCXXFLAGS]
    set cxx_final [concat $cxx_final $cxxflags]
    set cxx_final [concat $cxx_final $cxxvtvflags]
    set cxx_final [concat $cxx_final $includes]

    # Flag setting based on type argument.
    if { $type == "executable" } {
	# Link the support objects into executables.
	lappend options "additional_flags=./libtestc++.a $cxxldflags"
    } else {
	if { $type == "sharedlib" } {
	    # Don't link in anything.
	    set type "executable"
	}
    }

    # For Windows and Darwin we might want to create a temporary file.
    # Note that it needs deleting.
    set file_to_delete ""
    # Small adjustment for Windows hosts.
    if { $dest == "/dev/null"
	  && [info exists ::env(OS)] && [string match "Windows*" $::env(OS)] } {
	if { $type == "executable" } {
	    set dest "x.exe"
	    set file_to_delete ${dest}
	} else {
	    # Windows uses special file named "nul" as a substitute for
	    # /dev/null
	    set dest "nul"
	}
    }

    # Using /dev/null as the executable name does not work on Darwin when
    # debug is enabled, since the debug linker does not accept /dev/null as
    # a valid executable name.
    if { $dest == "/dev/null" && [istarget *-*-darwin*]
         && $type == "executable" } {
	set dest dev-null-[pid].exe
	set file_to_delete ${dest}
    }

    lappend options "compiler=$cxx_final"
    lappend options "timeout=[timeout_value]"

    global v3_additional_files
    # There will be an empty file at the begining of the list so trim it off.
    foreach file [split [string trim $v3_additional_files] " "] {
	global srcdir
	v3-copy-file "$srcdir/data/$file" $file
    }
    set v3_additional_files {}

    set comp_output [target_compile $source $dest $type $options]

    # Strip versioned namespace from the compiler output,
    # so that dg-error and dg-warning patterns can ignore it:
    regsub -all "std::__8::" $comp_output "std::" comp_output

    if { $type == "executable" && $file_to_delete != "" } {
	file delete $file_to_delete
	if { [istarget *-*-darwin*] && [file exists $file_to_delete.dSYM] } {
	    file delete -force $file_to_delete.dSYM
	}
    }
    return $comp_output
}


# Called from libstdc++-dg-test above, but only for "C" compilation.
# Calls back into system's target_compile to actually do the work.
proc v3_target_compile_as_c { source dest type options } {
    global gluefile
    global wrap_flags
    global includes
    global flags_file
    global blddir
    global cc
    global cxxflags
    global STATIC_LIBCXXFLAGS
    global tool

    if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
	lappend options "libs=${gluefile}"
	lappend options "ldflags=${wrap_flags}"
    }

    set tname [target_info name]
    set cc_final $cc
    set cxxlibglossflags [libgloss_link_flags]
    set cc_final [concat $cc_final $cxxlibglossflags]
    set cc_final [concat $cc_final $STATIC_LIBCXXFLAGS]
    set cc_final [concat $cc_final $cxxflags]
    set cc_final [concat $cc_final $includes]
    regsub -all {\s[-]nostdinc[+][+]} $cc_final "" cc_final

    # This is needed for "C" tests, as this type of test may need the
    # C++ includes. And if we're not testing in the build directory,
    # the includes variable is not likely to include the necessary
    # info.
    if { ![file exists $flags_file] } {
	# ??? We need a --print-include-dirs option to GCC, so that
	# we can avoid these hacks.  The heuristics here will not
	# work with non-standard --with-includedir= options.
	set version [remote_exec host ${cc} -dumpversion]
	# Remove the trailing newline from the output.
	set version [string trimright [lindex $version 1]]
	set machine [remote_exec host ${cc} -dumpmachine]
	set machine [string trimright [lindex $machine 1]]
	set comp_base_dir [remote_exec host ${cc} --print-prog-name=cc1]
	set comp_base_dir [lindex $comp_base_dir 1]
	set comp_base_dir [file dirname [file dirname [file dirname [file dirname [file dirname $comp_base_dir]]]]]
	# For a cross compiler, the header files will be located in a
	# machine-specific subdirectory.
	set crossbase "${comp_base_dir}/${machine}/include/c++/${version}"
	set crosstarget "${crossbase}/${machine}"
	set cc_final [concat $cc_final "-I$crossbase -I$crosstarget"]
	# For a native compiler, the header files will be located at
	# the top level.
	set includesbase "${comp_base_dir}/include/c++/${version}"
	set includestarget "${includesbase}/${machine}"
	set cc_final [concat $cc_final "-I$includesbase -I$includestarget"]

	set libdir "-L${comp_base_dir}/lib"
    } else {
	set libdir "-L${blddir}/libsupc++/.libs"
	set libdir [concat $libdir "-L${blddir}/src/.libs"]
    }

    set cc_final [concat $cc_final "$libdir"]

    lappend options "compiler=$cc_final"
    lappend options "timeout=[timeout_value]"

    set comp_output [target_compile $source $dest $type $options]

    return $comp_output
}

# Build the support objects linked in with the libstdc++ tests.  In
# addition, set v3-wchar_t, v3-threads, and v3-symver appropriately.
proc v3-build_support { } {
    global env
    global srcdir
    global v3-wchar_t
    global v3-threads
    global v3-symver
    global v3-sharedlib

    # Figure out whether or not the library supports certain features.
    set v3-wchar_t 0
    set v3-threads 0
    set v3-symver 0
    set libtest_objs ""

    set config_src "config.cc"
    set config_out "config.ii"
    set f [open $config_src "w"]
    puts $f "#include <bits/c++config.h>"
    puts $f "#include <bits/gthr.h>"
    close $f
    v3_target_compile $config_src $config_out preprocess "additional_flags=-dN"
    set file [open $config_out r]
    set preprocessed [read $file]
    close $file
    if { [string first "_GLIBCXX_USE_WCHAR_T" $preprocessed] != -1 } {
	verbose -log "wchar_t support detected"
	set v3-wchar_t 1
    }
    if { [string first "_GLIBCXX_SYMVER" $preprocessed] != -1 } {
	verbose -log "symbol versioning support detected"
	set v3-symver 1
    }
    if { [string first "__GTHREADS" $preprocessed] != -1 } {
	verbose -log "thread support detected"
	set v3-threads 1
    }

    # Try to build the MO files that are used by some of the locale
    # tests.  If we can't build them, that's OK; it just means that
    # those tests will fail.
    foreach lang [list "fr" "de"] {
	catch {
	    file mkdir "$lang/LC_MESSAGES"
	    remote_exec "build" "msgfmt" "-o $lang/LC_MESSAGES/libstdc++.mo $srcdir/../po/$lang.po"
	    if [is_remote host] {
		remote_exec "host" "mkdir" "-p $lang/LC_MESSAGES"
		remote_download "host" "$lang/LC_MESSAGES/libstdc++.mo" "$lang/LC_MESSAGES/libstdc++.mo"
	    }
	}
    }

    # Build the support objects.
    set source_files [list testsuite_abi.cc testsuite_allocator.cc \
			  testsuite_character.cc testsuite_hooks.cc \
			  io/verified_cmd_line_input.cc \
			  io/prog_bar.cc performance/time/elapsed_timer.cc ]
    foreach f $source_files {
	set obj [file rootname $f].o
	set object_file [file tail $obj]
	# Compile with "-w" so that warnings issued by the compiler
	# do not prevent compilation.
	# Disable LTO so that ar/ranlib don't need the LTO plugin.
	if { [v3_target_compile $srcdir/util/$f $object_file "object" \
		  [list "incdir=$srcdir" "additional_flags=-w -fno-lto -fno-freestanding"]]
	     != "" } {
	    error "could not compile $f"
	}
	append libtest_objs "$object_file "
    }

    # Collect into libtestc++.a
    if  [info exists env(AR)] {
	set ar $env(AR)
    } else {
	set ar [transform "ar"]
    }
    set arargs "-rc ./libtestc++.a ${libtest_objs}"
    verbose -log "$ar $arargs"
    set result [lindex [remote_exec host "$ar" "$arargs"] 0]
    verbose "link result is $result"
    if { $result == 0 } {
	if  [info exists env(RANLIB)] {
	    set ranlib $env(RANLIB)
	} else {
	    set ranlib [transform "ranlib"]
	}
	set ranlibargs "./libtestc++.a"
	verbose -log "$ranlib $ranlibargs"
	set result [lindex [remote_exec host "$ranlib" "$ranlibargs"] 0]
	if { $result != 0 } {
	    error "could not link libtestc++.a"
	}
    }

    # Build any shared objects needed for regression testing.
    if { ${v3-sharedlib} == 1 } {
	set source_files [list testsuite_shared.cc]
	foreach f $source_files {
	    set object_file [file rootname $f].so
	    # Compile with "-w" so that warnings issued by the compiler
	    # do not prevent compilation.
	    if { [v3_target_compile $srcdir/util/$f $object_file "sharedlib" \
	     [list "incdir=$srcdir" "additional_flags=-fno-inline -w -shared -fPIC -DPIC -std=gnu++98 -fno-freestanding"]]
		 != "" } {
		error "could not compile $f"
	    }
	}
    }
}

# Implement an target check for property PROP by invoking
# the Tcl command ARGS and seeing if it returns true.

proc check_v3_target_prop_cached { prop args } {
    global et_cache

    set target [current_target_name]
    if {![info exists et_cache($prop,$target)]} {
	verbose "check_v3_target_prop_cached $prop: checking $target" 2
	if {[string is true -strict $args] || [string is false -strict $args]} {
	    error {check_v3_target_prop_cached condition already evaluated; did you pass [...] instead of the expected {...}?}
	} else {
	    set code [catch {uplevel eval $args} result]
	    if {$code != 0 && $code != 2} {
		verbose "check_v3_target_prop_cached $prop: evaluation failed for $target" 2
		return -code $code $result
	    }
	    set et_cache($prop,$target) $result
	}
    } else {
	verbose "check_v3_target_prop_cached $prop $target: using cached result" 2
    }

    set value $et_cache($prop,$target)
    verbose "check_v3_target_prop_cached $prop: returning $value for $target" 2
    return $value
}

proc check_v3_target_fileio { } {
    return [check_v3_target_prop_cached et_fileio {
	global tool
	global srcdir

	# Set up, compile, and execute a C++ test program that tries to use
	# the file functions
	set src fileio[pid].cc
	set exe fileio[pid].x
	set testfile "cin_unget-1.[pid].txt"
	v3-copy-file "$srcdir/data/cin_unget-1.txt" "$testfile"

	set f [open $src "w"]
	puts $f "#include <sys/types.h>"
	puts $f "#include <sys/stat.h>"
	puts $f "#include <fcntl.h>"
	puts $f "#include <unistd.h>"
	puts $f "#include <errno.h>"
	puts $f "#include <string.h>"
	puts $f "using namespace std;"
	puts $f "int main ()"
	puts $f "{"
	puts $f "  int fd  = open (\"$testfile\", O_RDONLY);"
	puts $f "  int ret = 0;"
	puts $f "  char buf\[10\];"
	puts $f "  if (fd == -1)"
	puts $f "    ret = 1;"
	puts $f "  else"
	puts $f "  {"
	puts $f "    if (lseek (fd, -1, SEEK_CUR) != -1 || errno != EINVAL)"
	puts $f "      ret = 1;"
	puts $f "    errno = 0;"
	puts $f "    if (lseek (fd, 0, SEEK_CUR) != 0"
	puts $f "        || read (fd, buf, 4) != 4"
	puts $f "        || memcmp (buf, \"1234\", 4) != 0"
	puts $f "        || lseek (fd, -2, SEEK_CUR) != 2"
	puts $f "        || read (fd, buf, 2) != 2"
	puts $f "        || memcmp (buf, \"34\", 2) != 0)"
	puts $f "      ret = 1;"
	puts $f "    close (fd);"
	puts $f "  }"
	puts $f "  return ret;"
	puts $f "}"
	close $f

	set lines [v3_target_compile $src $exe executable ""]
	file delete $src

	if [string match "" $lines] {
	    # No error message, compilation succeeded.
	    set result [${tool}_load "./$exe" "" ""]
	    set status [lindex $result 0]
	    remote_file build delete $exe

	    verbose "check_v3_target_fileio: status is <$status>" 2

	    if { $status == "pass" } {
		return 1
	    }
	} else {
	    verbose "check_v3_target_fileio: compilation failed" 2
	}
	return 0
    }]
}

# Eventually we want C90/C99 determining and switching from this.
proc check_v3_target_c_std { } {
    return [check_v3_target_prop_cached et_c_std {
	global tool
	# Set up, compile, and execute a C++ test program that tries to use
	# C99 functionality.
	# For math bits, could use check_effective_target_c99_math.
	set src c_std[pid].cc
	set exe c_std[pid].x

	set f [open $src "w"]
	puts $f "#include <tr1/cmath>"
	puts $f "#include <cstdlib>"
	puts $f "int main ()"
	puts $f "{"
	puts $f "  float f = 45.55;"
	puts $f "  int i = std::tr1::isnan(f);"
	puts $f "  "
	puts $f "  using std::wctomb;"
	puts $f "  return i;"
	puts $f "}"
	close $f

	set lines [v3_target_compile $src $exe executable ""]
	file delete $src

	if [string match "" $lines] {
	    # No error message, compilation succeeded.
	    set result [${tool}_load "./$exe" "" ""]
	    set status [lindex $result 0]
	    remote_file build delete $exe

	    verbose "check_v3_target_c_std: status is <$status>" 2

	    if { $status == "pass" } {
		return 1
	    }
	} else {
	    verbose "check_v3_target_c_std: compilation failed" 2
	}
	return 0
    }]
}

proc check_v3_target_sharedlib { } {
    global v3-sharedlib
    return ${v3-sharedlib}
}

proc check_v3_target_time { } {
    return [check_v3_target_prop_cached et_target_time {
	global tool
	# Set up and compile a C++ test program that tries to use
	# the time function
	set src time[pid].cc

	set f [open $src "w"]
	puts $f "#include <time.h>"
	puts $f "using namespace std;"
	puts $f "int main ()"
	puts $f "{"
	puts $f "  time (0);"
	puts $f "}"
	close $f

	set lines [v3_target_compile $src /dev/null executable ""]
	file delete $src

	if [string match "" $lines] {
	    # No error message, compilation succeeded.
	    verbose "check_v3_target_time: compilation succeeded" 2
	    return 1
	} else {
	    verbose "check_v3_target_time: compilation failed" 2
	    return 0
	}
    }]
}

proc check_v3_target_namedlocale { args } {
    set key "et_namedlocale $args"
    return [check_v3_target_prop_cached $key {
	global tool
	# Set up, compile, and execute a C++ test program that tries to use
	# the required named locale.
	set exe nlocale[pid].x
	set src nlocale[pid].cc

	set f [open $src "w"]
	puts $f "#include <locale>"
	puts $f "#include <cstdio>"
	puts $f "#include <cstring>"
	puts $f "using namespace std;"
	puts $f "char *transform_locale(const char *name)"
	puts $f "{"
	puts $f "    char *result = new char\[50\];"
	puts $f "    strcpy(result, name);"
	puts $f "#if defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__"
	puts $f "    /* fall-through */"
	puts $f "#elif defined __GLIBC__"
	puts $f "    if (strstr(result, \"ISO8859-15\")) {"
	puts $f "        strcat(result, \"@euro\");"
	puts $f "    }"
	puts $f "#endif"
	puts $f "    return result;"
	puts $f "}"
	puts $f "int main (int argc, char** argv)"
	puts $f "{"
	puts $f "  if (argc < 2)"
	puts $f "  {"
	puts $f "    printf(\"locale support test not supported\\n\");"
	puts $f "    return 1;"
	puts $f "  }"
	puts $f "  const char *namedloc = transform_locale(*(argv + 1));"
	puts $f "  try"
	puts $f "  {"
	puts $f "    locale((const char*)namedloc);"
	puts $f "    delete\[\] namedloc;"
	puts $f "    return 0;"
	puts $f "  }"
	puts $f "  catch(...)"
	puts $f "  {"
	puts $f "    printf(\"locale '%s' not supported\\n\", namedloc);"
	puts $f "    delete\[\] namedloc;"
	puts $f "    return 1;"
	puts $f "  }"
	puts $f "}"
	close $f

	set lines [v3_target_compile $src $exe executable ""]
	file delete $src

	if ![string match "" $lines] {
	  verbose "check_v3_target_namedlocale: compilation failed" 2
	  return 0
	}

	set result [${tool}_load "./$exe" "$args" ""]
	set status [lindex $result 0]

	verbose "check_v3_target_namedlocale <$args>: status is <$status>" 2

	if { $status == "pass" } {
	    return 1
	  }
	return 0
    }]
}

# Returns 1 if the tokens in CODE can be preprocessed successfully using FLAGS,
# returns 0 otherwise.
proc v3_try_preprocess { name code flags } {
    global tool
    global cxxflags

    # Set up and preprocess a C++ translation unit.
    set src $name[pid].cc

    set f [open $src "w"]
    puts $f $code
    close $f

    set cxxflags_saved $cxxflags
    set cxxflags "$flags"

    set lines [v3_target_compile $src /dev/null preprocess ""]
    set cxxflags $cxxflags_saved
    file delete $src

    if [string match "" $lines] {
	verbose "v3_try_preprocess $name: preprocessing passed" 3
	# No error message, preprocessing succeeded.
	return 1
    }
    verbose "v3_try_preprocess $name: preprocessing failed" 2
    return 0
}

# Return 1 if COND evaluates to true in the preprocessor, 0 otherwise.
# The <bits/c++config.h> config header is included, and INC, if given,
# is pasted between it and the condition evaluation, so it can be used
# for additional #include's.
proc v3_check_preprocessor_condition { name cond { inc "" } } {
    global cxxflags
    global DEFAULT_CXXFLAGS

    set code "
	#include <bits/c++config.h>
	$inc
	#if ! ($cond)
	#error '$cond' is false
	#endif
	"
    set flags "$cxxflags $DEFAULT_CXXFLAGS -Werror"

    return [v3_try_preprocess name $code $flags]
}

# Return 1 if libstdc++ defines macro for the current target, 0 otherwise.
proc check_v3_target_cpp_feature_test { cond } {
    global cxxflags
    set cxxflags_saved $cxxflags
    # Use the latest standard, so that all feature test macros are defined.
    # We need to do it here, because this check happens before v3-dg-runtest
    # runs its loop to test multiple times with different -std options.
    # This should be updated when a new -std is added.
    set cxxflags "$cxxflags -std=gnu++26"
    set inc "#include <version>"
    set result [v3_check_preprocessor_condition cpp_feature_test "$cond" $inc]
    set cxxflags $cxxflags_saved
    return $result
}

# Return 1 if Debug Mode is active, 0 otherwise.
proc check_v3_target_debug_mode { } {
    global cxxflags
    return [check_v3_target_prop_cached et_debug_mode {
	set code "
	#include <bits/c++config.h>
	#if ! defined _GLIBCXX_DEBUG
	# error no debug mode
	#endif
	"
	return [v3_try_preprocess debug_mode $code $cxxflags]
    }]
}

# Define "debug_mode" as an effective-target keyword.
proc check_effective_target_debug_mode { } {
    return [check_v3_target_debug_mode]
}

# Return 1 if normal mode is active, 0 otherwise.
# i.e. neither Debug Mode nor Parallel Mode is active.
proc check_v3_target_normal_mode { } {
    global cxxflags
    return [check_v3_target_prop_cached et_normal_mode {
	set code "
	#if defined _GLIBCXX_DEBUG
	# error debug mode
	#endif
	#if defined _GLIBCXX_PARALLEL
	# error parallel mode
	#endif
	"
	return [v3_try_preprocess normal_mode $code $cxxflags]
    }]
}

# Return 1 if unversioned namespace is in use, 0 otherwise.
# i.e. the library uses namespace std:: not std::__8:: or similar.
proc check_v3_target_normal_namespace { } {
    return [check_v3_target_prop_cached et_normal_namespace {
	set cond "!_GLIBCXX_INLINE_VERSION"
	return [v3_check_preprocessor_condition normal_namespace $cond]
    }]
}

# Return 1 if the libgomp is being used, 0 otherwise.
proc check_v3_target_parallel_mode { } {
    return [check_v3_target_prop_cached et_parallel_mode {
	global cxxflags
	global v3-libgomp
	# If 'make check-parallel' is running then the test succeeds.
	if { ${v3-libgomp} == 1 && [regexp "libgomp" $cxxflags] } {
	    return 1
	}
	return 0
    }]
}

# Return 1 if the C99 stdint facilities are available, 0 otherwise.
proc check_v3_target_cstdint { } {
    return [check_v3_target_prop_cached et_cstdint {
	set cond "defined _GLIBCXX_USE_C99_STDINT"
	return [v3_check_preprocessor_condition cstdint $cond]
    }]
}

# Return 1 if the C99 math facilities are available, 0 otherwise.
proc check_v3_target_cmath { } {
    return [check_v3_target_prop_cached et_c99_math {
	set cond "defined _GLIBCXX_USE_C99_MATH_FUNCS"
	return [v3_check_preprocessor_condition cmath $cond]
    }]
}

proc check_v3_target_thread_fence { } {
    return [check_v3_target_prop_cached et_thread_fence {
	global cxxflags
	global DEFAULT_CXXFLAGS

	# Set up and link a C++11 test program that depends
	# on the thread fence to be available.
	set src thread_fence[pid].cc

	set f [open $src "w"]
	puts $f "
	int main() {
	__atomic_thread_fence (__ATOMIC_SEQ_CST);
	return 0;
	}"
	close $f

	set cxxflags_saved $cxxflags
	set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror -std=gnu++11"

	set lines [v3_target_compile $src /dev/null executable ""]
	set cxxflags $cxxflags_saved
	file delete $src

	if [string match "" $lines] {
	    # No error message, linking succeeded.
	    return 1
	} else {
	    verbose "check_v3_target_thread_fence: compilation failed" 2
	    return 0
	}
    }]
}

proc check_v3_target_atomic_cmpxchg_word { } {
    return [check_v3_target_prop_cached et_atomic_cmpxchg_word {
	global cxxflags
	global DEFAULT_CXXFLAGS

	# Set up and link a C++11 test program that depends on
	# atomic-compare-exchange being available for a pointer-sized
	# integer.  It should be sufficient as gcc can derive all
	# other operations when a target implements this operation.
	set src atomic_cmpxchg_word[pid].cc

	set f [open $src "w"]
	puts $f "
	__UINTPTR_TYPE__ i, j, k;
	int main() {
	__atomic_compare_exchange (&i, &j, &k, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
	return 0;
	}"
	close $f

	set cxxflags_saved $cxxflags
	set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror -std=gnu++11"

	set lines [v3_target_compile $src /dev/null executable ""]
	set cxxflags $cxxflags_saved
	file delete $src

	if [string match "" $lines] {
	    # No error message, linking succeeded.
	    return 1
	} else {
	    verbose "check_v3_target_atomic_cmpxchg_word: compilation failed" 2
	    return 0
	}
    }]
}

# Return 1 if atomics_bool and atomic_int are always lock-free, 0 otherwise.
proc check_v3_target_atomic_builtins { } {
    return [check_v3_target_prop_cached et_atomic_builtins {
	set cond "__GCC_ATOMIC_BOOL_LOCK_FREE > 1 && __GCC_ATOMIC_INT_LOCK_FREE > 1"
	return [v3_check_preprocessor_condition atomic_builtins $cond]
    }]
}

# Define "atomic_builtins" as an effective-target keyword.
proc check_effective_target_atomic_builtins { } {
    return [check_v3_target_atomic_builtins]
}

# Return 1 if C++11 [threads] facilities are available via gthreads,
# 0 otherwise.
proc check_v3_target_gthreads { } {
    return [check_v3_target_prop_cached et_gthreads {
	set cond "defined _GLIBCXX_HAS_GTHREADS"
	return [v3_check_preprocessor_condition gthreads $cond]
    }]
}

# Define "gthreads" as an effective-target keyword.
proc check_effective_target_gthreads { } {
    return [check_v3_target_gthreads]
}

# Return 1 if C++11 timed mutexes are available via gthreads, 0 otherwise.
proc check_v3_target_gthreads_timed { } {
    return [check_v3_target_prop_cached et_gthreads_timed {
	if [check_v3_target_gthreads] {
	    set cond "_GTHREAD_USE_MUTEX_TIMEDLOCK"
	    return [v3_check_preprocessor_condition gthreads_timed $cond]
	} else {
	    return 0
	}
    }]
}

# Define "gthreads_timed" as an effective-target keyword.
proc check_effective_target_gthreads_timed { } {
    return [check_v3_target_gthreads_timed]
}

# Return 1 if either nanosleep or sleep is available, 0 otherwise.
proc check_v3_target_sleep { } {
    return [check_v3_target_prop_cached et_sleep {
	set cond "defined _GLIBCXX_USE_NANOSLEEP"
	set cond "$cond || defined _GLIBCXX_USE_WIN32_SLEEP"
	set cond "$cond || defined _GLIBCXX_HAVE_SLEEP"
	return [v3_check_preprocessor_condition sleep $cond]
    }]
}

# Return 1 if __gthread_yield is available, 0 otherwise.
proc check_v3_target_sched_yield { } {
    return [check_v3_target_prop_cached et_sched_yield {
	set cond "defined _GLIBCXX_USE_SCHED_YIELD"
	return [v3_check_preprocessor_condition sched_yield $cond]
    }]
}

# Return 1 if the [string.conversions] facilities are available, 0 otherwise.
proc check_v3_target_string_conversions { } {
    return [check_v3_target_prop_cached et_string_conversions {
	set cond "_GLIBCXX_USE_C99_STDIO && _GLIBCXX_USE_C99_STDLIB"
	set cond "$cond && _GLIBCXX_USE_C99_WCHAR"
	set cond "$cond && !defined _GLIBCXX_HAVE_BROKEN_VSWPRINTF"
	return [v3_check_preprocessor_condition string_conversions $cond]
    }]
}

# Return 1 if a standard-conforming swprintf is available, 0 otherwise.
proc check_v3_target_swprintf { } {
    return [check_v3_target_prop_cached et_swprintf {
	set cond "! defined _GLIBCXX_HAVE_BROKEN_VSWPRINTF"
	return [v3_check_preprocessor_condition swprintf $cond]
    }]
}

# Return 1 if text and binary I/O are the same, 0 otherwise.
proc check_v3_target_binary_io { } {
    return [check_v3_target_prop_cached et_binary_io {
	set cond "! defined _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM"
	return [v3_check_preprocessor_condition binary_io $cond]
    }]
}

# Return 1 if get_nprocs or pthreads_num_processors_np or a suitable sysconf
# is available, 0 otherwise.
proc check_v3_target_nprocs { } {
    return [check_v3_target_prop_cached et_nprocs {
	set cond "defined _GLIBCXX_USE_GET_NPROCS"
	set cond "$cond || defined _GLIBCXX_USE_GET_NPROCS_WIN32"
	set cond "$cond || defined _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP"
	set cond "$cond || defined _GLIBCXX_USE_SYSCTL_HW_NCPU"
	set cond "$cond || defined _GLIBCXX_USE_SC_NPROCESSORS_ONLN"
	set cond "$cond || defined _GLIBCXX_USE_SC_NPROC_ONLN"
	return [v3_check_preprocessor_condition nprocs $cond]
    }]
}

# Return 1 if linking with -static-libstdc++ works, 0 otherwise.
proc check_v3_target_static_libstdcxx { } {
    return [check_v3_target_prop_cached et_static_libstdcxx {
	global cxxflags
	global DEFAULT_CXXFLAGS
	# Set up and link a C++0x test program that depends
	# on static linking
	set src static-maybe[pid].cc

	set f [open $src "w"]
	puts $f "#include <iostream>"
	puts $f "int main() {"
	puts $f "int i(415);"
	puts $f "std::cout<< i << std::endl;"
	puts $f "return 0; }"
	puts $f ""
	close $f

	set cxxflags_saved $cxxflags
	set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -static-libstdc++"

	set lines [v3_target_compile $src /dev/null executable ""]
	set cxxflags $cxxflags_saved
	file delete $src

	if [string match "" $lines] {
	    # No error message, link succeeded.
	    return 1
	} else {
	    verbose "check_v3_target_static_libstdcxx: compilation failed" 2
	    return 0
	}
    }]
}

proc check_v3_target_little_endian { } {
    return [check_effective_target_le]
}

# Return 1 if the Filesystem TS is supported, 0 otherwise.
# Cache the result.
proc check_v3_target_filesystem_ts { } {
    return [check_v3_target_prop_cached et_filesystem_ts {
	global cxxflags
	global DEFAULT_CXXFLAGS
	# Set up and preprocess a C++ test program that depends
	# on the Filesystem TS feature-test macro being defined.
	set src filesystem_ts[pid].cc

	set f [open $src "w"]
	puts $f "#include <experimental/filesystem>"
	puts $f "#if ! __cpp_lib_experimental_filesystem"
	puts $f "#  error No Filesystem TS support"
	puts $f "#endif"
	close $f

	set cxxflags_saved $cxxflags
	set cxxflags "$cxxflags $DEFAULT_CXXFLAGS -Werror"

	set lines [v3_target_compile $src /dev/null preprocess ""]
	set cxxflags $cxxflags_saved
	file delete $src

	if [string match "" $lines] {
	    # No error message, preprocessing succeeded.
	    return 1
	}
	return 0
    }]
}

# Return 1 if the libstdc++ filesystem create_symlinks implementation
# is not an always-failing dummy.
proc check_v3_target_fs_symlinks { } {
    set inc "#include <testsuite_fs.h>"
    set cond "!defined NO_SYMLINKS"
    return [v3_check_preprocessor_condition fs_symlinks $cond $inc]
}

# Return 1 if the libstdc++ filesystem implementation of space is not an
# always-failing dummy.
proc check_v3_target_fs_space { } {
    set inc "#include <testsuite_fs.h>"
    set cond "!defined NO_SPACE"
    return [v3_check_preprocessor_condition fs_space $cond $inc]
}

# Return 1 if the libstdc++ filesystem implementation of
# last_write_time is not an always-failing dummy.
proc check_v3_target_fs_last_write_time { } {
    set inc "#include <testsuite_fs.h>"
    set cond "!defined NO_LAST_WRITE_TIME"
    return [v3_check_preprocessor_condition fs_last_write_time $cond $inc]
}

# Return 1 if the "cxx11" ABI is in use using the current flags, 0 otherwise.
# Any flags provided by RUNTESTFLAGS or a target board will be used here.
# Flags added in the test by dg-options or dg-add-options will not be used.
proc check_effective_target_cxx11_abi { } {
    set cond "_GLIBCXX_USE_CXX11_ABI"
    return [v3_check_preprocessor_condition cxx11_abi $cond]
}

# Return 1 if std::random_device should be usable using the current flags,
# 0 otherwise.
proc check_effective_target_random_device { } {
    set cond "_GLIBCXX_USE_RANDOM_TR1"
    return [v3_check_preprocessor_condition random_device $cond]
}

# Return 1 if tbb parallel backend is available, 0 otherwise.
proc check_effective_target_tbb_backend { } {
    return [check_v3_target_prop_cached et_tbb {
        # Set up and compile a C++ test program that depends on tbb
        set src tbb_backend[pid].cc
        set exe tbb_backend[pid].x

        set f [open $src "w"]
        puts $f "#include <tbb/tbb.h>"
        puts $f "#if TBB_INTERFACE_VERSION < 10000"
        puts $f "#  error Intel(R) Threading Building Blocks 2018 is required; older versions are not supported."
        puts $f "#endif"
        puts $f "int main ()"
        puts $f "{"
        puts $f "  return 0;"
        puts $f "}"
        close $f

        set lines [v3_target_compile $src $exe executable "additional_flags=-std=c++17 additional_flags=-ltbb
                                                           additional_flags=-DTBB_SUPPRESS_DEPRECATED_MESSAGES=1"]
        file delete $src

        if [string match "" $lines] {
            # No error message, compilation succeeded.
            verbose "check_et_tbb_backend: `1'" 2
            return 1
        }
        verbose "check_et_tbb_backend: `0'" 2
        return 0
    }]
}

# Return 1 if futex syscall is available
proc check_effective_target_futex { } {
    return [check_v3_target_prop_cached et_futex {
	set cond "_GLIBCXX_HAVE_LINUX_FUTEX"
	return [v3_check_preprocessor_condition futex $cond]
    }]
}

# Return 1 if float and double have the IEEE binary32 and binary64 formats.
proc check_effective_target_ieee_floats { } {
    return [check_v3_target_prop_cached et_ieee_floats {
	set cond "_GLIBCXX_FLOAT_IS_IEEE_BINARY32 && _GLIBCXX_DOUBLE_IS_IEEE_BINARY64"
	return [v3_check_preprocessor_condition ieee_floats $cond]
    }]
}

# Return 1 if Networking TS net::ip features are available.
proc check_effective_target_net_ts_ip { } {
    return [check_v3_target_prop_cached et_net_ts_ip {
	set cond "__has_include(<netinet/in.h>)"
	return [v3_check_preprocessor_condition net_ts_ip $cond]
    }]
}

# Return 1 if libstdc++ was built as --enable-libstdcxx-allocator=new
proc check_effective_target_std_allocator_new { } {
    return [check_v3_target_prop_cached et_std_alloc_new {
	set cond "_GLIBCXX_USE_ALLOCATOR_NEW"
	return [v3_check_preprocessor_condition std_alloc_new $cond]
    }]
}

# Return 1 if RTTI is enabled by the current test flags.
proc check_effective_target_rtti { } {
    return [check_v3_target_prop_cached et_rtti {
	set cond "__cpp_rtti"
	return [v3_check_preprocessor_condition rtti $cond]
    }]
}

# Return 1 if a hosted implementation is available (i.e. not freestanding).
proc check_effective_target_hosted { } {
    return [check_v3_target_prop_cached et_hosted {
	set cond "_GLIBCXX_HOSTED"
	return [v3_check_preprocessor_condition hosted $cond]
    }]
}

# Return 1 if std::chrono::tzdb is supported.
proc check_effective_target_tzdb { } {
    if {![check_effective_target_cxx11_abi]} {
	return 0
    }
    return [check_v3_target_prop_cached et_tzdb {
	set cond "defined _GLIBCXX_ZONEINFO_DIR || _GLIBCXX_STATIC_TZDATA"
	return [v3_check_preprocessor_condition tzdb $cond]
    }]
}

set additional_prunes ""

if { [info exists env(GCC_RUNTEST_PARALLELIZE_DIR)] \
     && [info procs runtest_file_p] != [list] \
     && [info procs gcc_parallelize_saved_runtest_file_p] == [list] } then {
    global gcc_runtest_parallelize_counter
    global gcc_runtest_parallelize_counter_minor
    global gcc_runtest_parallelize_enable
    global gcc_runtest_parallelize_dir
    global gcc_runtest_parallelize_last

    set gcc_runtest_parallelize_counter 0
    set gcc_runtest_parallelize_counter_minor 0
    set gcc_runtest_parallelize_enable 1
    set gcc_runtest_parallelize_dir [getenv GCC_RUNTEST_PARALLELIZE_DIR]
    set gcc_runtest_parallelize_last 0

    proc gcc_parallel_test_run_p { testcase } {
	global gcc_runtest_parallelize_counter
	global gcc_runtest_parallelize_counter_minor
	global gcc_runtest_parallelize_enable
	global gcc_runtest_parallelize_dir
	global gcc_runtest_parallelize_last

	if { $gcc_runtest_parallelize_enable == 0 } {
	    return 1
	}

	# Only test the filesystem every 10th iteration
	incr gcc_runtest_parallelize_counter_minor
	if { $gcc_runtest_parallelize_counter_minor == 10 } {
	    set gcc_runtest_parallelize_counter_minor 0
	}
	if { $gcc_runtest_parallelize_counter_minor != 1 } {
	    #verbose -log "gcc_parallel_test_run_p $testcase $gcc_runtest_parallelize_counter $gcc_runtest_parallelize_last"
	    return $gcc_runtest_parallelize_last
	}

	set path $gcc_runtest_parallelize_dir/$gcc_runtest_parallelize_counter

	if {![catch {open $path {RDWR CREAT EXCL} 0600} fd]} {
	    close $fd
	    set gcc_runtest_parallelize_last 1
	    #verbose -log "gcc_parallel_test_run_p $testcase $gcc_runtest_parallelize_counter 1"
	    incr gcc_runtest_parallelize_counter
	    return 1
	}
	set gcc_runtest_parallelize_last 0
	#verbose -log "gcc_parallel_test_run_p $testcase $gcc_runtest_parallelize_counter 0"
	incr gcc_runtest_parallelize_counter
	return 0
    }

    proc gcc_parallel_test_enable { val } {
	global gcc_runtest_parallelize_enable
	set gcc_runtest_parallelize_enable $val
    }

    rename runtest_file_p gcc_parallelize_saved_runtest_file_p
    proc runtest_file_p { runtests testcase } {
	if ![gcc_parallelize_saved_runtest_file_p $runtests $testcase] {
	    return 0
	}
	return [gcc_parallel_test_run_p $testcase]
    }

} else {

    proc gcc_parallel_test_run_p { testcase } {
	return 1
    }

    proc gcc_parallel_test_enable { val } {
    }

}

# Utility functions, invoked via dg-final.

# Compare output file written by test to expected result.
# With two arguments the comparison is done via 'diff arg1 arg2'.
# With one argument the comparison is done via 'diff arg1.tst arg1.txt'.
proc file-io-diff { args } {
    set nargs [llength $args]
    if { $nargs < 1 } {
	error "too few arguments to file-io-diff"
    }
    if { $nargs > 2 } {
	error "too many arguments to file-io-diff"
    }

    set testcase [testname-for-summary]
    set description "$testcase file-io-diff $args"

    if { $nargs == 1 } {
	set file1 [lindex $args 0]
	set file2 "${file1}.txt"
	append file1 ".tst"
    } else {
	set file1 [lindex $args 0]
	set file2 [lindex $args 1]
    }

    if { [catch { exec diff -u $file1 $file2 } msg] } {
	fail $description
	verbose -log "'diff':\n$msg"
    } else {
	pass $description
    }
    return
}
