xref: /llvm-project-15.0.7/libcxx/src/new.cpp (revision 111e0cbe)
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 
10*111e0cbeSNick Kledzik #include <stdlib.h>
11*111e0cbeSNick Kledzik #include <cxxabi.h>
12*111e0cbeSNick Kledzik 
133e519524SHoward Hinnant #include "new"
143e519524SHoward Hinnant 
15*111e0cbeSNick Kledzik 
16*111e0cbeSNick Kledzik #if __APPLE__
17*111e0cbeSNick Kledzik     // On Darwin, there are two STL shared libraries and a lower level ABI
18*111e0cbeSNick Kledzik 	// shared libray.  The global holding the current new handler is
19*111e0cbeSNick Kledzik     // in the ABI library and named __cxa_new_handler.
20*111e0cbeSNick Kledzik     #define __new_handler __cxxabiapple::__cxa_new_handler
21*111e0cbeSNick Kledzik #else
22*111e0cbeSNick Kledzik 	static std::new_handler __new_handler;
23*111e0cbeSNick Kledzik #endif
24*111e0cbeSNick Kledzik 
25*111e0cbeSNick Kledzik 
26*111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions
27*111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs
28*111e0cbeSNick Kledzik // that define non-weak copies of the functions.
29*111e0cbeSNick Kledzik 
30*111e0cbeSNick Kledzik 
31*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
32*111e0cbeSNick Kledzik void *
33*111e0cbeSNick Kledzik operator new(std::size_t size) throw (std::bad_alloc)
34*111e0cbeSNick Kledzik {
35*111e0cbeSNick Kledzik     if (size == 0)
36*111e0cbeSNick Kledzik         size = 1;
37*111e0cbeSNick Kledzik     void* p;
38*111e0cbeSNick Kledzik     while ((p = ::malloc(size)) == 0)
39*111e0cbeSNick Kledzik     {
40*111e0cbeSNick Kledzik 		// If malloc fails and there is a new_handler,
41*111e0cbeSNick Kledzik 		// call it to try free up memory.
42*111e0cbeSNick Kledzik         if (__new_handler)
43*111e0cbeSNick Kledzik             __new_handler();
44*111e0cbeSNick Kledzik         else
45*111e0cbeSNick Kledzik             throw std::bad_alloc();
46*111e0cbeSNick Kledzik     }
47*111e0cbeSNick Kledzik     return p;
48*111e0cbeSNick Kledzik }
49*111e0cbeSNick Kledzik 
50*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
51*111e0cbeSNick Kledzik void*
52*111e0cbeSNick Kledzik operator new(size_t size, const std::nothrow_t&) throw()
53*111e0cbeSNick Kledzik {
54*111e0cbeSNick Kledzik     void* p = 0;
55*111e0cbeSNick Kledzik     try
56*111e0cbeSNick Kledzik     {
57*111e0cbeSNick Kledzik         p = ::operator new(size);
58*111e0cbeSNick Kledzik     }
59*111e0cbeSNick Kledzik     catch (...)
60*111e0cbeSNick Kledzik     {
61*111e0cbeSNick Kledzik     }
62*111e0cbeSNick Kledzik     return p;
63*111e0cbeSNick Kledzik }
64*111e0cbeSNick Kledzik 
65*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
66*111e0cbeSNick Kledzik void*
67*111e0cbeSNick Kledzik operator new[](size_t size) throw (std::bad_alloc)
68*111e0cbeSNick Kledzik {
69*111e0cbeSNick Kledzik     return ::operator new(size);
70*111e0cbeSNick Kledzik }
71*111e0cbeSNick Kledzik 
72*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
73*111e0cbeSNick Kledzik void*
74*111e0cbeSNick Kledzik operator new[](size_t size, const std::nothrow_t& nothrow) throw()
75*111e0cbeSNick Kledzik {
76*111e0cbeSNick Kledzik     void* p = 0;
77*111e0cbeSNick Kledzik     try
78*111e0cbeSNick Kledzik     {
79*111e0cbeSNick Kledzik         p = ::operator new[](size);
80*111e0cbeSNick Kledzik     }
81*111e0cbeSNick Kledzik     catch (...)
82*111e0cbeSNick Kledzik     {
83*111e0cbeSNick Kledzik     }
84*111e0cbeSNick Kledzik     return p;
85*111e0cbeSNick Kledzik }
86*111e0cbeSNick Kledzik 
87*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
88*111e0cbeSNick Kledzik void
89*111e0cbeSNick Kledzik operator delete(void* ptr) throw ()
90*111e0cbeSNick Kledzik {
91*111e0cbeSNick Kledzik     if (ptr)
92*111e0cbeSNick Kledzik         ::free(ptr);
93*111e0cbeSNick Kledzik }
94*111e0cbeSNick Kledzik 
95*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
96*111e0cbeSNick Kledzik void
97*111e0cbeSNick Kledzik operator delete(void* ptr, const std::nothrow_t&) throw ()
98*111e0cbeSNick Kledzik {
99*111e0cbeSNick Kledzik     ::operator delete(ptr);
100*111e0cbeSNick Kledzik }
101*111e0cbeSNick Kledzik 
102*111e0cbeSNick Kledzik 
103*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
104*111e0cbeSNick Kledzik void
105*111e0cbeSNick Kledzik operator delete[] (void* ptr) throw ()
106*111e0cbeSNick Kledzik {
107*111e0cbeSNick Kledzik     ::operator delete (ptr);
108*111e0cbeSNick Kledzik }
109*111e0cbeSNick Kledzik 
110*111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default")))
111*111e0cbeSNick Kledzik void
112*111e0cbeSNick Kledzik operator delete[] (void* ptr, const std::nothrow_t&) throw ()
113*111e0cbeSNick Kledzik {
114*111e0cbeSNick Kledzik     ::operator delete[](ptr);
115*111e0cbeSNick Kledzik }
116*111e0cbeSNick Kledzik 
117*111e0cbeSNick Kledzik 
1183e519524SHoward Hinnant namespace std
1193e519524SHoward Hinnant {
1203e519524SHoward Hinnant 
121*111e0cbeSNick Kledzik bad_alloc::bad_alloc() throw()
122*111e0cbeSNick Kledzik {
123*111e0cbeSNick Kledzik }
124*111e0cbeSNick Kledzik 
125*111e0cbeSNick Kledzik bad_alloc::~bad_alloc() throw()
126*111e0cbeSNick Kledzik {
127*111e0cbeSNick Kledzik }
128*111e0cbeSNick Kledzik 
129*111e0cbeSNick Kledzik const char*
130*111e0cbeSNick Kledzik bad_alloc::what() const throw()
131*111e0cbeSNick Kledzik {
132*111e0cbeSNick Kledzik     return "std::bad_alloc";
133*111e0cbeSNick Kledzik }
134*111e0cbeSNick Kledzik 
135*111e0cbeSNick Kledzik 
136*111e0cbeSNick Kledzik bad_array_new_length::bad_array_new_length() throw()
137*111e0cbeSNick Kledzik {
138*111e0cbeSNick Kledzik }
139*111e0cbeSNick Kledzik 
1403e519524SHoward Hinnant bad_array_new_length::~bad_array_new_length() throw()
1413e519524SHoward Hinnant {
1423e519524SHoward Hinnant }
1433e519524SHoward Hinnant 
1443e519524SHoward Hinnant const char*
1453e519524SHoward Hinnant bad_array_new_length::what() const throw()
1463e519524SHoward Hinnant {
1473e519524SHoward Hinnant     return "bad_array_new_length";
1483e519524SHoward Hinnant }
1493e519524SHoward Hinnant 
150*111e0cbeSNick Kledzik 
151*111e0cbeSNick Kledzik 
1523e519524SHoward Hinnant void
1533e519524SHoward Hinnant __throw_bad_alloc()
1543e519524SHoward Hinnant {
1553e519524SHoward Hinnant     throw bad_alloc();
1563e519524SHoward Hinnant }
1573e519524SHoward Hinnant 
1583e519524SHoward Hinnant }  // std
159