xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 412dbebe)
13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===//
23e519524SHoward Hinnant //
35b08a8a4SHoward Hinnant //                     The LLVM Compiler Infrastructure
43e519524SHoward Hinnant //
5*412dbebeSHoward Hinnant // This file is dual licensed under the MIT and the University of Illinois Open
6*412dbebeSHoward 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 *
30111e0cbeSNick Kledzik operator new(std::size_t size) throw (std::bad_alloc)
31111e0cbeSNick Kledzik {
32111e0cbeSNick Kledzik     if (size == 0)
33111e0cbeSNick Kledzik         size = 1;
34111e0cbeSNick Kledzik     void* p;
35111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
36111e0cbeSNick Kledzik     {
37111e0cbeSNick Kledzik         // If malloc fails and there is a new_handler,
38111e0cbeSNick Kledzik         // call it to try free up memory.
39111e0cbeSNick Kledzik         if (__new_handler)
40111e0cbeSNick Kledzik             __new_handler();
41111e0cbeSNick Kledzik         else
4254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
43111e0cbeSNick Kledzik             throw std::bad_alloc();
4454b409fdSHoward Hinnant #else
4554b409fdSHoward Hinnant             break;
4654b409fdSHoward Hinnant #endif
47111e0cbeSNick Kledzik     }
48111e0cbeSNick Kledzik     return p;
49111e0cbeSNick Kledzik }
50111e0cbeSNick Kledzik 
51111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
52111e0cbeSNick Kledzik void*
53111e0cbeSNick Kledzik operator new(size_t size, const std::nothrow_t&) throw()
54111e0cbeSNick Kledzik {
55111e0cbeSNick Kledzik     void* p = 0;
5654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
57111e0cbeSNick Kledzik     try
58111e0cbeSNick Kledzik     {
59940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
60111e0cbeSNick Kledzik         p = ::operator new(size);
6154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
62111e0cbeSNick Kledzik     }
63111e0cbeSNick Kledzik     catch (...)
64111e0cbeSNick Kledzik     {
65111e0cbeSNick Kledzik     }
66940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
67111e0cbeSNick Kledzik     return p;
68111e0cbeSNick Kledzik }
69111e0cbeSNick Kledzik 
70111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
71111e0cbeSNick Kledzik void*
72111e0cbeSNick Kledzik operator new[](size_t size) throw (std::bad_alloc)
73111e0cbeSNick Kledzik {
74111e0cbeSNick Kledzik     return ::operator new(size);
75111e0cbeSNick Kledzik }
76111e0cbeSNick Kledzik 
77111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
78111e0cbeSNick Kledzik void*
79111e0cbeSNick Kledzik operator new[](size_t size, const std::nothrow_t& nothrow) throw()
80111e0cbeSNick Kledzik {
81111e0cbeSNick Kledzik     void* p = 0;
8254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
83111e0cbeSNick Kledzik     try
84111e0cbeSNick Kledzik     {
85940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
86111e0cbeSNick Kledzik         p = ::operator new[](size);
8754b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
88111e0cbeSNick Kledzik     }
89111e0cbeSNick Kledzik     catch (...)
90111e0cbeSNick Kledzik     {
91111e0cbeSNick Kledzik     }
92940e211cSHoward Hinnant #endif  // _LIBCPP_NO_EXCEPTIONS
93111e0cbeSNick Kledzik     return p;
94111e0cbeSNick Kledzik }
95111e0cbeSNick Kledzik 
96111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
97111e0cbeSNick Kledzik void
98111e0cbeSNick Kledzik operator delete(void* ptr) throw ()
99111e0cbeSNick Kledzik {
100111e0cbeSNick Kledzik     if (ptr)
101111e0cbeSNick Kledzik         ::free(ptr);
102111e0cbeSNick Kledzik }
103111e0cbeSNick Kledzik 
104111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
105111e0cbeSNick Kledzik void
106111e0cbeSNick Kledzik operator delete(void* ptr, const std::nothrow_t&) throw ()
107111e0cbeSNick Kledzik {
108111e0cbeSNick Kledzik     ::operator delete(ptr);
109111e0cbeSNick Kledzik }
110111e0cbeSNick Kledzik 
111111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
112111e0cbeSNick Kledzik void
113111e0cbeSNick Kledzik operator delete[] (void* ptr) throw ()
114111e0cbeSNick Kledzik {
115111e0cbeSNick Kledzik     ::operator delete (ptr);
116111e0cbeSNick Kledzik }
117111e0cbeSNick Kledzik 
118111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
119111e0cbeSNick Kledzik void
120111e0cbeSNick Kledzik operator delete[] (void* ptr, const std::nothrow_t&) throw ()
121111e0cbeSNick Kledzik {
122111e0cbeSNick Kledzik     ::operator delete[](ptr);
123111e0cbeSNick Kledzik }
124111e0cbeSNick Kledzik 
1253e519524SHoward Hinnant namespace std
1263e519524SHoward Hinnant {
1273e519524SHoward Hinnant 
12862713dacSNick Kledzik const nothrow_t nothrow = {};
12962713dacSNick Kledzik 
13062713dacSNick Kledzik new_handler
13162713dacSNick Kledzik set_new_handler(new_handler handler) throw()
13262713dacSNick Kledzik {
13362713dacSNick Kledzik     new_handler r = __new_handler;
13462713dacSNick Kledzik     __new_handler = handler;
13562713dacSNick Kledzik     return r;
13662713dacSNick Kledzik }
13762713dacSNick Kledzik 
138111e0cbeSNick Kledzik bad_alloc::bad_alloc() throw()
139111e0cbeSNick Kledzik {
140111e0cbeSNick Kledzik }
141111e0cbeSNick Kledzik 
142111e0cbeSNick Kledzik bad_alloc::~bad_alloc() throw()
143111e0cbeSNick Kledzik {
144111e0cbeSNick Kledzik }
145111e0cbeSNick Kledzik 
146111e0cbeSNick Kledzik const char*
147111e0cbeSNick Kledzik bad_alloc::what() const throw()
148111e0cbeSNick Kledzik {
149111e0cbeSNick Kledzik     return "std::bad_alloc";
150111e0cbeSNick Kledzik }
151111e0cbeSNick Kledzik 
152111e0cbeSNick Kledzik bad_array_new_length::bad_array_new_length() throw()
153111e0cbeSNick Kledzik {
154111e0cbeSNick Kledzik }
155111e0cbeSNick Kledzik 
1563e519524SHoward Hinnant bad_array_new_length::~bad_array_new_length() throw()
1573e519524SHoward Hinnant {
1583e519524SHoward Hinnant }
1593e519524SHoward Hinnant 
1603e519524SHoward Hinnant const char*
1613e519524SHoward Hinnant bad_array_new_length::what() const throw()
1623e519524SHoward Hinnant {
1633e519524SHoward Hinnant     return "bad_array_new_length";
1643e519524SHoward Hinnant }
1653e519524SHoward Hinnant 
1663e519524SHoward Hinnant void
1673e519524SHoward Hinnant __throw_bad_alloc()
1683e519524SHoward Hinnant {
16954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
1703e519524SHoward Hinnant     throw bad_alloc();
17154b409fdSHoward Hinnant #endif
1723e519524SHoward Hinnant }
1733e519524SHoward Hinnant 
1743e519524SHoward Hinnant }  // std
175