blob: 782aac90fb7ab5bbbc32219f0b76d7e656036a81 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001//===--------------------------- new.cpp ----------------------------------===//
2//
Howard Hinnantc566dc32010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00004//
Howard Hinnantee11c312010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
Marshall Clow3bf77132013-09-11 01:38:42 +000010#define _LIBCPP_BUILDING_NEW
11
Howard Hinnant155c2af2010-05-24 17:49:41 +000012#include <stdlib.h>
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000013
Howard Hinnantc51e1022010-05-11 19:42:16 +000014#include "new"
15
Eric Fiselierb0da5fa2017-01-03 01:18:48 +000016#if defined(__APPLE__) && !defined(LIBCXXRT) && \
17 !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
Howard Hinnantffb308e2010-08-22 00:03:27 +000018 #include <cxxabi.h>
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000019
20 #ifndef _LIBCPPABI_VERSION
21 // On Darwin, there are two STL shared libraries and a lower level ABI
Marshall Clowf98383c2013-11-11 23:27:19 +000022 // shared library. The global holding the current new handler is
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000023 // in the ABI library and named __cxa_new_handler.
24 #define __new_handler __cxxabiapple::__cxa_new_handler
25 #endif
Howard Hinnantffb308e2010-08-22 00:03:27 +000026#else // __APPLE__
Benjamin Krameraf9fc2c2015-10-16 11:14:30 +000027 #if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI)
Howard Hinnanta4cabeb2012-07-26 17:42:39 +000028 #include <cxxabi.h>
Benjamin Krameraf9fc2c2015-10-16 11:14:30 +000029 #endif // defined(LIBCXX_BUILDING_LIBCXXABI)
Eric Fiselierb0da5fa2017-01-03 01:18:48 +000030 #if defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) || \
31 (!defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__))
Howard Hinnanta4cabeb2012-07-26 17:42:39 +000032 static std::new_handler __new_handler;
33 #endif // _LIBCPPABI_VERSION
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000034#endif
35
Peter Collingbournedc009952013-10-06 22:13:16 +000036#ifndef __GLIBCXX__
37
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000038// Implement all new and delete operators as weak definitions
Eric Fiseliercd4496b2015-08-20 05:23:16 +000039// in this shared library, so that they can be overridden by programs
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000040// that define non-weak copies of the functions.
41
Shoaib Meenai2d71db42016-11-16 22:18:10 +000042_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000043void *
Eric Fiselier162922f2016-10-14 06:46:30 +000044operator new(std::size_t size) _THROW_BAD_ALLOC
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000045{
46 if (size == 0)
47 size = 1;
48 void* p;
49 while ((p = ::malloc(size)) == 0)
50 {
Howard Hinnant34468d42010-08-22 13:53:14 +000051 // If malloc fails and there is a new_handler,
52 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000053 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000054 if (nh)
55 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000056 else
Howard Hinnant72f73582010-08-11 17:04:31 +000057#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000058 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000059#else
60 break;
61#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000062 }
63 return p;
64}
65
Shoaib Meenai2d71db42016-11-16 22:18:10 +000066_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +000067void *
68operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
69{
70 if (size == 0)
71 size = 1;
72 if (static_cast<size_t>(alignment) < sizeof(void*))
73 alignment = std::align_val_t(sizeof(void*));
74 void* p;
Saleem Abdulrasoolee302e42017-01-03 21:53:51 +000075#if defined(_LIBCPP_MSVCRT)
Eric Fiselier29aaae12016-12-23 20:17:23 +000076 while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
77#else
Eric Fiselier162922f2016-10-14 06:46:30 +000078 while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
Eric Fiselier29aaae12016-12-23 20:17:23 +000079#endif
Eric Fiselier162922f2016-10-14 06:46:30 +000080 {
81 // If posix_memalign fails and there is a new_handler,
82 // call it to try free up memory.
83 std::new_handler nh = std::get_new_handler();
84 if (nh)
85 nh();
86 else {
87#ifndef _LIBCPP_NO_EXCEPTIONS
88 throw std::bad_alloc();
89#else
90 p = nullptr; // posix_memalign doesn't initialize 'p' on failure
91 break;
92#endif
93 }
94 }
95 return p;
96}
97
Shoaib Meenai2d71db42016-11-16 22:18:10 +000098_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000099void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000100operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000101{
102 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +0000103#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000104 try
105 {
Howard Hinnantffb308e2010-08-22 00:03:27 +0000106#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000107 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +0000108#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000109 }
110 catch (...)
111 {
112 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000113#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000114 return p;
115}
116
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000117_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000118void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000119operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
120{
121 void* p = 0;
122#ifndef _LIBCPP_NO_EXCEPTIONS
123 try
124 {
125#endif // _LIBCPP_NO_EXCEPTIONS
126 p = ::operator new(size, alignment);
127#ifndef _LIBCPP_NO_EXCEPTIONS
128 }
129 catch (...)
130 {
131 }
132#endif // _LIBCPP_NO_EXCEPTIONS
133 return p;
134}
135
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000136_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000137void*
138operator new[](size_t size) _THROW_BAD_ALLOC
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000139{
140 return ::operator new(size);
141}
142
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000143_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000144void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000145operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
146{
147 return ::operator new(size, alignment);
148}
149
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000150_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000151void*
Howard Hinnant28b24882011-12-01 20:21:04 +0000152operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000153{
154 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +0000155#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000156 try
157 {
Howard Hinnantffb308e2010-08-22 00:03:27 +0000158#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000159 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +0000160#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000161 }
162 catch (...)
163 {
164 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000165#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000166 return p;
167}
168
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000169_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000170void*
171operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
172{
173 void* p = 0;
174#ifndef _LIBCPP_NO_EXCEPTIONS
175 try
176 {
177#endif // _LIBCPP_NO_EXCEPTIONS
178 p = ::operator new[](size, alignment);
179#ifndef _LIBCPP_NO_EXCEPTIONS
180 }
181 catch (...)
182 {
183 }
184#endif // _LIBCPP_NO_EXCEPTIONS
185 return p;
186}
187
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000188_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000189void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000190operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000191{
192 if (ptr)
193 ::free(ptr);
194}
195
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000196_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000197void
Eric Fiselier162922f2016-10-14 06:46:30 +0000198operator delete(void* ptr, std::align_val_t) _NOEXCEPT
199{
200 if (ptr)
201 ::free(ptr);
202}
203
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000204_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000205void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000206operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000207{
208 ::operator delete(ptr);
209}
210
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000211_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000212void
Eric Fiselier162922f2016-10-14 06:46:30 +0000213operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
214{
215 ::operator delete(ptr, alignment);
216}
217
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000218_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000219void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000220operator delete(void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000221{
222 ::operator delete(ptr);
223}
224
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000225_LIBCPP_WEAK
Larisse Voufo574190d2015-02-15 05:18:55 +0000226void
Eric Fiselier162922f2016-10-14 06:46:30 +0000227operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
228{
229 ::operator delete(ptr, alignment);
230}
231
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000232_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000233void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000234operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000235{
Larisse Voufo574190d2015-02-15 05:18:55 +0000236 ::operator delete(ptr);
237}
238
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000239_LIBCPP_WEAK
Larisse Voufo574190d2015-02-15 05:18:55 +0000240void
Eric Fiselier162922f2016-10-14 06:46:30 +0000241operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
242{
243 ::operator delete(ptr, alignment);
244}
245
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000246_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000247void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000248operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000249{
250 ::operator delete[](ptr);
251}
252
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000253_LIBCPP_WEAK
Larisse Voufo574190d2015-02-15 05:18:55 +0000254void
Eric Fiselier162922f2016-10-14 06:46:30 +0000255operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
256{
257 ::operator delete[](ptr, alignment);
258}
259
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000260_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000261void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000262operator delete[] (void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000263{
264 ::operator delete[](ptr);
265}
266
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000267_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000268void
269operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
270{
271 ::operator delete[](ptr, alignment);
272}
273
Peter Collingbournedc009952013-10-06 22:13:16 +0000274#endif // !__GLIBCXX__
275
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276namespace std
277{
278
Peter Collingbournedc009952013-10-06 22:13:16 +0000279#ifndef __GLIBCXX__
Nick Kledzik09163cc2010-05-18 22:17:13 +0000280const nothrow_t nothrow = {};
Peter Collingbournedc009952013-10-06 22:13:16 +0000281#endif
Nick Kledzik09163cc2010-05-18 22:17:13 +0000282
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000283#ifndef _LIBCPPABI_VERSION
284
Peter Collingbournedc009952013-10-06 22:13:16 +0000285#ifndef __GLIBCXX__
286
Nick Kledzik09163cc2010-05-18 22:17:13 +0000287new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000288set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000289{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000290 return __sync_lock_test_and_set(&__new_handler, handler);
291}
292
293new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000294get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000295{
Joerg Sonnenbergerc7655a22014-01-04 17:43:00 +0000296 return __sync_fetch_and_add(&__new_handler, nullptr);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000297}
298
Peter Collingbournedc009952013-10-06 22:13:16 +0000299#endif // !__GLIBCXX__
300
David Chisnall3954f442012-02-29 12:59:17 +0000301#ifndef LIBCXXRT
302
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000303bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000304{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000305}
306
Peter Collingbournedc009952013-10-06 22:13:16 +0000307#ifndef __GLIBCXX__
308
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000309bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000310{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000311}
312
Howard Hinnantffb308e2010-08-22 00:03:27 +0000313const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000314bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000315{
316 return "std::bad_alloc";
317}
318
Peter Collingbournedc009952013-10-06 22:13:16 +0000319#endif // !__GLIBCXX__
320
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000321bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000322{
323}
324
Eric Fiselier740a49d2016-11-18 22:25:41 +0000325#ifndef __GLIBCXX__
326
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000327bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328{
329}
330
Eric Fiselier11ec4412014-11-01 00:11:25 +0000331const char*
332bad_array_new_length::what() const _NOEXCEPT
333{
334 return "bad_array_new_length";
335}
336
Eric Fiselier740a49d2016-11-18 22:25:41 +0000337#endif // !__GLIBCXX__
338
Eric Fiselier7cca7da2014-10-29 23:14:53 +0000339#endif //LIBCXXRT
340
Eric Fiselier740a49d2016-11-18 22:25:41 +0000341bad_array_length::bad_array_length() _NOEXCEPT
342{
343}
344
345#ifndef __GLIBCXX__
346
347bad_array_length::~bad_array_length() _NOEXCEPT
348{
349}
350
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351const char*
Marshall Clow3bf77132013-09-11 01:38:42 +0000352bad_array_length::what() const _NOEXCEPT
353{
354 return "bad_array_length";
355}
356
Eric Fiselier740a49d2016-11-18 22:25:41 +0000357#endif // !__GLIBCXX__
Marshall Clow3bf77132013-09-11 01:38:42 +0000358
Marshall Clow3bf77132013-09-11 01:38:42 +0000359#endif // _LIBCPPABI_VERSION
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000360
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000361#ifndef LIBSTDCXX
362
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363void
364__throw_bad_alloc()
365{
Howard Hinnant72f73582010-08-11 17:04:31 +0000366#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 throw bad_alloc();
Marshall Clow8fea1612016-08-25 15:09:01 +0000368#else
369 _VSTD::abort();
Howard Hinnant72f73582010-08-11 17:04:31 +0000370#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371}
372
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000373#endif // !LIBSTDCXX
374
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375} // std