xref: /openbsd-src/gnu/llvm/libcxxabi/src/stdlib_new_delete.cpp (revision d0fc3bb68efd6c434b4053cd7adb29023cbec341)
1 //===--------------------- stdlib_new_delete.cpp --------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //
8 // This file implements the new and delete operators.
9 //===----------------------------------------------------------------------===//
10 
11 #define _LIBCPP_BUILDING_LIBRARY
12 #include "__cxxabi_config.h"
13 #include <new>
14 #include <cstdlib>
15 
16 #if !defined(_THROW_BAD_ALLOC) || !defined(_NOEXCEPT) || !defined(_LIBCXXABI_WEAK)
17 #error The _THROW_BAD_ALLOC, _NOEXCEPT, and _LIBCXXABI_WEAK libc++ macros must \
18        already be defined by libc++.
19 #endif
20 // Implement all new and delete operators as weak definitions
21 // in this shared library, so that they can be overridden by programs
22 // that define non-weak copies of the functions.
23 
24 _LIBCXXABI_WEAK
25 void *
26 operator new(std::size_t size) _THROW_BAD_ALLOC
27 {
28     if (size == 0)
29         size = 1;
30     void* p;
31     while ((p = ::malloc(size)) == 0)
32     {
33         // If malloc fails and there is a new_handler,
34         // call it to try free up memory.
35         std::new_handler nh = std::get_new_handler();
36         if (nh)
37             nh();
38         else
39 #ifndef _LIBCXXABI_NO_EXCEPTIONS
40             throw std::bad_alloc();
41 #else
42             break;
43 #endif
44     }
45     return p;
46 }
47 
48 _LIBCXXABI_WEAK
49 void*
50 operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
51 {
52     void* p = 0;
53 #ifndef _LIBCXXABI_NO_EXCEPTIONS
54     try
55     {
56 #endif  // _LIBCXXABI_NO_EXCEPTIONS
57         p = ::operator new(size);
58 #ifndef _LIBCXXABI_NO_EXCEPTIONS
59     }
60     catch (...)
61     {
62     }
63 #endif  // _LIBCXXABI_NO_EXCEPTIONS
64     return p;
65 }
66 
67 _LIBCXXABI_WEAK
68 void*
69 operator new[](size_t size) _THROW_BAD_ALLOC
70 {
71     return ::operator new(size);
72 }
73 
74 _LIBCXXABI_WEAK
75 void*
76 operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
77 {
78     void* p = 0;
79 #ifndef _LIBCXXABI_NO_EXCEPTIONS
80     try
81     {
82 #endif  // _LIBCXXABI_NO_EXCEPTIONS
83         p = ::operator new[](size);
84 #ifndef _LIBCXXABI_NO_EXCEPTIONS
85     }
86     catch (...)
87     {
88     }
89 #endif  // _LIBCXXABI_NO_EXCEPTIONS
90     return p;
91 }
92 
93 _LIBCXXABI_WEAK
94 void
95 operator delete(void* ptr) _NOEXCEPT
96 {
97     if (ptr)
98         ::free(ptr);
99 }
100 
101 _LIBCXXABI_WEAK
102 void
103 operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
104 {
105     ::operator delete(ptr);
106 }
107 
108 _LIBCXXABI_WEAK
109 void
110 operator delete(void* ptr, size_t) _NOEXCEPT
111 {
112     ::operator delete(ptr);
113 }
114 
115 _LIBCXXABI_WEAK
116 void
117 operator delete[] (void* ptr) _NOEXCEPT
118 {
119     ::operator delete(ptr);
120 }
121 
122 _LIBCXXABI_WEAK
123 void
124 operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
125 {
126     ::operator delete[](ptr);
127 }
128 
129 _LIBCXXABI_WEAK
130 void
131 operator delete[] (void* ptr, size_t) _NOEXCEPT
132 {
133     ::operator delete[](ptr);
134 }
135 
136 #if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
137 
138 _LIBCXXABI_WEAK
139 void *
140 operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
141 {
142     if (size == 0)
143         size = 1;
144     if (static_cast<size_t>(alignment) < sizeof(void*))
145       alignment = std::align_val_t(sizeof(void*));
146     void* p;
147 #if defined(_LIBCPP_WIN32API)
148     while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
149 #else
150     while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
151 #endif
152     {
153         // If posix_memalign fails and there is a new_handler,
154         // call it to try free up memory.
155         std::new_handler nh = std::get_new_handler();
156         if (nh)
157             nh();
158         else {
159 #ifndef _LIBCXXABI_NO_EXCEPTIONS
160             throw std::bad_alloc();
161 #else
162             p = nullptr; // posix_memalign doesn't initialize 'p' on failure
163             break;
164 #endif
165         }
166     }
167     return p;
168 }
169 
170 _LIBCXXABI_WEAK
171 void*
172 operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
173 {
174     void* p = 0;
175 #ifndef _LIBCXXABI_NO_EXCEPTIONS
176     try
177     {
178 #endif  // _LIBCXXABI_NO_EXCEPTIONS
179         p = ::operator new(size, alignment);
180 #ifndef _LIBCXXABI_NO_EXCEPTIONS
181     }
182     catch (...)
183     {
184     }
185 #endif  // _LIBCXXABI_NO_EXCEPTIONS
186     return p;
187 }
188 
189 _LIBCXXABI_WEAK
190 void*
191 operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
192 {
193     return ::operator new(size, alignment);
194 }
195 
196 _LIBCXXABI_WEAK
197 void*
198 operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
199 {
200     void* p = 0;
201 #ifndef _LIBCXXABI_NO_EXCEPTIONS
202     try
203     {
204 #endif  // _LIBCXXABI_NO_EXCEPTIONS
205         p = ::operator new[](size, alignment);
206 #ifndef _LIBCXXABI_NO_EXCEPTIONS
207     }
208     catch (...)
209     {
210     }
211 #endif  // _LIBCXXABI_NO_EXCEPTIONS
212     return p;
213 }
214 
215 _LIBCXXABI_WEAK
216 void
217 operator delete(void* ptr, std::align_val_t) _NOEXCEPT
218 {
219     if (ptr)
220 #if defined(_LIBCPP_WIN32API)
221         ::_aligned_free(ptr);
222 #else
223         ::free(ptr);
224 #endif
225 }
226 
227 _LIBCXXABI_WEAK
228 void
229 operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
230 {
231     ::operator delete(ptr, alignment);
232 }
233 
234 _LIBCXXABI_WEAK
235 void
236 operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
237 {
238     ::operator delete(ptr, alignment);
239 }
240 
241 _LIBCXXABI_WEAK
242 void
243 operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
244 {
245     ::operator delete(ptr, alignment);
246 }
247 
248 _LIBCXXABI_WEAK
249 void
250 operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
251 {
252     ::operator delete[](ptr, alignment);
253 }
254 
255 _LIBCXXABI_WEAK
256 void
257 operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
258 {
259     ::operator delete[](ptr, alignment);
260 }
261 
262 #endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
263