Some targets like arm-eabi with newlib and default settings rely on
__sync_synchronize() to ensure synchronization. Newlib does not
implement it by default, to make users aware they have to take special
care.
This makes a few tests fail to link.
This patch adds a new thread_fence effective target (similar to the
corresponding one in libstdc++ testsuite), and uses it in the tests
that need it, making them UNSUPPORTED instead of FAIL and UNRESOLVED.
2023-09-10 Christophe Lyon <christophe.lyon@linaro.org>
gcc/
* doc/sourcebuild.texi (Other attributes): Document thread_fence
effective-target.
gcc/testsuite/
* g++.dg/init/array54.C: Require thread_fence.
* gcc.dg/c2x-nullptr-1.c: Likewise.
* gcc.dg/pr103721-2.c: Likewise.
* lib/target-supports.exp (check_effective_target_thread_fence):
New.
Compiler and linker support link-time optimization relocatable linking
with @option{-r} and @option{-flto} options.
+@item thread_fence
+Target implements @code{__atomic_thread_fence} without relying on
+non-implemented @code{__sync_synchronize()}.
+
@item naked_functions
Target supports the @code{naked} function attribute.
// PR c++/90947
// { dg-do run { target c++11 } }
+// { dg-require-effective-target thread_fence }
#include <atomic>
/* Test valid usage of C23 nullptr. */
/* { dg-do run } */
+// { dg-require-effective-target thread_fence }
/* { dg-options "-std=c2x -pedantic-errors -Wall -Wextra -Wno-unused-variable" } */
#include <stdarg.h>
// { dg-do run }
+// { dg-require-effective-target thread_fence }
// { dg-options "-O2" }
extern void abort ();
|| [check_effective_target_mips_llsc] }}]
}
+# Return 1 if thread_fence does not rely on __sync_synchronize
+# library function
+
+proc check_effective_target_thread_fence {} {
+ return [check_no_compiler_messages thread_fence executable {
+ int main () {
+ __atomic_thread_fence (__ATOMIC_SEQ_CST);
+ return 0;
+ }
+ } ""]
+}
+
# Return 1 if the target uses a ColdFire FPU.
proc check_effective_target_coldfire_fpu { } {