From: Jonathan Wakely Date: Mon, 26 Feb 2024 13:17:32 +0000 (+0000) Subject: libstdc++: Do not define lock-free atomic aliases if not fully lock-free [PR114103] X-Git-Tag: basepoints/gcc-15~768 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e162b2ff52c5e20f6624ff6b66845fe573cef183;p=thirdparty%2Fgcc.git libstdc++: Do not define lock-free atomic aliases if not fully lock-free [PR114103] The whole point of these typedefs is to guarantee lock-freedom, so if the target has no such types, we shouldn't defined the typedefs at all. libstdc++-v3/ChangeLog: PR libstdc++/114103 * include/bits/version.def (atomic_lock_free_type_aliases): Add extra_cond to check for at least one always-lock-free type. * include/bits/version.h: Regenerate. * include/std/atomic (atomic_signed_lock_free) (atomic_unsigned_lock_free): Only use always-lock-free types. * src/c++20/tzdb.cc (time_zone::_Impl::RulesCounter): Don't use atomic counter if lock-free aliases aren't available. * testsuite/29_atomics/atomic/lock_free_aliases.cc: XFAIL for targets without lock-free word-size compare_exchange. --- diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index 502961eb2699..d298420121b8 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -739,6 +739,7 @@ ftms = { values = { v = 201907; cxxmin = 20; + extra_cond = "(__GCC_ATOMIC_INT_LOCK_FREE | __GCC_ATOMIC_LONG_LOCK_FREE | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2"; }; }; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index 7a6fbd35e2ef..9107b45a4841 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -819,7 +819,7 @@ #undef __glibcxx_want_atomic_float #if !defined(__cpp_lib_atomic_lock_free_type_aliases) -# if (__cplusplus >= 202002L) +# if (__cplusplus >= 202002L) && ((__GCC_ATOMIC_INT_LOCK_FREE | __GCC_ATOMIC_LONG_LOCK_FREE | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2) # define __glibcxx_atomic_lock_free_type_aliases 201907L # if defined(__glibcxx_want_all) || defined(__glibcxx_want_atomic_lock_free_type_aliases) # define __cpp_lib_atomic_lock_free_type_aliases 201907L diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index 559f8370459e..1462cf5ec23f 100644 --- a/libstdc++-v3/include/std/atomic +++ b/libstdc++-v3/include/std/atomic @@ -1774,13 +1774,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = atomic>; using atomic_unsigned_lock_free = atomic>; -# elif ATOMIC_INT_LOCK_FREE || !(ATOMIC_LONG_LOCK_FREE || ATOMIC_CHAR_LOCK_FREE) +# elif ATOMIC_INT_LOCK_FREE == 2 using atomic_signed_lock_free = atomic; using atomic_unsigned_lock_free = atomic; -# elif ATOMIC_LONG_LOCK_FREE +# elif ATOMIC_LONG_LOCK_FREE == 2 using atomic_signed_lock_free = atomic; using atomic_unsigned_lock_free = atomic; -# elif ATOMIC_CHAR_LOCK_FREE +# elif ATOMIC_CHAR_LOCK_FREE == 2 using atomic_signed_lock_free = atomic; using atomic_unsigned_lock_free = atomic; # else diff --git a/libstdc++-v3/src/c++20/tzdb.cc b/libstdc++-v3/src/c++20/tzdb.cc index e03f4a5c32ac..890a4c53e2d4 100644 --- a/libstdc++-v3/src/c++20/tzdb.cc +++ b/libstdc++-v3/src/c++20/tzdb.cc @@ -651,7 +651,7 @@ namespace std::chrono template requires _Tp::is_always_lock_free struct RulesCounter<_Tp> { - atomic_signed_lock_free counter{0}; + _Tp counter{0}; void increment() @@ -703,7 +703,12 @@ namespace std::chrono }; #endif // __GTHREADS && __cpp_lib_atomic_wait +#if __cpp_lib_atomic_lock_free_type_aliases RulesCounter rules_counter; +#else + RulesCounter rules_counter; +#endif + #else // TZDB_DISABLED _Impl(weak_ptr) { } struct { diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/lock_free_aliases.cc b/libstdc++-v3/testsuite/29_atomics/atomic/lock_free_aliases.cc index 372a63129ff7..489d181d136f 100644 --- a/libstdc++-v3/testsuite/29_atomics/atomic/lock_free_aliases.cc +++ b/libstdc++-v3/testsuite/29_atomics/atomic/lock_free_aliases.cc @@ -1,5 +1,6 @@ // { dg-do compile { target c++20 } } // { dg-add-options no_pch } +// { dg-require-atomic-cmpxchg-word "PR libstdc++/114103" } #include