| # libstdc++ "tool init file" for DejaGNU |
| |
| # Copyright (C) 2001-2022 Free Software Foundation, Inc. |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with 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 -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 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, 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 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 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 libstdc++ was built as --enable-libstdcxx-backtrace |
| proc check_effective_target_stacktrace { } { |
| return [check_v3_target_prop_cached et_stacktrace { |
| set cond "_GLIBCXX_HAVE_STACKTRACE && _GLIBCXX_HOSTED" |
| return [v3_check_preprocessor_condition stacktrace $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] |
| }] |
| } |
| |
| 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 } { |
| } |
| |
| } |