xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision dce0696a)
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 
10111e0cbeSNick Kledzik #include <stdlib.h>
11111e0cbeSNick Kledzik 
123e519524SHoward Hinnant #include "new"
133e519524SHoward Hinnant 
14*dce0696aSHoward Hinnant #ifndef __has_include
15*dce0696aSHoward Hinnant #define __has_include(inc) 0
16*dce0696aSHoward Hinnant #endif
17*dce0696aSHoward Hinnant 
18111e0cbeSNick Kledzik #if __APPLE__
19128ba719SHoward Hinnant     #include <cxxabi.h>
202c9c6a57SHoward Hinnant 
212c9c6a57SHoward Hinnant     #ifndef _LIBCPPABI_VERSION
22111e0cbeSNick Kledzik         // On Darwin, there are two STL shared libraries and a lower level ABI
23111e0cbeSNick Kledzik         // shared libray.  The global holding the current new handler is
24111e0cbeSNick Kledzik         // in the ABI library and named __cxa_new_handler.
25111e0cbeSNick Kledzik         #define __new_handler __cxxabiapple::__cxa_new_handler
262c9c6a57SHoward Hinnant     #endif
27940e211cSHoward Hinnant #else  // __APPLE__
28*dce0696aSHoward Hinnant     #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
29*dce0696aSHoward Hinnant         #include <cxxabi.h>
30*dce0696aSHoward Hinnant     #endif  // __has_include(<cxxabi.h>)
31*dce0696aSHoward Hinnant     #ifndef _LIBCPPABI_VERSION
32111e0cbeSNick Kledzik         static std::new_handler __new_handler;
33*dce0696aSHoward Hinnant     #endif  // _LIBCPPABI_VERSION
34111e0cbeSNick Kledzik #endif
35111e0cbeSNick Kledzik 
36111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
37111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
38111e0cbeSNick Kledzik // that define non-weak copies of the functions.
39111e0cbeSNick Kledzik 
40111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
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 
67111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
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 
86111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
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 
96111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
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 
115111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
116111e0cbeSNick Kledzik void
117fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT
118111e0cbeSNick Kledzik {
119111e0cbeSNick Kledzik     if (ptr)
120111e0cbeSNick Kledzik         ::free(ptr);
121111e0cbeSNick Kledzik }
122111e0cbeSNick Kledzik 
123111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
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 
130111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
131111e0cbeSNick Kledzik void
132fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT
133111e0cbeSNick Kledzik {
134111e0cbeSNick Kledzik     ::operator delete (ptr);
135111e0cbeSNick Kledzik }
136111e0cbeSNick Kledzik 
137111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
138111e0cbeSNick Kledzik void
139fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
140111e0cbeSNick Kledzik {
141111e0cbeSNick Kledzik     ::operator delete[](ptr);
142111e0cbeSNick Kledzik }
143111e0cbeSNick Kledzik 
1443e519524SHoward Hinnant namespace std
1453e519524SHoward Hinnant {
1463e519524SHoward Hinnant 
14762713dacSNick Kledzik const nothrow_t nothrow = {};
14862713dacSNick Kledzik 
1492c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION
1502c9c6a57SHoward Hinnant 
15162713dacSNick Kledzik new_handler
152fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT
15362713dacSNick Kledzik {
1541596c453SHoward Hinnant     return __sync_lock_test_and_set(&__new_handler, handler);
1551596c453SHoward Hinnant }
1561596c453SHoward Hinnant 
1571596c453SHoward Hinnant new_handler
158fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT
1591596c453SHoward Hinnant {
1601596c453SHoward Hinnant     return __sync_fetch_and_add(&__new_handler, (new_handler)0);
16162713dacSNick Kledzik }
16262713dacSNick Kledzik 
163e1da544eSDavid Chisnall #ifndef LIBCXXRT
164e1da544eSDavid Chisnall 
165fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT
166111e0cbeSNick Kledzik {
167111e0cbeSNick Kledzik }
168111e0cbeSNick Kledzik 
169fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT
170111e0cbeSNick Kledzik {
171111e0cbeSNick Kledzik }
172111e0cbeSNick Kledzik 
173111e0cbeSNick Kledzik const char*
174fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT
175111e0cbeSNick Kledzik {
176111e0cbeSNick Kledzik     return "std::bad_alloc";
177111e0cbeSNick Kledzik }
178111e0cbeSNick Kledzik 
1791e02029fSDavid Chisnall #endif //LIBCXXRT
1801e02029fSDavid Chisnall 
181fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT
182111e0cbeSNick Kledzik {
183111e0cbeSNick Kledzik }
184111e0cbeSNick Kledzik 
185fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT
1863e519524SHoward Hinnant {
1873e519524SHoward Hinnant }
1883e519524SHoward Hinnant 
1893e519524SHoward Hinnant const char*
190fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT
1913e519524SHoward Hinnant {
1923e519524SHoward Hinnant     return "bad_array_new_length";
1933e519524SHoward Hinnant }
1943e519524SHoward Hinnant 
1952c9c6a57SHoward Hinnant #endif
1962c9c6a57SHoward Hinnant 
1973e519524SHoward Hinnant void
1983e519524SHoward Hinnant __throw_bad_alloc()
1993e519524SHoward Hinnant {
20054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
2013e519524SHoward Hinnant     throw bad_alloc();
20254b409fdSHoward Hinnant #endif
2033e519524SHoward Hinnant }
2043e519524SHoward Hinnant 
2053e519524SHoward Hinnant }  // std
206