xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 62713dac)
13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===//
23e519524SHoward Hinnant //
35b08a8a4SHoward Hinnant //                     The LLVM Compiler Infrastructure
43e519524SHoward Hinnant //
53e519524SHoward Hinnant // This file is distributed under the University of Illinois Open Source
63e519524SHoward Hinnant // License. See LICENSE.TXT for details.
73e519524SHoward Hinnant //
83e519524SHoward Hinnant //===----------------------------------------------------------------------===//
93e519524SHoward Hinnant 
10111e0cbeSNick Kledzik #include <stdlib.h>
11111e0cbeSNick Kledzik #include <cxxabi.h>
12111e0cbeSNick Kledzik 
133e519524SHoward Hinnant #include "new"
143e519524SHoward Hinnant 
15111e0cbeSNick Kledzik 
16111e0cbeSNick Kledzik #if __APPLE__
17111e0cbeSNick Kledzik     // On Darwin, there are two STL shared libraries and a lower level ABI
18111e0cbeSNick Kledzik 	// shared libray.  The global holding the current new handler is
19111e0cbeSNick Kledzik     // in the ABI library and named __cxa_new_handler.
20111e0cbeSNick Kledzik     #define __new_handler __cxxabiapple::__cxa_new_handler
21111e0cbeSNick Kledzik #else
22111e0cbeSNick Kledzik 	static std::new_handler __new_handler;
23111e0cbeSNick Kledzik #endif
24111e0cbeSNick Kledzik 
25111e0cbeSNick Kledzik 
26111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
27111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
28111e0cbeSNick Kledzik // that define non-weak copies of the functions.
29111e0cbeSNick Kledzik 
30111e0cbeSNick Kledzik 
31111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
32111e0cbeSNick Kledzik void *
33111e0cbeSNick Kledzik operator new(std::size_t size) throw (std::bad_alloc)
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.
42111e0cbeSNick Kledzik         if (__new_handler)
43111e0cbeSNick Kledzik             __new_handler();
44111e0cbeSNick Kledzik         else
45111e0cbeSNick Kledzik             throw std::bad_alloc();
46111e0cbeSNick Kledzik     }
47111e0cbeSNick Kledzik     return p;
48111e0cbeSNick Kledzik }
49111e0cbeSNick Kledzik 
50111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
51111e0cbeSNick Kledzik void*
52111e0cbeSNick Kledzik operator new(size_t size, const std::nothrow_t&) throw()
53111e0cbeSNick Kledzik {
54111e0cbeSNick Kledzik     void* p = 0;
55111e0cbeSNick Kledzik     try
56111e0cbeSNick Kledzik     {
57111e0cbeSNick Kledzik         p = ::operator new(size);
58111e0cbeSNick Kledzik     }
59111e0cbeSNick Kledzik     catch (...)
60111e0cbeSNick Kledzik     {
61111e0cbeSNick Kledzik     }
62111e0cbeSNick Kledzik     return p;
63111e0cbeSNick Kledzik }
64111e0cbeSNick Kledzik 
65111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
66111e0cbeSNick Kledzik void*
67111e0cbeSNick Kledzik operator new[](size_t size) throw (std::bad_alloc)
68111e0cbeSNick Kledzik {
69111e0cbeSNick Kledzik     return ::operator new(size);
70111e0cbeSNick Kledzik }
71111e0cbeSNick Kledzik 
72111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
73111e0cbeSNick Kledzik void*
74111e0cbeSNick Kledzik operator new[](size_t size, const std::nothrow_t& nothrow) throw()
75111e0cbeSNick Kledzik {
76111e0cbeSNick Kledzik     void* p = 0;
77111e0cbeSNick Kledzik     try
78111e0cbeSNick Kledzik     {
79111e0cbeSNick Kledzik         p = ::operator new[](size);
80111e0cbeSNick Kledzik     }
81111e0cbeSNick Kledzik     catch (...)
82111e0cbeSNick Kledzik     {
83111e0cbeSNick Kledzik     }
84111e0cbeSNick Kledzik     return p;
85111e0cbeSNick Kledzik }
86111e0cbeSNick Kledzik 
87111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
88111e0cbeSNick Kledzik void
89111e0cbeSNick Kledzik operator delete(void* ptr) throw ()
90111e0cbeSNick Kledzik {
91111e0cbeSNick Kledzik     if (ptr)
92111e0cbeSNick Kledzik         ::free(ptr);
93111e0cbeSNick Kledzik }
94111e0cbeSNick Kledzik 
95111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
96111e0cbeSNick Kledzik void
97111e0cbeSNick Kledzik operator delete(void* ptr, const std::nothrow_t&) throw ()
98111e0cbeSNick Kledzik {
99111e0cbeSNick Kledzik     ::operator delete(ptr);
100111e0cbeSNick Kledzik }
101111e0cbeSNick Kledzik 
102111e0cbeSNick Kledzik 
103111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
104111e0cbeSNick Kledzik void
105111e0cbeSNick Kledzik operator delete[] (void* ptr) throw ()
106111e0cbeSNick Kledzik {
107111e0cbeSNick Kledzik     ::operator delete (ptr);
108111e0cbeSNick Kledzik }
109111e0cbeSNick Kledzik 
110111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
111111e0cbeSNick Kledzik void
112111e0cbeSNick Kledzik operator delete[] (void* ptr, const std::nothrow_t&) throw ()
113111e0cbeSNick Kledzik {
114111e0cbeSNick Kledzik     ::operator delete[](ptr);
115111e0cbeSNick Kledzik }
116111e0cbeSNick Kledzik 
117111e0cbeSNick Kledzik 
1183e519524SHoward Hinnant namespace std
1193e519524SHoward Hinnant {
1203e519524SHoward Hinnant 
121*62713dacSNick Kledzik const nothrow_t nothrow = {};
122*62713dacSNick Kledzik 
123*62713dacSNick Kledzik new_handler
124*62713dacSNick Kledzik set_new_handler(new_handler handler) throw()
125*62713dacSNick Kledzik {
126*62713dacSNick Kledzik     new_handler r = __new_handler;
127*62713dacSNick Kledzik     __new_handler = handler;
128*62713dacSNick Kledzik     return r;
129*62713dacSNick Kledzik }
130*62713dacSNick Kledzik 
131111e0cbeSNick Kledzik bad_alloc::bad_alloc() throw()
132111e0cbeSNick Kledzik {
133111e0cbeSNick Kledzik }
134111e0cbeSNick Kledzik 
135111e0cbeSNick Kledzik bad_alloc::~bad_alloc() throw()
136111e0cbeSNick Kledzik {
137111e0cbeSNick Kledzik }
138111e0cbeSNick Kledzik 
139111e0cbeSNick Kledzik const char*
140111e0cbeSNick Kledzik bad_alloc::what() const throw()
141111e0cbeSNick Kledzik {
142111e0cbeSNick Kledzik     return "std::bad_alloc";
143111e0cbeSNick Kledzik }
144111e0cbeSNick Kledzik 
145111e0cbeSNick Kledzik 
146111e0cbeSNick Kledzik bad_array_new_length::bad_array_new_length() throw()
147111e0cbeSNick Kledzik {
148111e0cbeSNick Kledzik }
149111e0cbeSNick Kledzik 
1503e519524SHoward Hinnant bad_array_new_length::~bad_array_new_length() throw()
1513e519524SHoward Hinnant {
1523e519524SHoward Hinnant }
1533e519524SHoward Hinnant 
1543e519524SHoward Hinnant const char*
1553e519524SHoward Hinnant bad_array_new_length::what() const throw()
1563e519524SHoward Hinnant {
1573e519524SHoward Hinnant     return "bad_array_new_length";
1583e519524SHoward Hinnant }
1593e519524SHoward Hinnant 
160111e0cbeSNick Kledzik 
161111e0cbeSNick Kledzik 
1623e519524SHoward Hinnant void
1633e519524SHoward Hinnant __throw_bad_alloc()
1643e519524SHoward Hinnant {
1653e519524SHoward Hinnant     throw bad_alloc();
1663e519524SHoward Hinnant }
1673e519524SHoward Hinnant 
1683e519524SHoward Hinnant }  // std
169