Skip to content

Commit 85a847f

Browse files
authored
[libc++] Simplify features for detecting atomics' support. (#75553)
`non-lockfree-atomics` is very similar to `has-64-bit-atomics`; to simplify, we can have uniform features for atomic types of increasing sizes (`has-128-bit-atomics`, `has-256-bit-atomics`, etc.). `is-lockfree-runtime-function` feature was a workaround for the partial support for large atomic types on older versions of macOS (see https://reviews.llvm.org/D91911). While we still support macOS 10.14, conceptually it's simpler to check for support for all the atomic functionality inside the `has-*-atomics` features, and the workaround is no longer worth the maintenance cost.
1 parent 626fe71 commit 85a847f

36 files changed

+25
-58
lines changed

libcxx/test/libcxx/atomics/atomics.align/align.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//===----------------------------------------------------------------------===//
88
//
99
// UNSUPPORTED: c++03
10-
// REQUIRES: is-lockfree-runtime-function
10+
// REQUIRES: has-128-bit-atomics
1111
// ADDITIONAL_COMPILE_FLAGS: -Wno-psabi
1212
// ... since C++20 std::__atomic_base initializes, so we get a warning about an
1313
// ABI change for vector variants since the constructor code for that is

libcxx/test/libcxx/atomics/atomics.types.generic/atomics.types.float/lockfree.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// static constexpr bool is_always_lock_free = implementation-defined;
1312
// bool is_lock_free() const volatile noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/assign.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// floating-point-type operator=(floating-point-type) volatile noexcept;
1312
// floating-point-type operator=(floating-point-type) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// bool compare_exchange_strong(T& expected, T desired,
1312
// memory_order success, memory_order failure) volatile noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// bool compare_exchange_weak(T& expected, T desired,
1312
// memory_order success, memory_order failure) volatile noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/ctor.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// constexpr atomic() noexcept;
1312
// constexpr atomic(floating-point-type) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/exchange.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// T exchange(T, memory_order = memory_order::seq_cst) volatile noexcept;
1312
// T exchange(T, memory_order = memory_order::seq_cst) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_add.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// UNSUPPORTED: LIBCXX-AIX-FIXME
1010
// XFAIL: !has-64-bit-atomics
11-
// UNSUPPORTED: !non-lockfree-atomics
1211

1312
// https://github.com/llvm/llvm-project/issues/72893
1413
// XFAIL: target={{x86_64-.*}} && tsan

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_sub.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// UNSUPPORTED: LIBCXX-AIX-FIXME
1010
// XFAIL: !has-64-bit-atomics
11-
// UNSUPPORTED: !non-lockfree-atomics
1211

1312
// https://github.com/llvm/llvm-project/issues/72893
1413
// XFAIL: target={{x86_64-.*}} && tsan

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/load.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// floating-point-type load(memory_order = memory_order::seq_cst) volatile noexcept;
1312
// floating-point-type load(memory_order = memory_order::seq_cst) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/lockfree.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// static constexpr bool is_always_lock_free = implementation-defined;
1312
// bool is_lock_free() const volatile noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/notify_all.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// XFAIL: availability-synchronization_library-missing
1010
// UNSUPPORTED: c++03, c++11, c++14, c++17
1111
// XFAIL: !has-64-bit-atomics
12-
// UNSUPPORTED: !non-lockfree-atomics
1312

1413
// void notify_all() volatile noexcept;
1514
// void notify_all() noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/notify_one.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// XFAIL: availability-synchronization_library-missing
1010
// UNSUPPORTED: c++03, c++11, c++14, c++17
1111
// XFAIL: !has-64-bit-atomics
12-
// UNSUPPORTED: !non-lockfree-atomics
1312

1413
// void notify_one() volatile noexcept;
1514
// void notify_one() noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/operator.float.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// operator floating-point-type() volatile noexcept;
1312
// operator floating-point-type() noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/operator.minus_equals.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// UNSUPPORTED: LIBCXX-AIX-FIXME
1010
// XFAIL: !has-64-bit-atomics
11-
// UNSUPPORTED: !non-lockfree-atomics
1211

1312
// floating-point-type operator-=(floating-point-type) volatile noexcept;
1413
// floating-point-type operator-=(floating-point-type) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/operator.plus_equals.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// UNSUPPORTED: LIBCXX-AIX-FIXME
1010
// XFAIL: !has-64-bit-atomics
11-
// UNSUPPORTED: !non-lockfree-atomics
1211

1312
// floating-point-type operator+=(floating-point-type) volatile noexcept;
1413
// floating-point-type operator+=(floating-point-type) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/store.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: !has-64-bit-atomics
10-
// UNSUPPORTED: !non-lockfree-atomics
1110

1211
// void store(floating-point-type, memory_order = memory_order::seq_cst) volatile noexcept;
1312
// void store(floating-point-type, memory_order = memory_order::seq_cst) noexcept;

libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/wait.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// UNSUPPORTED: c++03, c++11, c++14, c++17
99
// XFAIL: availability-synchronization_library-missing
1010
// XFAIL: !has-64-bit-atomics
11-
// UNSUPPORTED: !non-lockfree-atomics
1211

1312
// void wait(T old, memory_order order = memory_order::seq_cst) const volatile noexcept;
1413
// void wait(T old, memory_order order = memory_order::seq_cst) const noexcept;

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010
// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
1111

1212
// <atomic>

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !is-lockfree-runtime-function
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// XFAIL: !non-lockfree-atomics
9+
// XFAIL: !has-128-bit-atomics
1010

1111
// <atomic>
1212

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/atomic_notify_all.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//
99
// UNSUPPORTED: no-threads
1010
// XFAIL: c++03
11-
// XFAIL: !non-lockfree-atomics
11+
// XFAIL: !has-128-bit-atomics
1212

1313
// XFAIL: availability-synchronization_library-missing
1414

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/atomic_notify_one.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//
99
// UNSUPPORTED: no-threads
1010
// XFAIL: c++03
11-
// XFAIL: !non-lockfree-atomics
11+
// XFAIL: !has-128-bit-atomics
1212

1313
// XFAIL: availability-synchronization_library-missing
1414

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/atomic_wait.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//
99
// UNSUPPORTED: no-threads
1010
// XFAIL: c++03
11-
// XFAIL: !non-lockfree-atomics
11+
// XFAIL: !has-128-bit-atomics
1212

1313
// XFAIL: availability-synchronization_library-missing
1414

libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.wait/atomic_wait_explicit.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//
99
// UNSUPPORTED: no-threads
1010
// XFAIL: c++03
11-
// XFAIL: !non-lockfree-atomics
11+
// XFAIL: !has-128-bit-atomics
1212

1313
// XFAIL: availability-synchronization_library-missing
1414

libcxx/test/support/atomic_helpers.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,7 @@ struct TestEachAtomicType {
119119
TestFunctor<UserAtomicType>()();
120120
/*
121121
Note: These aren't going to be lock-free,
122-
so some libatomic.a is necessary. To handle
123-
the case where the support functions are
124-
missing, all tests that use this file should add:
125-
XFAIL: !non-lockfree-atomics
122+
so some libatomic.a is necessary.
126123
*/
127124
TestFunctor<LargeUserAtomicType>()();
128125
/*

libcxx/utils/libcxx/test/features.py

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -183,25 +183,26 @@ def _getAndroidDeviceApi(cfg):
183183
actions=[AddLinkFlag("-latomic")],
184184
),
185185
Feature(
186-
name="non-lockfree-atomics",
186+
name="has-64-bit-atomics",
187187
when=lambda cfg: sourceBuilds(
188188
cfg,
189189
"""
190190
#include <atomic>
191-
struct Large { int storage[100]; };
191+
struct Large { char storage[64/8]; };
192192
std::atomic<Large> x;
193-
int main(int, char**) { (void)x.load(); return 0; }
193+
int main(int, char**) { (void)x.load(); (void)x.is_lock_free(); return 0; }
194194
""",
195195
),
196196
),
197197
Feature(
198-
name="has-64-bit-atomics",
198+
name="has-128-bit-atomics",
199199
when=lambda cfg: sourceBuilds(
200200
cfg,
201201
"""
202202
#include <atomic>
203-
std::atomic_uint64_t x;
204-
int main(int, char**) { (void)x.load(); return 0; }
203+
struct Large { char storage[128/8]; };
204+
std::atomic<Large> x;
205+
int main(int, char**) { (void)x.load(); (void)x.is_lock_free(); return 0; }
205206
""",
206207
),
207208
),
@@ -217,20 +218,6 @@ def _getAndroidDeviceApi(cfg):
217218
""",
218219
),
219220
),
220-
# TODO: Remove this feature once compiler-rt includes __atomic_is_lockfree()
221-
# on all supported platforms.
222-
Feature(
223-
name="is-lockfree-runtime-function",
224-
when=lambda cfg: sourceBuilds(
225-
cfg,
226-
"""
227-
#include <atomic>
228-
struct Large { int storage[100]; };
229-
std::atomic<Large> x;
230-
int main(int, char**) { return x.is_lock_free(); }
231-
""",
232-
),
233-
),
234221
# Check for a Windows UCRT bug (fixed in UCRT/Windows 10.0.20348.0):
235222
# https://developercommunity.visualstudio.com/t/utf-8-locales-break-ctype-functions-for-wchar-type/1653678
236223
Feature(

0 commit comments

Comments
 (0)