[libcxx-commits] [libcxx] [libcxx] Use `aligned_alloc` for testing instead of `posix_memalign` (PR #101748)
Joseph Huber via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Aug 14 10:14:35 PDT 2024
https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/101748
>From 03f3fe2e37f3b7b6b008ff55ea0772a36716208e Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Fri, 2 Aug 2024 13:49:58 -0500
Subject: [PATCH 1/2] [libcxx] Use `aligned_alloc` for testing instead of
`posix_memalign`
Summary:
The `aligned_alloc` function is the C11 replacement for
`posix_memalign`. We should favor the C standard over the POSIX standard
so more C library implementations can run the tests.
---
.../support.dynamic/new_faligned_allocation.pass.cpp | 2 +-
libcxx/test/support/count_new.h | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/libcxx/test/libcxx/language.support/support.dynamic/new_faligned_allocation.pass.cpp b/libcxx/test/libcxx/language.support/support.dynamic/new_faligned_allocation.pass.cpp
index 69c46f00fb65dc..87f4783e12973e 100644
--- a/libcxx/test/libcxx/language.support/support.dynamic/new_faligned_allocation.pass.cpp
+++ b/libcxx/test/libcxx/language.support/support.dynamic/new_faligned_allocation.pass.cpp
@@ -76,7 +76,7 @@ int main(int, char**) {
test_allocations(64, 64);
// Size being a multiple of alignment also needs to be supported.
test_allocations(64, 32);
- // When aligned allocation is implemented using posix_memalign,
+ // When aligned allocation is implemented using aligned_alloc,
// that function requires a minimum alignment of sizeof(void*).
// Check that we can also create overaligned allocations with
// an alignment argument less than sizeof(void*).
diff --git a/libcxx/test/support/count_new.h b/libcxx/test/support/count_new.h
index 2298c4fd63e845..35991b7dd6a7a5 100644
--- a/libcxx/test/support/count_new.h
+++ b/libcxx/test/support/count_new.h
@@ -460,6 +460,9 @@ inline void* allocate_aligned_impl(std::size_t size, std::align_val_t align) {
void* ret = nullptr;
# ifdef USE_ALIGNED_ALLOC
ret = _aligned_malloc(size, alignment);
+# elif TEST_STD_VER >= 17
+ size_t rounded_size = (size + alignment - 1) & ~(alignment - 1);
+ ret = aligned_alloc(alignment, size > rounded_size ? size : rounded_size);
# else
assert(posix_memalign(&ret, std::max(alignment, sizeof(void*)), size) != EINVAL);
# endif
>From 562b6fa2f7be21a85ca716e0fc141a2060300f78 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Wed, 14 Aug 2024 12:14:15 -0500
Subject: [PATCH 2/2] Fix check
---
libcxx/test/support/count_new.h | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/libcxx/test/support/count_new.h b/libcxx/test/support/count_new.h
index 35991b7dd6a7a5..61c8ca16ab0d04 100644
--- a/libcxx/test/support/count_new.h
+++ b/libcxx/test/support/count_new.h
@@ -455,12 +455,21 @@ void operator delete[](void* p, std::nothrow_t const&) TEST_NOEXCEPT {
# define USE_ALIGNED_ALLOC
# endif
+# if defined(__APPLE__)
+# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500)
+# define TEST_HAS_NO_C11_ALIGNED_ALLOC
+# endif
+# elif defined(__ANDROID__) && __ANDROID_API__ < 28
+# define TEST_HAS_NO_C11_ALIGNED_ALLOC
+# endif
+
inline void* allocate_aligned_impl(std::size_t size, std::align_val_t align) {
const std::size_t alignment = static_cast<std::size_t>(align);
void* ret = nullptr;
# ifdef USE_ALIGNED_ALLOC
ret = _aligned_malloc(size, alignment);
-# elif TEST_STD_VER >= 17
+# elif TEST_STD_VER >= 17 && !defined(TEST_HAS_NO_C11_ALIGNED_ALLOC)
size_t rounded_size = (size + alignment - 1) & ~(alignment - 1);
ret = aligned_alloc(alignment, size > rounded_size ? size : rounded_size);
# else
More information about the libcxx-commits
mailing list