File tree Expand file tree Collapse file tree 1 file changed +10
-8
lines changed
Expand file tree Collapse file tree 1 file changed +10
-8
lines changed Original file line number Diff line number Diff line change @@ -91,21 +91,23 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie([
9191
9292#if defined(_LIBCPP_ABI_ITANIUM)
9393
94- size_t const * __cookie = reinterpret_cast <size_t const *>(__ptr) - 1 ;
95- return *__cookie;
94+ using _ArrayCookie = size_t ;
95+ char const * __allocation_start = reinterpret_cast <char const *>(__ptr) - sizeof (_ArrayCookie);
96+ char __cookie[sizeof (_ArrayCookie)];
97+ __builtin_memcpy (&__cookie, __allocation_start, sizeof (_ArrayCookie)); // necessary to avoid violating strict aliasing
98+ return *reinterpret_cast <_ArrayCookie const *>(&__cookie);
9699
97100#elif defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES)
98101
99- struct _ArrayCookie {
102+ struct [[ __gnu__::__aligned__ ( _LIBCPP_ALIGNOF (_Tp))]] _ArrayCookie {
100103 size_t __element_size;
101104 size_t __element_count;
102105 };
103106
104- size_t __cookie_size_with_padding = // max(sizeof(_ArrayCookie), alignof(T))
105- sizeof (_ArrayCookie) < _LIBCPP_ALIGNOF (_Tp) ? _LIBCPP_ALIGNOF (_Tp) : sizeof (_ArrayCookie);
106- char const * __allocation_start = reinterpret_cast <char const *>(__ptr) - __cookie_size_with_padding;
107- _ArrayCookie const * __cookie = reinterpret_cast <_ArrayCookie const *>(__allocation_start);
108- return __cookie->__element_count ;
107+ char const * __allocation_start = reinterpret_cast <char const *>(__ptr) - sizeof (_ArrayCookie);
108+ char __cookie[sizeof (_ArrayCookie)];
109+ __builtin_memcpy (&__cookie, __allocation_start, sizeof (_ArrayCookie)); // necessary to avoid violating strict aliasing
110+ return reinterpret_cast <_ArrayCookie const *>(&__cookie)->__element_count ;
109111
110112#else
111113
You can’t perform that action at this time.
0 commit comments