libstdc++: Add "futex" and "gthreads" effective-target keywords

This adds a new "futex" effective-target keyword that can be used to
selectively enable/disable tests based on _GLIBCXX_HAVE_LINUX_FUTEX,
instead of checking for that macro in the code.

It also adds "gthreads" as another one, to make the result of the
dg-require-gthreads directive usable in target selectors.

With these new keywords two tests that are currently only run for linux
can also be run for targets using gthr-single.h (e.g. AIX single-thread
multilib, and targets without a gthreads implementation).

libstdc++-v3/ChangeLog:

	* testsuite/18_support/96817.cc: Use new effective-target
	keywords to select supported targets more effectively.
	* testsuite/30_threads/call_once/66146.cc: Likewise.
	* testsuite/lib/libstdc++.exp (check_effective_target_futex):
	Define new proc.
	(check_effective_target_gthreads): Define new proc to replace
	dg-require-gthreads.
This commit is contained in:
Jonathan Wakely 2020-11-26 14:13:32 +00:00
parent 294e72e9ac
commit 10ee46adf4
3 changed files with 41 additions and 8 deletions

View File

@ -15,19 +15,18 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// { dg-options "-pthread" }
// { dg-do run { target *-*-linux-gnu } }
// { dg-require-effective-target pthread }
// { dg-do run }
// { dg-additional-options "-pthread" { target pthread } }
// Static init cannot detect recursion for gthreads targets without futexes
// (and the futex case can only detect it if __libc_single_threaded==true).
// { dg-skip-if "unsupported" { gthreads && { ! futex } } }
// PR libstdc++/96817
#include <exception>
#include <stdlib.h>
#ifndef _GLIBCXX_HAVE_LINUX_FUTEX
# error "This test requries futex support in the library"
#endif
int init()
{
#if __has_include(<sys/single_threaded.h>)

View File

@ -16,9 +16,11 @@
// <http://www.gnu.org/licenses/>.
// { dg-do run { target c++11 } }
// { dg-skip-if "" { pthread && { ! *-*-*linux* } } }
// { dg-additional-options "-pthread" { target pthread } }
// Currently std::call_once is broken for gthreads targets without futexes:
// { dg-skip-if "see PR 66146" { gthreads && { ! futex } } }
#include <mutex>
#include <cstdlib>
#include <testsuite_hooks.h>

View File

@ -1613,6 +1613,38 @@ proc check_effective_target_tbb-backend { } {
}]
}
# Return 1 if futex syscall is available
proc check_effective_target_futex { } {
return [check_v3_target_prop_cached et_futex {
# Set up and compile a C++ test program that depends on tbb
set src futex[pid].cc
set exe futex[pid].x
set f [open $src "w"]
puts $f "#include <bits/c++config.h>"
puts $f "#if ! _GLIBCXX_HAVE_LINUX_FUTEX"
puts $f "# error No futex syscall available"
puts $f "#endif"
close $f
set lines [v3_target_compile $src /dev/null preprocess ""]
file delete $src
if [string match "" $lines] {
# No error message, preprocessing succeeded.
verbose "check_v3_futex: `1'" 2
return 1
}
verbose "check_v3_futex: `0'" 2
return 0
}]
}
# Return 1 if futex syscall is available
proc check_effective_target_gthreads { } {
return [check_v3_target_gthreads_timed]
}
set additional_prunes ""
if { [info exists env(GCC_RUNTEST_PARALLELIZE_DIR)] \