xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 6e8ebb2c)
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 
10*6e8ebb2cSMarshall Clow #define _LIBCPP_BUILDING_NEW
11*6e8ebb2cSMarshall 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 
20b56e8587SMarshall Clow #ifdef __APPLE__
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
25111e0cbeSNick Kledzik         // shared libray.  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>)
33dce0696aSHoward Hinnant     #ifndef _LIBCPPABI_VERSION
34111e0cbeSNick Kledzik         static std::new_handler __new_handler;
35dce0696aSHoward Hinnant     #endif  // _LIBCPPABI_VERSION
36111e0cbeSNick Kledzik #endif
37111e0cbeSNick Kledzik 
38111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
39111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
40111e0cbeSNick Kledzik // that define non-weak copies of the functions.
41111e0cbeSNick Kledzik 
42111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
43111e0cbeSNick Kledzik void *
44fafca58cSHoward Hinnant operator new(std::size_t size)
4593a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
4693a16c0fSHoward Hinnant     throw(std::bad_alloc)
4793a16c0fSHoward Hinnant #endif
48111e0cbeSNick Kledzik {
49111e0cbeSNick Kledzik     if (size == 0)
50111e0cbeSNick Kledzik         size = 1;
51111e0cbeSNick Kledzik     void* p;
52111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
53111e0cbeSNick Kledzik     {
54111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
55111e0cbeSNick Kledzik         // call it to try free up memory.
5675357bcdSHoward Hinnant         std::new_handler nh = std::get_new_handler();
57816cb897SHoward Hinnant         if (nh)
58816cb897SHoward Hinnant             nh();
59111e0cbeSNick Kledzik         else
6054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
61111e0cbeSNick Kledzik             throw std::bad_alloc();
6254b409fdSHoward Hinnant #else
6354b409fdSHoward Hinnant             break;
6454b409fdSHoward Hinnant #endif
65111e0cbeSNick Kledzik     }
66111e0cbeSNick Kledzik     return p;
67111e0cbeSNick Kledzik }
68111e0cbeSNick Kledzik 
69111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
70111e0cbeSNick Kledzik void*
71fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
72111e0cbeSNick Kledzik {
73111e0cbeSNick Kledzik     void* p = 0;
7454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
75111e0cbeSNick Kledzik     try
76111e0cbeSNick Kledzik     {
77940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
78111e0cbeSNick Kledzik         p = ::operator new(size);
7954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
80111e0cbeSNick Kledzik     }
81111e0cbeSNick Kledzik     catch (...)
82111e0cbeSNick Kledzik     {
83111e0cbeSNick Kledzik     }
84940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
85111e0cbeSNick Kledzik     return p;
86111e0cbeSNick Kledzik }
87111e0cbeSNick Kledzik 
88111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
89111e0cbeSNick Kledzik void*
90fafca58cSHoward Hinnant operator new[](size_t size)
9193a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
9293a16c0fSHoward Hinnant     throw(std::bad_alloc)
9393a16c0fSHoward Hinnant #endif
94111e0cbeSNick Kledzik {
95111e0cbeSNick Kledzik     return ::operator new(size);
96111e0cbeSNick Kledzik }
97111e0cbeSNick Kledzik 
98111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
99111e0cbeSNick Kledzik void*
100c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
101111e0cbeSNick Kledzik {
102111e0cbeSNick Kledzik     void* p = 0;
10354b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
104111e0cbeSNick Kledzik     try
105111e0cbeSNick Kledzik     {
106940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
107111e0cbeSNick Kledzik         p = ::operator new[](size);
10854b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
109111e0cbeSNick Kledzik     }
110111e0cbeSNick Kledzik     catch (...)
111111e0cbeSNick Kledzik     {
112111e0cbeSNick Kledzik     }
113940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
114111e0cbeSNick Kledzik     return p;
115111e0cbeSNick Kledzik }
116111e0cbeSNick Kledzik 
117111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
118111e0cbeSNick Kledzik void
119fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT
120111e0cbeSNick Kledzik {
121111e0cbeSNick Kledzik     if (ptr)
122111e0cbeSNick Kledzik         ::free(ptr);
123111e0cbeSNick Kledzik }
124111e0cbeSNick Kledzik 
125111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
126111e0cbeSNick Kledzik void
127fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
128111e0cbeSNick Kledzik {
129111e0cbeSNick Kledzik     ::operator delete(ptr);
130111e0cbeSNick Kledzik }
131111e0cbeSNick Kledzik 
132111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
133111e0cbeSNick Kledzik void
134fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT
135111e0cbeSNick Kledzik {
136111e0cbeSNick Kledzik     ::operator delete (ptr);
137111e0cbeSNick Kledzik }
138111e0cbeSNick Kledzik 
139111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
140111e0cbeSNick Kledzik void
141fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
142111e0cbeSNick Kledzik {
143111e0cbeSNick Kledzik     ::operator delete[](ptr);
144111e0cbeSNick Kledzik }
145111e0cbeSNick Kledzik 
1463e519524SHoward Hinnant namespace std
1473e519524SHoward Hinnant {
1483e519524SHoward Hinnant 
14962713dacSNick Kledzik const nothrow_t nothrow = {};
15062713dacSNick Kledzik 
1512c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION
1522c9c6a57SHoward Hinnant 
15362713dacSNick Kledzik new_handler
154fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT
15562713dacSNick Kledzik {
1561596c453SHoward Hinnant     return __sync_lock_test_and_set(&__new_handler, handler);
1571596c453SHoward Hinnant }
1581596c453SHoward Hinnant 
1591596c453SHoward Hinnant new_handler
160fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT
1611596c453SHoward Hinnant {
1621596c453SHoward Hinnant     return __sync_fetch_and_add(&__new_handler, (new_handler)0);
16362713dacSNick Kledzik }
16462713dacSNick Kledzik 
165e1da544eSDavid Chisnall #ifndef LIBCXXRT
166e1da544eSDavid Chisnall 
167fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT
168111e0cbeSNick Kledzik {
169111e0cbeSNick Kledzik }
170111e0cbeSNick Kledzik 
171fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT
172111e0cbeSNick Kledzik {
173111e0cbeSNick Kledzik }
174111e0cbeSNick Kledzik 
175111e0cbeSNick Kledzik const char*
176fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT
177111e0cbeSNick Kledzik {
178111e0cbeSNick Kledzik     return "std::bad_alloc";
179111e0cbeSNick Kledzik }
180111e0cbeSNick Kledzik 
1811e02029fSDavid Chisnall #endif //LIBCXXRT
1821e02029fSDavid Chisnall 
183fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT
184111e0cbeSNick Kledzik {
185111e0cbeSNick Kledzik }
186111e0cbeSNick Kledzik 
187fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT
1883e519524SHoward Hinnant {
1893e519524SHoward Hinnant }
1903e519524SHoward Hinnant 
1913e519524SHoward Hinnant const char*
192*6e8ebb2cSMarshall Clow bad_array_length::what() const _NOEXCEPT
193*6e8ebb2cSMarshall Clow {
194*6e8ebb2cSMarshall Clow     return "bad_array_length";
195*6e8ebb2cSMarshall Clow }
196*6e8ebb2cSMarshall Clow 
197*6e8ebb2cSMarshall Clow bad_array_length::bad_array_length() _NOEXCEPT
198*6e8ebb2cSMarshall Clow {
199*6e8ebb2cSMarshall Clow }
200*6e8ebb2cSMarshall Clow 
201*6e8ebb2cSMarshall Clow bad_array_length::~bad_array_length() _NOEXCEPT
202*6e8ebb2cSMarshall Clow {
203*6e8ebb2cSMarshall Clow }
204*6e8ebb2cSMarshall Clow 
205*6e8ebb2cSMarshall Clow const char*
206fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT
2073e519524SHoward Hinnant {
2083e519524SHoward Hinnant     return "bad_array_new_length";
2093e519524SHoward Hinnant }
2103e519524SHoward Hinnant 
211*6e8ebb2cSMarshall Clow #endif // _LIBCPPABI_VERSION
2122c9c6a57SHoward Hinnant 
2133e519524SHoward Hinnant void
2143e519524SHoward Hinnant __throw_bad_alloc()
2153e519524SHoward Hinnant {
21654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
2173e519524SHoward Hinnant     throw bad_alloc();
21854b409fdSHoward Hinnant #endif
2193e519524SHoward Hinnant }
2203e519524SHoward Hinnant 
2213e519524SHoward Hinnant }  // std
222