xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 93a16c0f)
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>
16111e0cbeSNick Kledzik     // On Darwin, there are two STL shared libraries and a lower level ABI
17111e0cbeSNick Kledzik     // shared libray.  The global holding the current new handler is
18111e0cbeSNick Kledzik     // in the ABI library and named __cxa_new_handler.
19111e0cbeSNick Kledzik     #define __new_handler __cxxabiapple::__cxa_new_handler
20940e211cSHoward Hinnant #else  // __APPLE__
21111e0cbeSNick Kledzik     static std::new_handler __new_handler;
22111e0cbeSNick Kledzik #endif
23111e0cbeSNick Kledzik 
24111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
25111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
26111e0cbeSNick Kledzik // that define non-weak copies of the functions.
27111e0cbeSNick Kledzik 
28111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
29111e0cbeSNick Kledzik void *
30fafca58cSHoward Hinnant operator new(std::size_t size)
31*93a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
32*93a16c0fSHoward Hinnant     throw(std::bad_alloc)
33*93a16c0fSHoward Hinnant #endif
34111e0cbeSNick Kledzik {
35111e0cbeSNick Kledzik     if (size == 0)
36111e0cbeSNick Kledzik         size = 1;
37111e0cbeSNick Kledzik     void* p;
38111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
39111e0cbeSNick Kledzik     {
40111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
41111e0cbeSNick Kledzik         // call it to try free up memory.
4275357bcdSHoward Hinnant         std::new_handler nh = std::get_new_handler();
43816cb897SHoward Hinnant         if (nh)
44816cb897SHoward Hinnant             nh();
45111e0cbeSNick Kledzik         else
4654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
47111e0cbeSNick Kledzik             throw std::bad_alloc();
4854b409fdSHoward Hinnant #else
4954b409fdSHoward Hinnant             break;
5054b409fdSHoward Hinnant #endif
51111e0cbeSNick Kledzik     }
52111e0cbeSNick Kledzik     return p;
53111e0cbeSNick Kledzik }
54111e0cbeSNick Kledzik 
55111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
56111e0cbeSNick Kledzik void*
57fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
58111e0cbeSNick Kledzik {
59111e0cbeSNick Kledzik     void* p = 0;
6054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
61111e0cbeSNick Kledzik     try
62111e0cbeSNick Kledzik     {
63940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
64111e0cbeSNick Kledzik         p = ::operator new(size);
6554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
66111e0cbeSNick Kledzik     }
67111e0cbeSNick Kledzik     catch (...)
68111e0cbeSNick Kledzik     {
69111e0cbeSNick Kledzik     }
70940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
71111e0cbeSNick Kledzik     return p;
72111e0cbeSNick Kledzik }
73111e0cbeSNick Kledzik 
74111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
75111e0cbeSNick Kledzik void*
76fafca58cSHoward Hinnant operator new[](size_t size)
77*93a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept)
78*93a16c0fSHoward Hinnant     throw(std::bad_alloc)
79*93a16c0fSHoward Hinnant #endif
80111e0cbeSNick Kledzik {
81111e0cbeSNick Kledzik     return ::operator new(size);
82111e0cbeSNick Kledzik }
83111e0cbeSNick Kledzik 
84111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
85111e0cbeSNick Kledzik void*
86fafca58cSHoward Hinnant operator new[](size_t size, const std::nothrow_t& nothrow) _NOEXCEPT
87111e0cbeSNick Kledzik {
88111e0cbeSNick Kledzik     void* p = 0;
8954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
90111e0cbeSNick Kledzik     try
91111e0cbeSNick Kledzik     {
92940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
93111e0cbeSNick Kledzik         p = ::operator new[](size);
9454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
95111e0cbeSNick Kledzik     }
96111e0cbeSNick Kledzik     catch (...)
97111e0cbeSNick Kledzik     {
98111e0cbeSNick Kledzik     }
99940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
100111e0cbeSNick Kledzik     return p;
101111e0cbeSNick Kledzik }
102111e0cbeSNick Kledzik 
103111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
104111e0cbeSNick Kledzik void
105fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT
106111e0cbeSNick Kledzik {
107111e0cbeSNick Kledzik     if (ptr)
108111e0cbeSNick Kledzik         ::free(ptr);
109111e0cbeSNick Kledzik }
110111e0cbeSNick Kledzik 
111111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
112111e0cbeSNick Kledzik void
113fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
114111e0cbeSNick Kledzik {
115111e0cbeSNick Kledzik     ::operator delete(ptr);
116111e0cbeSNick Kledzik }
117111e0cbeSNick Kledzik 
118111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
119111e0cbeSNick Kledzik void
120fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT
121111e0cbeSNick Kledzik {
122111e0cbeSNick Kledzik     ::operator delete (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 
1323e519524SHoward Hinnant namespace std
1333e519524SHoward Hinnant {
1343e519524SHoward Hinnant 
13562713dacSNick Kledzik const nothrow_t nothrow = {};
13662713dacSNick Kledzik 
13762713dacSNick Kledzik new_handler
138fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT
13962713dacSNick Kledzik {
1401596c453SHoward Hinnant     return __sync_lock_test_and_set(&__new_handler, handler);
1411596c453SHoward Hinnant }
1421596c453SHoward Hinnant 
1431596c453SHoward Hinnant new_handler
144fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT
1451596c453SHoward Hinnant {
1461596c453SHoward Hinnant     return __sync_fetch_and_add(&__new_handler, (new_handler)0);
14762713dacSNick Kledzik }
14862713dacSNick Kledzik 
149fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT
150111e0cbeSNick Kledzik {
151111e0cbeSNick Kledzik }
152111e0cbeSNick Kledzik 
153fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT
154111e0cbeSNick Kledzik {
155111e0cbeSNick Kledzik }
156111e0cbeSNick Kledzik 
157111e0cbeSNick Kledzik const char*
158fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT
159111e0cbeSNick Kledzik {
160111e0cbeSNick Kledzik     return "std::bad_alloc";
161111e0cbeSNick Kledzik }
162111e0cbeSNick Kledzik 
163fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT
164111e0cbeSNick Kledzik {
165111e0cbeSNick Kledzik }
166111e0cbeSNick Kledzik 
167fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT
1683e519524SHoward Hinnant {
1693e519524SHoward Hinnant }
1703e519524SHoward Hinnant 
1713e519524SHoward Hinnant const char*
172fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT
1733e519524SHoward Hinnant {
1743e519524SHoward Hinnant     return "bad_array_new_length";
1753e519524SHoward Hinnant }
1763e519524SHoward Hinnant 
1773e519524SHoward Hinnant void
1783e519524SHoward Hinnant __throw_bad_alloc()
1793e519524SHoward Hinnant {
18054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
1813e519524SHoward Hinnant     throw bad_alloc();
18254b409fdSHoward Hinnant #endif
1833e519524SHoward Hinnant }
1843e519524SHoward Hinnant 
1853e519524SHoward Hinnant }  // std
186