xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 929df471)
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 
1622b131ffSEric Fiselier #if defined(__APPLE__) && !defined(LIBCXXRT)
17128ba719SHoward Hinnant     #include <cxxabi.h>
182c9c6a57SHoward Hinnant 
192c9c6a57SHoward Hinnant     #ifndef _LIBCPPABI_VERSION
20111e0cbeSNick Kledzik         // On Darwin, there are two STL shared libraries and a lower level ABI
21c1cf9818SMarshall Clow         // shared library.  The global holding the current new handler is
22111e0cbeSNick Kledzik         // in the ABI library and named __cxa_new_handler.
23111e0cbeSNick Kledzik         #define __new_handler __cxxabiapple::__cxa_new_handler
242c9c6a57SHoward Hinnant     #endif
25940e211cSHoward Hinnant #else  // __APPLE__
26*929df471SBenjamin Kramer     #if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI)
27dce0696aSHoward Hinnant         #include <cxxabi.h>
28*929df471SBenjamin Kramer     #endif  // defined(LIBCXX_BUILDING_LIBCXXABI)
29926aa5f4SPeter Collingbourne     #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
30111e0cbeSNick Kledzik         static std::new_handler __new_handler;
31dce0696aSHoward Hinnant     #endif  // _LIBCPPABI_VERSION
32111e0cbeSNick Kledzik #endif
33111e0cbeSNick Kledzik 
34926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
35926aa5f4SPeter Collingbourne 
36111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
3710fe4209SEric Fiselier // in this shared library, so that they can be overridden by programs
38111e0cbeSNick Kledzik // that define non-weak copies of the functions.
39111e0cbeSNick Kledzik 
4032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
41111e0cbeSNick Kledzik void *
42fafca58cSHoward Hinnant operator new(std::size_t size)
4393a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
4493a16c0fSHoward Hinnant     throw(std::bad_alloc)
4593a16c0fSHoward Hinnant #endif
46111e0cbeSNick Kledzik {
47111e0cbeSNick Kledzik     if (size == 0)
48111e0cbeSNick Kledzik         size = 1;
49111e0cbeSNick Kledzik     void* p;
50111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
51111e0cbeSNick Kledzik     {
52111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
53111e0cbeSNick Kledzik         // call it to try free up memory.
5475357bcdSHoward Hinnant         std::new_handler nh = std::get_new_handler();
55816cb897SHoward Hinnant         if (nh)
56816cb897SHoward Hinnant             nh();
57111e0cbeSNick Kledzik         else
5854b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
59111e0cbeSNick Kledzik             throw std::bad_alloc();
6054b409fdSHoward Hinnant #else
6154b409fdSHoward Hinnant             break;
6254b409fdSHoward Hinnant #endif
63111e0cbeSNick Kledzik     }
64111e0cbeSNick Kledzik     return p;
65111e0cbeSNick Kledzik }
66111e0cbeSNick Kledzik 
6732f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
68111e0cbeSNick Kledzik void*
69fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
70111e0cbeSNick Kledzik {
71111e0cbeSNick Kledzik     void* p = 0;
7254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
73111e0cbeSNick Kledzik     try
74111e0cbeSNick Kledzik     {
75940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
76111e0cbeSNick Kledzik         p = ::operator new(size);
7754b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
78111e0cbeSNick Kledzik     }
79111e0cbeSNick Kledzik     catch (...)
80111e0cbeSNick Kledzik     {
81111e0cbeSNick Kledzik     }
82940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
83111e0cbeSNick Kledzik     return p;
84111e0cbeSNick Kledzik }
85111e0cbeSNick Kledzik 
8632f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
87111e0cbeSNick Kledzik void*
88fafca58cSHoward Hinnant operator new[](size_t size)
8993a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
9093a16c0fSHoward Hinnant     throw(std::bad_alloc)
9193a16c0fSHoward Hinnant #endif
92111e0cbeSNick Kledzik {
93111e0cbeSNick Kledzik     return ::operator new(size);
94111e0cbeSNick Kledzik }
95111e0cbeSNick Kledzik 
9632f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
97111e0cbeSNick Kledzik void*
98c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
99111e0cbeSNick Kledzik {
100111e0cbeSNick Kledzik     void* p = 0;
10154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
102111e0cbeSNick Kledzik     try
103111e0cbeSNick Kledzik     {
104940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
105111e0cbeSNick Kledzik         p = ::operator new[](size);
10654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
107111e0cbeSNick Kledzik     }
108111e0cbeSNick Kledzik     catch (...)
109111e0cbeSNick Kledzik     {
110111e0cbeSNick Kledzik     }
111940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
112111e0cbeSNick Kledzik     return p;
113111e0cbeSNick Kledzik }
114111e0cbeSNick Kledzik 
11532f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
116111e0cbeSNick Kledzik void
117fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT
118111e0cbeSNick Kledzik {
119111e0cbeSNick Kledzik     if (ptr)
120111e0cbeSNick Kledzik         ::free(ptr);
121111e0cbeSNick Kledzik }
122111e0cbeSNick Kledzik 
12332f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
124111e0cbeSNick Kledzik void
125fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
126111e0cbeSNick Kledzik {
127111e0cbeSNick Kledzik     ::operator delete(ptr);
128111e0cbeSNick Kledzik }
129111e0cbeSNick Kledzik 
13032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
131111e0cbeSNick Kledzik void
132e4864e0bSLarisse Voufo operator delete(void* ptr, size_t) _NOEXCEPT
133d36bd700SLarisse Voufo {
134d36bd700SLarisse Voufo     ::operator delete(ptr);
135d36bd700SLarisse Voufo }
136d36bd700SLarisse Voufo 
137d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
138d36bd700SLarisse Voufo void
139fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT
140111e0cbeSNick Kledzik {
141111e0cbeSNick Kledzik     ::operator delete(ptr);
142111e0cbeSNick Kledzik }
143111e0cbeSNick Kledzik 
14432f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
145111e0cbeSNick Kledzik void
146fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
147111e0cbeSNick Kledzik {
148111e0cbeSNick Kledzik     ::operator delete[](ptr);
149111e0cbeSNick Kledzik }
150111e0cbeSNick Kledzik 
151d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
152d36bd700SLarisse Voufo void
153e4864e0bSLarisse Voufo operator delete[] (void* ptr, size_t) _NOEXCEPT
154d36bd700SLarisse Voufo {
155d36bd700SLarisse Voufo     ::operator delete[](ptr);
156d36bd700SLarisse Voufo }
157d36bd700SLarisse Voufo 
158926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__
159926aa5f4SPeter Collingbourne 
1603e519524SHoward Hinnant namespace std
1613e519524SHoward Hinnant {
1623e519524SHoward Hinnant 
163926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
16462713dacSNick Kledzik const nothrow_t nothrow = {};
165926aa5f4SPeter Collingbourne #endif
16662713dacSNick Kledzik 
1672c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION
1682c9c6a57SHoward Hinnant 
169926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
170926aa5f4SPeter Collingbourne 
17162713dacSNick Kledzik new_handler
172fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT
17362713dacSNick Kledzik {
1741596c453SHoward Hinnant     return __sync_lock_test_and_set(&__new_handler, handler);
1751596c453SHoward Hinnant }
1761596c453SHoward Hinnant 
1771596c453SHoward Hinnant new_handler
178fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT
1791596c453SHoward Hinnant {
180634b9dd7SJoerg Sonnenberger     return __sync_fetch_and_add(&__new_handler, nullptr);
18162713dacSNick Kledzik }
18262713dacSNick Kledzik 
183926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__
184926aa5f4SPeter Collingbourne 
185e1da544eSDavid Chisnall #ifndef LIBCXXRT
186e1da544eSDavid Chisnall 
187fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT
188111e0cbeSNick Kledzik {
189111e0cbeSNick Kledzik }
190111e0cbeSNick Kledzik 
191926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__
192926aa5f4SPeter Collingbourne 
193fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT
194111e0cbeSNick Kledzik {
195111e0cbeSNick Kledzik }
196111e0cbeSNick Kledzik 
197111e0cbeSNick Kledzik const char*
198fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT
199111e0cbeSNick Kledzik {
200111e0cbeSNick Kledzik     return "std::bad_alloc";
201111e0cbeSNick Kledzik }
202111e0cbeSNick Kledzik 
203926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__
204926aa5f4SPeter Collingbourne 
205fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT
206111e0cbeSNick Kledzik {
207111e0cbeSNick Kledzik }
208111e0cbeSNick Kledzik 
209fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT
2103e519524SHoward Hinnant {
2113e519524SHoward Hinnant }
2123e519524SHoward Hinnant 
2131d558b84SEric Fiselier const char*
2141d558b84SEric Fiselier bad_array_new_length::what() const _NOEXCEPT
2151d558b84SEric Fiselier {
2161d558b84SEric Fiselier     return "bad_array_new_length";
2171d558b84SEric Fiselier }
2181d558b84SEric Fiselier 
219fd465fe5SEric Fiselier #endif //LIBCXXRT
220fd465fe5SEric Fiselier 
2213e519524SHoward Hinnant const char*
2226e8ebb2cSMarshall Clow bad_array_length::what() const _NOEXCEPT
2236e8ebb2cSMarshall Clow {
2246e8ebb2cSMarshall Clow     return "bad_array_length";
2256e8ebb2cSMarshall Clow }
2266e8ebb2cSMarshall Clow 
2276e8ebb2cSMarshall Clow bad_array_length::bad_array_length() _NOEXCEPT
2286e8ebb2cSMarshall Clow {
2296e8ebb2cSMarshall Clow }
2306e8ebb2cSMarshall Clow 
2316e8ebb2cSMarshall Clow bad_array_length::~bad_array_length() _NOEXCEPT
2326e8ebb2cSMarshall Clow {
2336e8ebb2cSMarshall Clow }
2346e8ebb2cSMarshall Clow 
2356e8ebb2cSMarshall Clow #endif // _LIBCPPABI_VERSION
2362c9c6a57SHoward Hinnant 
23726dd09e5SPeter Collingbourne #ifndef LIBSTDCXX
23826dd09e5SPeter Collingbourne 
2393e519524SHoward Hinnant void
2403e519524SHoward Hinnant __throw_bad_alloc()
2413e519524SHoward Hinnant {
24254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
2433e519524SHoward Hinnant     throw bad_alloc();
24454b409fdSHoward Hinnant #endif
2453e519524SHoward Hinnant }
2463e519524SHoward Hinnant 
24726dd09e5SPeter Collingbourne #endif // !LIBSTDCXX
24826dd09e5SPeter Collingbourne 
2493e519524SHoward Hinnant }  // std
250