# libstdc++ "tool init file" for DejaGNU

# Copyright (C) 2001-2021 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) ""
}

# 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

# 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-*-darwin*" $target_triplet] } {
	    append DEFAULT_CXXFLAGS " -multiply_defined suppress"
	}
	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

    # Copy any required data files.
    v3-copy-files [glob -nocomplain "$srcdir/data/*.tst"]
    v3-copy-files [glob -nocomplain "$srcdir/data/*.txt"]

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

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

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

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

    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"]]
	     != "" } {
	    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"]]
		 != "" } {
		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 fileio[pid].cc
	set exe fileio[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 "#else"
	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.
proc v3_check_preprocessor_condition { name cond } {
    global cxxflags
    global DEFAULT_CXXFLAGS

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

    return [v3_try_preprocess name $code $flags]
}

# 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 "
	#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_TR1"
	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_TR1"
	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
	}
    }]
}

# 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 || 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_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 "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_v3_tbb-backend: `1'" 2
            return 1
        }
        verbose "check_v3_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]
    }]
}

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

}
