[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