xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 2c9c6a57)
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 
14111e0cbeSNick Kledzik #if __APPLE__
15128ba719SHoward Hinnant     #include <cxxabi.h>
16*2c9c6a57SHoward Hinnant 
17*2c9c6a57SHoward Hinnant     #ifndef _LIBCPPABI_VERSION
18111e0cbeSNick Kledzik         // On Darwin, there are two STL shared libraries and a lower level ABI
19111e0cbeSNick Kledzik         // shared libray.  The global holding the current new handler is
20111e0cbeSNick Kledzik         // in the ABI library and named __cxa_new_handler.
21111e0cbeSNick Kledzik         #define __new_handler __cxxabiapple::__cxa_new_handler
22*2c9c6a57SHoward Hinnant     #endif
23940e211cSHoward Hinnant #else  // __APPLE__
24111e0cbeSNick Kledzik     static std::new_handler __new_handler;
25111e0cbeSNick Kledzik #endif
26111e0cbeSNick Kledzik 
27*2c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION
28*2c9c6a57SHoward Hinnant 
29111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
30111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
31111e0cbeSNick Kledzik // that define non-weak copies of the functions.
32111e0cbeSNick Kledzik 
33111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
34111e0cbeSNick Kledzik void *
35fafca58cSHoward Hinnant operator new(std::size_t size)
3693a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
3793a16c0fSHoward Hinnant     throw(std::bad_alloc)
3893a16c0fSHoward Hinnant #endif
39111e0cbeSNick Kledzik {
40111e0cbeSNick Kledzik     if (size == 0)
41111e0cbeSNick Kledzik         size = 1;
42111e0cbeSNick Kledzik     void* p;
43111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
44111e0cbeSNick Kledzik     {
45111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
46111e0cbeSNick Kledzik         // call it to try free up memory.
4775357bcdSHoward Hinnant         std::new_handler nh = std::get_new_handler();
48816cb897SHoward Hinnant         if (nh)
49816cb897SHoward Hinnant             nh();
50111e0cbeSNick Kledzik         else
5154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
52111e0cbeSNick Kledzik             throw std::bad_alloc();
5354b409fdSHoward Hinnant #else
5454b409fdSHoward Hinnant             break;
5554b409fdSHoward Hinnant #endif
56111e0cbeSNick Kledzik     }
57111e0cbeSNick Kledzik     return p;
58111e0cbeSNick Kledzik }
59111e0cbeSNick Kledzik 
60111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
61111e0cbeSNick Kledzik void*
62fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
63111e0cbeSNick Kledzik {
64111e0cbeSNick Kledzik     void* p = 0;
6554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
66111e0cbeSNick Kledzik     try
67111e0cbeSNick Kledzik     {
68940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
69111e0cbeSNick Kledzik         p = ::operator new(size);
7054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
71111e0cbeSNick Kledzik     }
72111e0cbeSNick Kledzik     catch (...)
73111e0cbeSNick Kledzik     {
74111e0cbeSNick Kledzik     }
75940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
76111e0cbeSNick Kledzik     return p;
77111e0cbeSNick Kledzik }
78111e0cbeSNick Kledzik 
79111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
80111e0cbeSNick Kledzik void*
81fafca58cSHoward Hinnant operator new[](size_t size)
8293a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
8393a16c0fSHoward Hinnant     throw(std::bad_alloc)
8493a16c0fSHoward Hinnant #endif
85111e0cbeSNick Kledzik {
86111e0cbeSNick Kledzik     return ::operator new(size);
87111e0cbeSNick Kledzik }
88111e0cbeSNick Kledzik 
89111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
90111e0cbeSNick Kledzik void*
91c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
92111e0cbeSNick Kledzik {
93111e0cbeSNick Kledzik     void* p = 0;
9454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
95111e0cbeSNick Kledzik     try
96111e0cbeSNick Kledzik     {
97940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
98111e0cbeSNick Kledzik         p = ::operator new[](size);
9954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
100111e0cbeSNick Kledzik     }
101111e0cbeSNick Kledzik     catch (...)
102111e0cbeSNick Kledzik     {
103111e0cbeSNick Kledzik     }
104940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
105111e0cbeSNick Kledzik     return p;
106111e0cbeSNick Kledzik }
107111e0cbeSNick Kledzik 
108111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
109111e0cbeSNick Kledzik void
110fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT
111111e0cbeSNick Kledzik {
112111e0cbeSNick Kledzik     if (ptr)
113111e0cbeSNick Kledzik         ::free(ptr);
114111e0cbeSNick Kledzik }
115111e0cbeSNick Kledzik 
116111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
117111e0cbeSNick Kledzik void
118fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
119111e0cbeSNick Kledzik {
120111e0cbeSNick Kledzik     ::operator delete(ptr);
121111e0cbeSNick Kledzik }
122111e0cbeSNick Kledzik 
123111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
124111e0cbeSNick Kledzik void
125fafca58cSHoward Hinnant operator delete[] (void* ptr) _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, const std::nothrow_t&) _NOEXCEPT
133111e0cbeSNick Kledzik {
134111e0cbeSNick Kledzik     ::operator delete[](ptr);
135111e0cbeSNick Kledzik }
136111e0cbeSNick Kledzik 
137*2c9c6a57SHoward Hinnant #endif
138*2c9c6a57SHoward Hinnant 
1393e519524SHoward Hinnant namespace std
1403e519524SHoward Hinnant {
1413e519524SHoward Hinnant 
14262713dacSNick Kledzik const nothrow_t nothrow = {};
14362713dacSNick Kledzik 
144*2c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION
145*2c9c6a57SHoward Hinnant 
14662713dacSNick Kledzik new_handler
147fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT
14862713dacSNick Kledzik {
1491596c453SHoward Hinnant     return __sync_lock_test_and_set(&__new_handler, handler);
1501596c453SHoward Hinnant }
1511596c453SHoward Hinnant 
1521596c453SHoward Hinnant new_handler
153fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT
1541596c453SHoward Hinnant {
1551596c453SHoward Hinnant     return __sync_fetch_and_add(&__new_handler, (new_handler)0);
15662713dacSNick Kledzik }
15762713dacSNick Kledzik 
158fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT
159111e0cbeSNick Kledzik {
160111e0cbeSNick Kledzik }
161111e0cbeSNick Kledzik 
162fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT
163111e0cbeSNick Kledzik {
164111e0cbeSNick Kledzik }
165111e0cbeSNick Kledzik 
166111e0cbeSNick Kledzik const char*
167fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT
168111e0cbeSNick Kledzik {
169111e0cbeSNick Kledzik     return "std::bad_alloc";
170111e0cbeSNick Kledzik }
171111e0cbeSNick Kledzik 
172fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT
173111e0cbeSNick Kledzik {
174111e0cbeSNick Kledzik }
175111e0cbeSNick Kledzik 
176fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT
1773e519524SHoward Hinnant {
1783e519524SHoward Hinnant }
1793e519524SHoward Hinnant 
1803e519524SHoward Hinnant const char*
181fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT
1823e519524SHoward Hinnant {
1833e519524SHoward Hinnant     return "bad_array_new_length";
1843e519524SHoward Hinnant }
1853e519524SHoward Hinnant 
186*2c9c6a57SHoward Hinnant #endif
187*2c9c6a57SHoward Hinnant 
1883e519524SHoward Hinnant void
1893e519524SHoward Hinnant __throw_bad_alloc()
1903e519524SHoward Hinnant {
19154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
1923e519524SHoward Hinnant     throw bad_alloc();
19354b409fdSHoward Hinnant #endif
1943e519524SHoward Hinnant }
1953e519524SHoward Hinnant 
1963e519524SHoward Hinnant }  // std
197