1 //===----------------------------------------------------------------------===//
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
8 // This file implements the new and delete operators.
9 //===----------------------------------------------------------------------===//
11 #include "__cxxabi_config.h"
15 #if !defined(_THROW_BAD_ALLOC) || !defined(_LIBCXXABI_WEAK)
16 #error The _THROW_BAD_ALLOC and _LIBCXXABI_WEAK libc++ macros must \
17 already be defined by libc++.
19 // Implement all new and delete operators as weak definitions
20 // in this shared library, so that they can be overridden by programs
21 // that define non-weak copies of the functions.
25 operator new(std::size_t size
) _THROW_BAD_ALLOC
30 while ((p
= ::malloc(size
)) == nullptr)
32 // If malloc fails and there is a new_handler,
33 // call it to try free up memory.
34 std::new_handler nh
= std::get_new_handler();
38 #ifndef _LIBCXXABI_NO_EXCEPTIONS
39 throw std::bad_alloc();
49 operator new(size_t size
, const std::nothrow_t
&) noexcept
52 #ifndef _LIBCXXABI_NO_EXCEPTIONS
55 #endif // _LIBCXXABI_NO_EXCEPTIONS
56 p
= ::operator new(size
);
57 #ifndef _LIBCXXABI_NO_EXCEPTIONS
62 #endif // _LIBCXXABI_NO_EXCEPTIONS
68 operator new[](size_t size
) _THROW_BAD_ALLOC
70 return ::operator new(size
);
75 operator new[](size_t size
, const std::nothrow_t
&) noexcept
78 #ifndef _LIBCXXABI_NO_EXCEPTIONS
81 #endif // _LIBCXXABI_NO_EXCEPTIONS
82 p
= ::operator new[](size
);
83 #ifndef _LIBCXXABI_NO_EXCEPTIONS
88 #endif // _LIBCXXABI_NO_EXCEPTIONS
94 operator delete(void* ptr
) noexcept
101 operator delete(void* ptr
, const std::nothrow_t
&) noexcept
103 ::operator delete(ptr
);
108 operator delete(void* ptr
, size_t) noexcept
110 ::operator delete(ptr
);
115 operator delete[] (void* ptr
) noexcept
117 ::operator delete(ptr
);
122 operator delete[] (void* ptr
, const std::nothrow_t
&) noexcept
124 ::operator delete[](ptr
);
129 operator delete[] (void* ptr
, size_t) noexcept
131 ::operator delete[](ptr
);
134 #if !defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION)
138 operator new(std::size_t size
, std::align_val_t alignment
) _THROW_BAD_ALLOC
142 if (static_cast<size_t>(alignment
) < sizeof(void*))
143 alignment
= std::align_val_t(sizeof(void*));
145 // Try allocating memory. If allocation fails and there is a new_handler,
146 // call it to try free up memory, and try again until it succeeds, or until
147 // the new_handler decides to terminate.
149 // If allocation fails and there is no new_handler, we throw bad_alloc
150 // (or return nullptr if exceptions are disabled).
152 while ((p
= std::__libcpp_aligned_alloc(static_cast<std::size_t>(alignment
), size
)) == nullptr)
154 std::new_handler nh
= std::get_new_handler();
158 #ifndef _LIBCXXABI_NO_EXCEPTIONS
159 throw std::bad_alloc();
170 operator new(size_t size
, std::align_val_t alignment
, const std::nothrow_t
&) noexcept
173 #ifndef _LIBCXXABI_NO_EXCEPTIONS
176 #endif // _LIBCXXABI_NO_EXCEPTIONS
177 p
= ::operator new(size
, alignment
);
178 #ifndef _LIBCXXABI_NO_EXCEPTIONS
183 #endif // _LIBCXXABI_NO_EXCEPTIONS
189 operator new[](size_t size
, std::align_val_t alignment
) _THROW_BAD_ALLOC
191 return ::operator new(size
, alignment
);
196 operator new[](size_t size
, std::align_val_t alignment
, const std::nothrow_t
&) noexcept
199 #ifndef _LIBCXXABI_NO_EXCEPTIONS
202 #endif // _LIBCXXABI_NO_EXCEPTIONS
203 p
= ::operator new[](size
, alignment
);
204 #ifndef _LIBCXXABI_NO_EXCEPTIONS
209 #endif // _LIBCXXABI_NO_EXCEPTIONS
215 operator delete(void* ptr
, std::align_val_t
) noexcept
217 std::__libcpp_aligned_free(ptr
);
222 operator delete(void* ptr
, std::align_val_t alignment
, const std::nothrow_t
&) noexcept
224 ::operator delete(ptr
, alignment
);
229 operator delete(void* ptr
, size_t, std::align_val_t alignment
) noexcept
231 ::operator delete(ptr
, alignment
);
236 operator delete[] (void* ptr
, std::align_val_t alignment
) noexcept
238 ::operator delete(ptr
, alignment
);
243 operator delete[] (void* ptr
, std::align_val_t alignment
, const std::nothrow_t
&) noexcept
245 ::operator delete[](ptr
, alignment
);
250 operator delete[] (void* ptr
, size_t, std::align_val_t alignment
) noexcept
252 ::operator delete[](ptr
, alignment
);
255 #endif // !_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION