xref: /aosp_15_r20/external/libcxxabi/src/stdlib_new_delete.cpp (revision c05d8e5dc3e10f6ce4317e8bc22cc4a25f55fa94)
1*c05d8e5dSAndroid Build Coastguard Worker //===--------------------- stdlib_new_delete.cpp --------------------------===//
2*c05d8e5dSAndroid Build Coastguard Worker //
3*c05d8e5dSAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*c05d8e5dSAndroid Build Coastguard Worker //
5*c05d8e5dSAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*c05d8e5dSAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*c05d8e5dSAndroid Build Coastguard Worker //
8*c05d8e5dSAndroid Build Coastguard Worker //
9*c05d8e5dSAndroid Build Coastguard Worker // This file implements the new and delete operators.
10*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
11*c05d8e5dSAndroid Build Coastguard Worker 
12*c05d8e5dSAndroid Build Coastguard Worker #define _LIBCPP_BUILDING_LIBRARY
13*c05d8e5dSAndroid Build Coastguard Worker #include "__cxxabi_config.h"
14*c05d8e5dSAndroid Build Coastguard Worker #include <new>
15*c05d8e5dSAndroid Build Coastguard Worker #include <cstdlib>
16*c05d8e5dSAndroid Build Coastguard Worker 
17*c05d8e5dSAndroid Build Coastguard Worker #if !defined(_THROW_BAD_ALLOC) || !defined(_NOEXCEPT) || !defined(_LIBCXXABI_WEAK)
18*c05d8e5dSAndroid Build Coastguard Worker #error The _THROW_BAD_ALLOC, _NOEXCEPT, and _LIBCXXABI_WEAK libc++ macros must \
19*c05d8e5dSAndroid Build Coastguard Worker        already be defined by libc++.
20*c05d8e5dSAndroid Build Coastguard Worker #endif
21*c05d8e5dSAndroid Build Coastguard Worker // Implement all new and delete operators as weak definitions
22*c05d8e5dSAndroid Build Coastguard Worker // in this shared library, so that they can be overridden by programs
23*c05d8e5dSAndroid Build Coastguard Worker // that define non-weak copies of the functions.
24*c05d8e5dSAndroid Build Coastguard Worker 
25*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
26*c05d8e5dSAndroid Build Coastguard Worker void *
operator new(std::size_t size)27*c05d8e5dSAndroid Build Coastguard Worker operator new(std::size_t size) _THROW_BAD_ALLOC
28*c05d8e5dSAndroid Build Coastguard Worker {
29*c05d8e5dSAndroid Build Coastguard Worker     if (size == 0)
30*c05d8e5dSAndroid Build Coastguard Worker         size = 1;
31*c05d8e5dSAndroid Build Coastguard Worker     void* p;
32*c05d8e5dSAndroid Build Coastguard Worker     while ((p = ::malloc(size)) == 0)
33*c05d8e5dSAndroid Build Coastguard Worker     {
34*c05d8e5dSAndroid Build Coastguard Worker         // If malloc fails and there is a new_handler,
35*c05d8e5dSAndroid Build Coastguard Worker         // call it to try free up memory.
36*c05d8e5dSAndroid Build Coastguard Worker         std::new_handler nh = std::get_new_handler();
37*c05d8e5dSAndroid Build Coastguard Worker         if (nh)
38*c05d8e5dSAndroid Build Coastguard Worker             nh();
39*c05d8e5dSAndroid Build Coastguard Worker         else
40*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
41*c05d8e5dSAndroid Build Coastguard Worker             throw std::bad_alloc();
42*c05d8e5dSAndroid Build Coastguard Worker #else
43*c05d8e5dSAndroid Build Coastguard Worker             break;
44*c05d8e5dSAndroid Build Coastguard Worker #endif
45*c05d8e5dSAndroid Build Coastguard Worker     }
46*c05d8e5dSAndroid Build Coastguard Worker     return p;
47*c05d8e5dSAndroid Build Coastguard Worker }
48*c05d8e5dSAndroid Build Coastguard Worker 
49*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
50*c05d8e5dSAndroid Build Coastguard Worker void*
operator new(size_t size,const std::nothrow_t &)51*c05d8e5dSAndroid Build Coastguard Worker operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
52*c05d8e5dSAndroid Build Coastguard Worker {
53*c05d8e5dSAndroid Build Coastguard Worker     void* p = 0;
54*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
55*c05d8e5dSAndroid Build Coastguard Worker     try
56*c05d8e5dSAndroid Build Coastguard Worker     {
57*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
58*c05d8e5dSAndroid Build Coastguard Worker         p = ::operator new(size);
59*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
60*c05d8e5dSAndroid Build Coastguard Worker     }
61*c05d8e5dSAndroid Build Coastguard Worker     catch (...)
62*c05d8e5dSAndroid Build Coastguard Worker     {
63*c05d8e5dSAndroid Build Coastguard Worker     }
64*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
65*c05d8e5dSAndroid Build Coastguard Worker     return p;
66*c05d8e5dSAndroid Build Coastguard Worker }
67*c05d8e5dSAndroid Build Coastguard Worker 
68*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
69*c05d8e5dSAndroid Build Coastguard Worker void*
operator new[](size_t size)70*c05d8e5dSAndroid Build Coastguard Worker operator new[](size_t size) _THROW_BAD_ALLOC
71*c05d8e5dSAndroid Build Coastguard Worker {
72*c05d8e5dSAndroid Build Coastguard Worker     return ::operator new(size);
73*c05d8e5dSAndroid Build Coastguard Worker }
74*c05d8e5dSAndroid Build Coastguard Worker 
75*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
76*c05d8e5dSAndroid Build Coastguard Worker void*
operator new[](size_t size,const std::nothrow_t &)77*c05d8e5dSAndroid Build Coastguard Worker operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
78*c05d8e5dSAndroid Build Coastguard Worker {
79*c05d8e5dSAndroid Build Coastguard Worker     void* p = 0;
80*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
81*c05d8e5dSAndroid Build Coastguard Worker     try
82*c05d8e5dSAndroid Build Coastguard Worker     {
83*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
84*c05d8e5dSAndroid Build Coastguard Worker         p = ::operator new[](size);
85*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
86*c05d8e5dSAndroid Build Coastguard Worker     }
87*c05d8e5dSAndroid Build Coastguard Worker     catch (...)
88*c05d8e5dSAndroid Build Coastguard Worker     {
89*c05d8e5dSAndroid Build Coastguard Worker     }
90*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
91*c05d8e5dSAndroid Build Coastguard Worker     return p;
92*c05d8e5dSAndroid Build Coastguard Worker }
93*c05d8e5dSAndroid Build Coastguard Worker 
94*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
95*c05d8e5dSAndroid Build Coastguard Worker void
operator delete(void * ptr)96*c05d8e5dSAndroid Build Coastguard Worker operator delete(void* ptr) _NOEXCEPT
97*c05d8e5dSAndroid Build Coastguard Worker {
98*c05d8e5dSAndroid Build Coastguard Worker     if (ptr)
99*c05d8e5dSAndroid Build Coastguard Worker         ::free(ptr);
100*c05d8e5dSAndroid Build Coastguard Worker }
101*c05d8e5dSAndroid Build Coastguard Worker 
102*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
103*c05d8e5dSAndroid Build Coastguard Worker void
operator delete(void * ptr,const std::nothrow_t &)104*c05d8e5dSAndroid Build Coastguard Worker operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
105*c05d8e5dSAndroid Build Coastguard Worker {
106*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete(ptr);
107*c05d8e5dSAndroid Build Coastguard Worker }
108*c05d8e5dSAndroid Build Coastguard Worker 
109*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
110*c05d8e5dSAndroid Build Coastguard Worker void
operator delete(void * ptr,size_t)111*c05d8e5dSAndroid Build Coastguard Worker operator delete(void* ptr, size_t) _NOEXCEPT
112*c05d8e5dSAndroid Build Coastguard Worker {
113*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete(ptr);
114*c05d8e5dSAndroid Build Coastguard Worker }
115*c05d8e5dSAndroid Build Coastguard Worker 
116*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
117*c05d8e5dSAndroid Build Coastguard Worker void
operator delete[](void * ptr)118*c05d8e5dSAndroid Build Coastguard Worker operator delete[] (void* ptr) _NOEXCEPT
119*c05d8e5dSAndroid Build Coastguard Worker {
120*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete(ptr);
121*c05d8e5dSAndroid Build Coastguard Worker }
122*c05d8e5dSAndroid Build Coastguard Worker 
123*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
124*c05d8e5dSAndroid Build Coastguard Worker void
operator delete[](void * ptr,const std::nothrow_t &)125*c05d8e5dSAndroid Build Coastguard Worker operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
126*c05d8e5dSAndroid Build Coastguard Worker {
127*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete[](ptr);
128*c05d8e5dSAndroid Build Coastguard Worker }
129*c05d8e5dSAndroid Build Coastguard Worker 
130*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
131*c05d8e5dSAndroid Build Coastguard Worker void
operator delete[](void * ptr,size_t)132*c05d8e5dSAndroid Build Coastguard Worker operator delete[] (void* ptr, size_t) _NOEXCEPT
133*c05d8e5dSAndroid Build Coastguard Worker {
134*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete[](ptr);
135*c05d8e5dSAndroid Build Coastguard Worker }
136*c05d8e5dSAndroid Build Coastguard Worker 
137*c05d8e5dSAndroid Build Coastguard Worker #if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
138*c05d8e5dSAndroid Build Coastguard Worker 
139*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
140*c05d8e5dSAndroid Build Coastguard Worker void *
operator new(std::size_t size,std::align_val_t alignment)141*c05d8e5dSAndroid Build Coastguard Worker operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
142*c05d8e5dSAndroid Build Coastguard Worker {
143*c05d8e5dSAndroid Build Coastguard Worker     if (size == 0)
144*c05d8e5dSAndroid Build Coastguard Worker         size = 1;
145*c05d8e5dSAndroid Build Coastguard Worker     if (static_cast<size_t>(alignment) < sizeof(void*))
146*c05d8e5dSAndroid Build Coastguard Worker       alignment = std::align_val_t(sizeof(void*));
147*c05d8e5dSAndroid Build Coastguard Worker     void* p;
148*c05d8e5dSAndroid Build Coastguard Worker #if defined(_LIBCPP_WIN32API)
149*c05d8e5dSAndroid Build Coastguard Worker     while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
150*c05d8e5dSAndroid Build Coastguard Worker #else
151*c05d8e5dSAndroid Build Coastguard Worker     while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
152*c05d8e5dSAndroid Build Coastguard Worker #endif
153*c05d8e5dSAndroid Build Coastguard Worker     {
154*c05d8e5dSAndroid Build Coastguard Worker         // If posix_memalign fails and there is a new_handler,
155*c05d8e5dSAndroid Build Coastguard Worker         // call it to try free up memory.
156*c05d8e5dSAndroid Build Coastguard Worker         std::new_handler nh = std::get_new_handler();
157*c05d8e5dSAndroid Build Coastguard Worker         if (nh)
158*c05d8e5dSAndroid Build Coastguard Worker             nh();
159*c05d8e5dSAndroid Build Coastguard Worker         else {
160*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
161*c05d8e5dSAndroid Build Coastguard Worker             throw std::bad_alloc();
162*c05d8e5dSAndroid Build Coastguard Worker #else
163*c05d8e5dSAndroid Build Coastguard Worker             p = nullptr; // posix_memalign doesn't initialize 'p' on failure
164*c05d8e5dSAndroid Build Coastguard Worker             break;
165*c05d8e5dSAndroid Build Coastguard Worker #endif
166*c05d8e5dSAndroid Build Coastguard Worker         }
167*c05d8e5dSAndroid Build Coastguard Worker     }
168*c05d8e5dSAndroid Build Coastguard Worker     return p;
169*c05d8e5dSAndroid Build Coastguard Worker }
170*c05d8e5dSAndroid Build Coastguard Worker 
171*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
172*c05d8e5dSAndroid Build Coastguard Worker void*
operator new(size_t size,std::align_val_t alignment,const std::nothrow_t &)173*c05d8e5dSAndroid Build Coastguard Worker operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
174*c05d8e5dSAndroid Build Coastguard Worker {
175*c05d8e5dSAndroid Build Coastguard Worker     void* p = 0;
176*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
177*c05d8e5dSAndroid Build Coastguard Worker     try
178*c05d8e5dSAndroid Build Coastguard Worker     {
179*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
180*c05d8e5dSAndroid Build Coastguard Worker         p = ::operator new(size, alignment);
181*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
182*c05d8e5dSAndroid Build Coastguard Worker     }
183*c05d8e5dSAndroid Build Coastguard Worker     catch (...)
184*c05d8e5dSAndroid Build Coastguard Worker     {
185*c05d8e5dSAndroid Build Coastguard Worker     }
186*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
187*c05d8e5dSAndroid Build Coastguard Worker     return p;
188*c05d8e5dSAndroid Build Coastguard Worker }
189*c05d8e5dSAndroid Build Coastguard Worker 
190*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
191*c05d8e5dSAndroid Build Coastguard Worker void*
operator new[](size_t size,std::align_val_t alignment)192*c05d8e5dSAndroid Build Coastguard Worker operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
193*c05d8e5dSAndroid Build Coastguard Worker {
194*c05d8e5dSAndroid Build Coastguard Worker     return ::operator new(size, alignment);
195*c05d8e5dSAndroid Build Coastguard Worker }
196*c05d8e5dSAndroid Build Coastguard Worker 
197*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
198*c05d8e5dSAndroid Build Coastguard Worker void*
operator new[](size_t size,std::align_val_t alignment,const std::nothrow_t &)199*c05d8e5dSAndroid Build Coastguard Worker operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
200*c05d8e5dSAndroid Build Coastguard Worker {
201*c05d8e5dSAndroid Build Coastguard Worker     void* p = 0;
202*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
203*c05d8e5dSAndroid Build Coastguard Worker     try
204*c05d8e5dSAndroid Build Coastguard Worker     {
205*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
206*c05d8e5dSAndroid Build Coastguard Worker         p = ::operator new[](size, alignment);
207*c05d8e5dSAndroid Build Coastguard Worker #ifndef _LIBCXXABI_NO_EXCEPTIONS
208*c05d8e5dSAndroid Build Coastguard Worker     }
209*c05d8e5dSAndroid Build Coastguard Worker     catch (...)
210*c05d8e5dSAndroid Build Coastguard Worker     {
211*c05d8e5dSAndroid Build Coastguard Worker     }
212*c05d8e5dSAndroid Build Coastguard Worker #endif  // _LIBCXXABI_NO_EXCEPTIONS
213*c05d8e5dSAndroid Build Coastguard Worker     return p;
214*c05d8e5dSAndroid Build Coastguard Worker }
215*c05d8e5dSAndroid Build Coastguard Worker 
216*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
217*c05d8e5dSAndroid Build Coastguard Worker void
operator delete(void * ptr,std::align_val_t)218*c05d8e5dSAndroid Build Coastguard Worker operator delete(void* ptr, std::align_val_t) _NOEXCEPT
219*c05d8e5dSAndroid Build Coastguard Worker {
220*c05d8e5dSAndroid Build Coastguard Worker     if (ptr)
221*c05d8e5dSAndroid Build Coastguard Worker #if defined(_LIBCPP_WIN32API)
222*c05d8e5dSAndroid Build Coastguard Worker         ::_aligned_free(ptr);
223*c05d8e5dSAndroid Build Coastguard Worker #else
224*c05d8e5dSAndroid Build Coastguard Worker         ::free(ptr);
225*c05d8e5dSAndroid Build Coastguard Worker #endif
226*c05d8e5dSAndroid Build Coastguard Worker }
227*c05d8e5dSAndroid Build Coastguard Worker 
228*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
229*c05d8e5dSAndroid Build Coastguard Worker void
operator delete(void * ptr,std::align_val_t alignment,const std::nothrow_t &)230*c05d8e5dSAndroid Build Coastguard Worker operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
231*c05d8e5dSAndroid Build Coastguard Worker {
232*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete(ptr, alignment);
233*c05d8e5dSAndroid Build Coastguard Worker }
234*c05d8e5dSAndroid Build Coastguard Worker 
235*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
236*c05d8e5dSAndroid Build Coastguard Worker void
operator delete(void * ptr,size_t,std::align_val_t alignment)237*c05d8e5dSAndroid Build Coastguard Worker operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
238*c05d8e5dSAndroid Build Coastguard Worker {
239*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete(ptr, alignment);
240*c05d8e5dSAndroid Build Coastguard Worker }
241*c05d8e5dSAndroid Build Coastguard Worker 
242*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
243*c05d8e5dSAndroid Build Coastguard Worker void
operator delete[](void * ptr,std::align_val_t alignment)244*c05d8e5dSAndroid Build Coastguard Worker operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
245*c05d8e5dSAndroid Build Coastguard Worker {
246*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete(ptr, alignment);
247*c05d8e5dSAndroid Build Coastguard Worker }
248*c05d8e5dSAndroid Build Coastguard Worker 
249*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
250*c05d8e5dSAndroid Build Coastguard Worker void
operator delete[](void * ptr,std::align_val_t alignment,const std::nothrow_t &)251*c05d8e5dSAndroid Build Coastguard Worker operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
252*c05d8e5dSAndroid Build Coastguard Worker {
253*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete[](ptr, alignment);
254*c05d8e5dSAndroid Build Coastguard Worker }
255*c05d8e5dSAndroid Build Coastguard Worker 
256*c05d8e5dSAndroid Build Coastguard Worker _LIBCXXABI_WEAK
257*c05d8e5dSAndroid Build Coastguard Worker void
operator delete[](void * ptr,size_t,std::align_val_t alignment)258*c05d8e5dSAndroid Build Coastguard Worker operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
259*c05d8e5dSAndroid Build Coastguard Worker {
260*c05d8e5dSAndroid Build Coastguard Worker     ::operator delete[](ptr, alignment);
261*c05d8e5dSAndroid Build Coastguard Worker }
262*c05d8e5dSAndroid Build Coastguard Worker 
263*c05d8e5dSAndroid Build Coastguard Worker #endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
264