[libcxx-commits] [libcxx] [libc++] Properly implement array cookies in the ARM ABI (PR #160182)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Oct 9 09:11:19 PDT 2025
================
@@ -26,28 +27,100 @@ _LIBCPP_BEGIN_NAMESPACE_STD
// Trait representing whether a type requires an array cookie at the start of its allocation when
// allocated as `new T[n]` and deallocated as `delete[] array`.
//
-// Under the Itanium C++ ABI [1], we know that an array cookie is available unless `T` is trivially
-// destructible and the call to `operator delete[]` is not a sized operator delete. Under ABIs other
-// than the Itanium ABI, we assume there are no array cookies.
+// Under the Itanium C++ ABI [1] and the ARM ABI which derives from it, we know that an array cookie is available
+// unless `T` is trivially destructible and the call to `operator delete[]` is not a sized operator delete. Under
+// other ABIs, we assume there are no array cookies.
//
// [1]: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies
-#ifdef _LIBCPP_ABI_ITANIUM
+#if defined(_LIBCPP_ABI_ITANIUM) || defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES)
// TODO: Use a builtin instead
-// TODO: We should factor in the choice of the usual deallocation function in this determination.
+// TODO: We should factor in the choice of the usual deallocation function in this determination:
+// a cookie may be available in more cases but we ignore those for now.
template <class _Tp>
struct __has_array_cookie : _Not<is_trivially_destructible<_Tp> > {};
#else
template <class _Tp>
struct __has_array_cookie : false_type {};
#endif
+template <class _Tp, bool _HasPadding = (_LIBCPP_PREFERRED_ALIGNOF(_Tp) > sizeof(size_t))>
----------------
ldionne wrote:
Yes: https://github.com/llvm/llvm-project/blob/36bce68b97316363085ae3681e8dde33a62fc9b1/clang/lib/CodeGen/ItaniumCXXABI.cpp#L2513
I suspect that's because the Itanium C++ ABI document predates the point where Clang changed `alignof` to be the ABI alignment instead of the preferred alignment (which happened several years ago IIRC).
Looks like `long long` on x86-64 when compiling with `-m32` is a type where these two alignments differ. However, wrapping that into a struct makes the ABI and preferred alignments the same again. So I'm not sure how to actually test that, suggestions welcome. https://godbolt.org/z/hP44Ed79E
https://github.com/llvm/llvm-project/pull/160182
More information about the libcxx-commits
mailing list