# 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"
    lappend options "additional_flags=-Wabi=20";

    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 { locale } {
    set key "et_namedlocale $locale"
    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\[strlen(name)+6\];"
	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 ()"
	puts $f "{"
	puts $f "  const char *namedloc = transform_locale(\"$locale\");"
	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" "" ""]
	set status [lindex $result 0]

	verbose "check_v3_target_namedlocale <$locale>: 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
}
