xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision e4864e0b)
13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===//
23e519524SHoward Hinnant //
35b08a8a4SHoward Hinnant //                     The LLVM Compiler Infrastructure
43e519524SHoward Hinnant //
5412dbebeSHoward Hinnant // This file is dual licensed under the MIT and the University of Illinois Open
6412dbebeSHoward Hinnant // Source Licenses. See LICENSE.TXT for details.
73e519524SHoward Hinnant //
83e519524SHoward Hinnant //===----------------------------------------------------------------------===//
93e519524SHoward Hinnant 
106e8ebb2cSMarshall Clow #define _LIBCPP_BUILDING_NEW
116e8ebb2cSMarshall Clow 
12111e0cbeSNick Kledzik #include <stdlib.h>
13111e0cbeSNick Kledzik 
143e519524SHoward Hinnant #include "new"
153e519524SHoward Hinnant 
16dce0696aSHoward Hinnant #ifndef __has_include
17dce0696aSHoward Hinnant #define __has_include(inc) 0
18dce0696aSHoward Hinnant #endif
19dce0696aSHoward Hinnant 
2022b131ffSEric Fiselier #if defined(__APPLE__) && !defined(LIBCXXRT)
21128ba719SHoward Hinnant     #include <cxxabi.h>
222c9c6a57SHoward Hinnant 
232c9c6a57SHoward Hinnant     #ifndef _LIBCPPABI_VERSION
24111e0cbeSNick Kledzik         // On Darwin, there are two STL shared libraries and a lower level ABI
25c1cf9818SMarshall Clow         // shared library.  The global holding the current new handler is
26111e0cbeSNick Kledzik         // in the ABI library and named __cxa_new_handler.
27111e0cbeSNick Kledzik         #define __new_handler __cxxabiapple::__cxa_new_handler
282c9c6a57SHoward Hinnant     #endif
29940e211cSHoward Hinnant #else  // __APPLE__
30dce0696aSHoward Hinnant     #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
31dce0696aSHoward Hinnant         #include <cxxabi.h>
32dce0696aSHoward Hinnant     #endif  // __has_include(<cxxabi.h>)
33926aa5f4SPeter Collingbourne     #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
34111e0cbeSNick Kledzik         static std::new_handler __new_handler;
35dce0696aSHoward Hinnant     #endif  // _LIBCPPABI_VERSION
36111e0cbeSNick Kledzik #endif
37111e0cbeSNick Kledzik 
38926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
39926aa5f4SPeter Collingbourne 
40111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
41111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
42111e0cbeSNick Kledzik // that define non-weak copies of the functions.
43111e0cbeSNick Kledzik 
4432f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
45111e0cbeSNick Kledzik void *
46fafca58cSHoward Hinnant operator new(std::size_t size)
4793a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
4893a16c0fSHoward Hinnant     throw(std::bad_alloc)
4993a16c0fSHoward Hinnant #endif
50111e0cbeSNick Kledzik {
51111e0cbeSNick Kledzik     if (size == 0)
52111e0cbeSNick Kledzik         size = 1;
53111e0cbeSNick Kledzik     void* p;
54111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
55111e0cbeSNick Kledzik     {
56111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
57111e0cbeSNick Kledzik         // call it to try free up memory.
5875357bcdSHoward Hinnant         std::new_handler nh = std::get_new_handler();
59816cb897SHoward Hinnant         if (nh)
60816cb897SHoward Hinnant             nh();
61111e0cbeSNick Kledzik         else
6254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
63111e0cbeSNick Kledzik             throw std::bad_alloc();
6454b409fdSHoward Hinnant #else
6554b409fdSHoward Hinnant             break;
6654b409fdSHoward Hinnant #endif
67111e0cbeSNick Kledzik     }
68111e0cbeSNick Kledzik     return p;
69111e0cbeSNick Kledzik }
70111e0cbeSNick Kledzik 
7132f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
72111e0cbeSNick Kledzik void*
73fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
74111e0cbeSNick Kledzik {
75111e0cbeSNick Kledzik     void* p = 0;
7654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
77111e0cbeSNick Kledzik     try
78111e0cbeSNick Kledzik     {
79940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
80111e0cbeSNick Kledzik         p = ::operator new(size);
8154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
82111e0cbeSNick Kledzik     }
83111e0cbeSNick Kledzik     catch (...)
84111e0cbeSNick Kledzik     {
85111e0cbeSNick Kledzik     }
86940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
87111e0cbeSNick Kledzik     return p;
88111e0cbeSNick Kledzik }
89111e0cbeSNick Kledzik 
9032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
91111e0cbeSNick Kledzik void*
92fafca58cSHoward Hinnant operator new[](size_t size)
9393a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
9493a16c0fSHoward Hinnant     throw(std::bad_alloc)
9593a16c0fSHoward Hinnant #endif
96111e0cbeSNick Kledzik {
97111e0cbeSNick Kledzik     return ::operator new(size);
98111e0cbeSNick Kledzik }
99111e0cbeSNick Kledzik 
10032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
101111e0cbeSNick Kledzik void*
102c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
103111e0cbeSNick Kledzik {
104111e0cbeSNick Kledzik     void* p = 0;
10554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
106111e0cbeSNick Kledzik     try
107111e0cbeSNick Kledzik     {
108940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
109111e0cbeSNick Kledzik         p = ::operator new[](size);
11054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
111111e0cbeSNick Kledzik     }
112111e0cbeSNick Kledzik     catch (...)
113111e0cbeSNick Kledzik     {
114111e0cbeSNick Kledzik     }
115940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
116111e0cbeSNick Kledzik     return p;
117111e0cbeSNick Kledzik }
118111e0cbeSNick Kledzik 
11932f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
120111e0cbeSNick Kledzik void
121fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT
122111e0cbeSNick Kledzik {
123111e0cbeSNick Kledzik     if (ptr)
124111e0cbeSNick Kledzik         ::free(ptr);
125111e0cbeSNick Kledzik }
126111e0cbeSNick Kledzik 
12732f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
128111e0cbeSNick Kledzik void
129fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
130111e0cbeSNick Kledzik {
131111e0cbeSNick Kledzik     ::operator delete(ptr);
132111e0cbeSNick Kledzik }
133111e0cbeSNick Kledzik 
13432f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
135111e0cbeSNick Kledzik void
136*e4864e0bSLarisse Voufo operator delete(void* ptr, size_t) _NOEXCEPT
137d36bd700SLarisse Voufo {
138d36bd700SLarisse Voufo     ::operator delete(ptr);
139d36bd700SLarisse Voufo }
140d36bd700SLarisse Voufo 
141d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
142d36bd700SLarisse Voufo void
143*e4864e0bSLarisse Voufo operator delete(void* ptr, size_t, const std::nothrow_t& nt) _NOEXCEPT
144*e4864e0bSLarisse Voufo {
145*e4864e0bSLarisse Voufo     ::operator delete(ptr, nt);
146*e4864e0bSLarisse Voufo }
147*e4864e0bSLarisse Voufo 
148*e4864e0bSLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
149*e4864e0bSLarisse Voufo void
150fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT
151111e0cbeSNick Kledzik {
152111e0cbeSNick Kledzik     ::operator delete(ptr);
153111e0cbeSNick Kledzik }
154111e0cbeSNick Kledzik 
15532f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
156111e0cbeSNick Kledzik void
157fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
158111e0cbeSNick Kledzik {
159111e0cbeSNick Kledzik     ::operator delete[](ptr);
160111e0cbeSNick Kledzik }
161111e0cbeSNick Kledzik 
162d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
163d36bd700SLarisse Voufo void
164*e4864e0bSLarisse Voufo operator delete[] (void* ptr, size_t) _NOEXCEPT
165d36bd700SLarisse Voufo {
166d36bd700SLarisse Voufo     ::operator delete[](ptr);
167d36bd700SLarisse Voufo }
168d36bd700SLarisse Voufo 
169*e4864e0bSLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
170*e4864e0bSLarisse Voufo void
171*e4864e0bSLarisse Voufo operator delete[] (void* ptr, size_t, const std::nothrow_t& nt) _NOEXCEPT
172*e4864e0bSLarisse Voufo {
173*e4864e0bSLarisse Voufo     ::operator delete[](ptr, nt);
174*e4864e0bSLarisse Voufo }
175*e4864e0bSLarisse Voufo 
176926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__
177926aa5f4SPeter Collingbourne 
1783e519524SHoward Hinnant namespace std
1793e519524SHoward Hinnant {
1803e519524SHoward Hinnant 
181926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
18262713dacSNick Kledzik const nothrow_t nothrow = {};
183926aa5f4SPeter Collingbourne #endif
18462713dacSNick Kledzik 
1852c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION
1862c9c6a57SHoward Hinnant 
187926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
188926aa5f4SPeter Collingbourne 
18962713dacSNick Kledzik new_handler
190fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT
19162713dacSNick Kledzik {
1921596c453SHoward Hinnant     return __sync_lock_test_and_set(&__new_handler, handler);
1931596c453SHoward Hinnant }
1941596c453SHoward Hinnant 
1951596c453SHoward Hinnant new_handler
196fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT
1971596c453SHoward Hinnant {
198634b9dd7SJoerg Sonnenberger     return __sync_fetch_and_add(&__new_handler, nullptr);
19962713dacSNick Kledzik }
20062713dacSNick Kledzik 
201926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__
202926aa5f4SPeter Collingbourne 
203e1da544eSDavid Chisnall #ifndef LIBCXXRT
204e1da544eSDavid Chisnall 
205fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT
206111e0cbeSNick Kledzik {
207111e0cbeSNick Kledzik }
208111e0cbeSNick Kledzik 
209926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
210926aa5f4SPeter Collingbourne 
211fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT
212111e0cbeSNick Kledzik {
213111e0cbeSNick Kledzik }
214111e0cbeSNick Kledzik 
215111e0cbeSNick Kledzik const char*
216fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT
217111e0cbeSNick Kledzik {
218111e0cbeSNick Kledzik     return "std::bad_alloc";
219111e0cbeSNick Kledzik }
220111e0cbeSNick Kledzik 
221926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__
222926aa5f4SPeter Collingbourne 
223fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT
224111e0cbeSNick Kledzik {
225111e0cbeSNick Kledzik }
226111e0cbeSNick Kledzik 
227fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT
2283e519524SHoward Hinnant {
2293e519524SHoward Hinnant }
2303e519524SHoward Hinnant 
2311d558b84SEric Fiselier const char*
2321d558b84SEric Fiselier bad_array_new_length::what() const _NOEXCEPT
2331d558b84SEric Fiselier {
2341d558b84SEric Fiselier     return "bad_array_new_length";
2351d558b84SEric Fiselier }
2361d558b84SEric Fiselier 
237fd465fe5SEric Fiselier #endif //LIBCXXRT
238fd465fe5SEric Fiselier 
2393e519524SHoward Hinnant const char*
2406e8ebb2cSMarshall Clow bad_array_length::what() const _NOEXCEPT
2416e8ebb2cSMarshall Clow {
2426e8ebb2cSMarshall Clow     return "bad_array_length";
2436e8ebb2cSMarshall Clow }
2446e8ebb2cSMarshall Clow 
2456e8ebb2cSMarshall Clow bad_array_length::bad_array_length() _NOEXCEPT
2466e8ebb2cSMarshall Clow {
2476e8ebb2cSMarshall Clow }
2486e8ebb2cSMarshall Clow 
2496e8ebb2cSMarshall Clow bad_array_length::~bad_array_length() _NOEXCEPT
2506e8ebb2cSMarshall Clow {
2516e8ebb2cSMarshall Clow }
2526e8ebb2cSMarshall Clow 
2536e8ebb2cSMarshall Clow #endif // _LIBCPPABI_VERSION
2542c9c6a57SHoward Hinnant 
25526dd09e5SPeter Collingbourne #ifndef LIBSTDCXX
25626dd09e5SPeter Collingbourne 
2573e519524SHoward Hinnant void
2583e519524SHoward Hinnant __throw_bad_alloc()
2593e519524SHoward Hinnant {
26054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
2613e519524SHoward Hinnant     throw bad_alloc();
26254b409fdSHoward Hinnant #endif
2633e519524SHoward Hinnant }
2643e519524SHoward Hinnant 
26526dd09e5SPeter Collingbourne #endif // !LIBSTDCXX
26626dd09e5SPeter Collingbourne 
2673e519524SHoward Hinnant }  // std
268