[libcxx-commits] [libcxx] [libc++][NFC] Assume that __GCC_{CON, DE}STRUCTIVE_SIZE are available (PR #171625)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Dec 10 06:22:58 PST 2025
https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/171625
Clang provides these macros since LLVM 19, so we can assume they are available.
>From 5a4a2c5812117084f674502f00e326f94bd9fec5 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Wed, 10 Dec 2025 15:22:05 +0100
Subject: [PATCH] [libc++][NFC] Assume that __GCC_{CON,DE}STRUCTIVE_SIZE are
available
---
libcxx/include/__new/interference_size.h | 4 --
libcxx/include/version | 4 +-
libcxx/modules/std/new.inc | 2 -
libcxx/src/atomic.cpp | 14 ++--
.../new.version.compile.pass.cpp | 64 ++++++-------------
.../version.version.compile.pass.cpp | 64 ++++++-------------
.../generate_feature_test_macro_components.py | 2 -
7 files changed, 45 insertions(+), 109 deletions(-)
diff --git a/libcxx/include/__new/interference_size.h b/libcxx/include/__new/interference_size.h
index d326c43a33203..591d0ab40535f 100644
--- a/libcxx/include/__new/interference_size.h
+++ b/libcxx/include/__new/interference_size.h
@@ -20,13 +20,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD
#if _LIBCPP_STD_VER >= 17
-# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
-
inline constexpr size_t hardware_destructive_interference_size = __GCC_DESTRUCTIVE_SIZE;
inline constexpr size_t hardware_constructive_interference_size = __GCC_CONSTRUCTIVE_SIZE;
-# endif // defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
-
#endif // _LIBCPP_STD_VER >= 17
_LIBCPP_END_NAMESPACE_STD
diff --git a/libcxx/include/version b/libcxx/include/version
index 05532ea731ff3..010674f5c6a0a 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -343,9 +343,7 @@ __cpp_lib_void_t 201411L <type_traits>
# define __cpp_lib_filesystem 201703L
# endif
# define __cpp_lib_gcd_lcm 201606L
-# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
-# define __cpp_lib_hardware_interference_size 201703L
-# endif
+# define __cpp_lib_hardware_interference_size 201703L
# define __cpp_lib_has_unique_object_representations 201606L
# define __cpp_lib_hypot 201603L
# define __cpp_lib_incomplete_container_elements 201505L
diff --git a/libcxx/modules/std/new.inc b/libcxx/modules/std/new.inc
index 76d0a29ed98f6..e653b7c5c2a8b 100644
--- a/libcxx/modules/std/new.inc
+++ b/libcxx/modules/std/new.inc
@@ -28,11 +28,9 @@ export namespace std {
// [ptr.launder], pointer optimization barrier
using std::launder;
#if _LIBCPP_STD_VER >= 17
-# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
// [hardware.interference], hardware interference size
using std::hardware_constructive_interference_size;
using std::hardware_destructive_interference_size;
-# endif
#endif // _LIBCPP_STD_VER >= 17
} // namespace std
diff --git a/libcxx/src/atomic.cpp b/libcxx/src/atomic.cpp
index 2b1ebfa177e1c..2b970bd0a9e94 100644
--- a/libcxx/src/atomic.cpp
+++ b/libcxx/src/atomic.cpp
@@ -240,21 +240,14 @@ __contention_wait(__cxx_atomic_contention_t* __waiter_count, void const* __addre
__cxx_atomic_fetch_sub(__waiter_count, __cxx_contention_t(1), memory_order_release);
}
-#if defined(__APPLE__) && defined(__aarch64__)
-static constexpr size_t __cache_line_size = 128;
-#elif defined(__cpp_lib_hardware_interference_size)
-static constexpr size_t __cache_line_size = std::hardware_constructive_interference_size;
-#else
-static constexpr size_t __cache_line_size = 64;
-#endif
-
static constexpr size_t __contention_table_size = (1 << 8); /* < there's no magic in this number */
static constexpr hash<void const*> __contention_hasher;
// Waiter count table for all atomics with the correct size that use itself as the wait/notify address.
-struct alignas(__cache_line_size) /* aim to avoid false sharing */ __contention_state_native {
+struct alignas(
+ std::hardware_constructive_interference_size) /* aim to avoid false sharing */ __contention_state_native {
__cxx_atomic_contention_t __waiter_count;
constexpr __contention_state_native() : __waiter_count(0) {}
};
@@ -268,7 +261,8 @@ static __cxx_atomic_contention_t* __get_native_waiter_count(void const* p) {
// Global contention table for all atomics with the wrong size that use the global table's atomic as wait/notify
// address.
-struct alignas(__cache_line_size) /* aim to avoid false sharing */ __contention_state_global {
+struct alignas(
+ std::hardware_constructive_interference_size) /* aim to avoid false sharing */ __contention_state_global {
__cxx_atomic_contention_t __waiter_count;
__cxx_atomic_contention_t __platform_state;
constexpr __contention_state_global() : __waiter_count(0), __platform_state(0) {}
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.compile.pass.cpp
index 3797e0966ec31..e3c47327737e0 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.compile.pass.cpp
@@ -64,17 +64,11 @@
# error "__cpp_lib_destroying_delete should not be defined before c++20"
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++17"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++17"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17"
# endif
# ifndef __cpp_lib_launder
@@ -103,17 +97,11 @@
# endif
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++20"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++20"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++20"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++20"
# endif
# ifndef __cpp_lib_launder
@@ -142,17 +130,11 @@
# endif
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++23"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++23"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++23"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++23"
# endif
# ifndef __cpp_lib_launder
@@ -190,17 +172,11 @@
# endif
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++26"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++26"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++26"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++26"
# endif
# ifndef __cpp_lib_launder
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
index 996ec29dce697..8c71b60ed3975 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
@@ -2384,17 +2384,11 @@
# error "__cpp_lib_generic_unordered_lookup should not be defined before c++20"
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++17"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++17"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17"
# endif
# ifndef __cpp_lib_has_unique_object_representations
@@ -3706,17 +3700,11 @@
# error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++20"
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++20"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++20"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++20"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++20"
# endif
# ifndef __cpp_lib_has_unique_object_representations
@@ -5220,17 +5208,11 @@
# error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++23"
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++23"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++23"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++23"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++23"
# endif
# ifndef __cpp_lib_has_unique_object_representations
@@ -7079,17 +7061,11 @@
# error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++26"
# endif
-# if !defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))
-# ifndef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should be defined in c++26"
-# endif
-# if __cpp_lib_hardware_interference_size != 201703L
-# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++26"
-# endif
-# else
-# ifdef __cpp_lib_hardware_interference_size
-# error "__cpp_lib_hardware_interference_size should not be defined when the requirement '!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))' is not met!"
-# endif
+# ifndef __cpp_lib_hardware_interference_size
+# error "__cpp_lib_hardware_interference_size should be defined in c++26"
+# endif
+# if __cpp_lib_hardware_interference_size != 201703L
+# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++26"
# endif
# ifndef __cpp_lib_has_unique_object_representations
diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py
index 0802f865f9406..59b7d740201a4 100644
--- a/libcxx/utils/generate_feature_test_macro_components.py
+++ b/libcxx/utils/generate_feature_test_macro_components.py
@@ -719,8 +719,6 @@ def add_version_header(tc):
{
"name": "__cpp_lib_hardware_interference_size",
"values": {"c++17": 201703},
- "test_suite_guard": "!defined(_LIBCPP_VERSION) || (defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE))",
- "libcxx_guard": "defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)",
"headers": ["new"],
},
{
More information about the libcxx-commits
mailing list