blob: 3d8b2a9d8a660c903ac0ba77ca2c76ba3e099a43 [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 Fiselier224f9602017-01-02 22:27:45 +000016#if defined(__APPLE__) && !defined(LIBCXXRT)
Howard Hinnantffb308e2010-08-22 00:03:27 +000017 #include <cxxabi.h>
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000018
19 #ifndef _LIBCPPABI_VERSION
20 // On Darwin, there are two STL shared libraries and a lower level ABI
Marshall Clowf98383c2013-11-11 23:27:19 +000021 // shared library. The global holding the current new handler is
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000022 // in the ABI library and named __cxa_new_handler.
23 #define __new_handler __cxxabiapple::__cxa_new_handler
24 #endif
Howard Hinnantffb308e2010-08-22 00:03:27 +000025#else // __APPLE__
Benjamin Krameraf9fc2c2015-10-16 11:14:30 +000026 #if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI)
Howard Hinnanta4cabeb2012-07-26 17:42:39 +000027 #include <cxxabi.h>
Benjamin Krameraf9fc2c2015-10-16 11:14:30 +000028 #endif // defined(LIBCXX_BUILDING_LIBCXXABI)
Eric Fiselier224f9602017-01-02 22:27:45 +000029 #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
Howard Hinnanta4cabeb2012-07-26 17:42:39 +000030 static std::new_handler __new_handler;
31 #endif // _LIBCPPABI_VERSION
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000032#endif
33
Peter Collingbournedc009952013-10-06 22:13:16 +000034#ifndef __GLIBCXX__
35
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000036// Implement all new and delete operators as weak definitions
Eric Fiseliercd4496b2015-08-20 05:23:16 +000037// in this shared library, so that they can be overridden by programs
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000038// that define non-weak copies of the functions.
39
Shoaib Meenai2d71db42016-11-16 22:18:10 +000040_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000041void *
Eric Fiselier162922f2016-10-14 06:46:30 +000042operator new(std::size_t size) _THROW_BAD_ALLOC
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000043{
44 if (size == 0)
45 size = 1;
46 void* p;
47 while ((p = ::malloc(size)) == 0)
48 {
Howard Hinnant34468d42010-08-22 13:53:14 +000049 // If malloc fails and there is a new_handler,
50 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000051 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000052 if (nh)
53 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000054 else
Howard Hinnant72f73582010-08-11 17:04:31 +000055#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000056 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000057#else
58 break;
59#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000060 }
61 return p;
62}
63
Shoaib Meenai2d71db42016-11-16 22:18:10 +000064_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +000065void *
66operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
67{
68 if (size == 0)
69 size = 1;
70 if (static_cast<size_t>(alignment) < sizeof(void*))
71 alignment = std::align_val_t(sizeof(void*));
72 void* p;
Eric Fiselier29aaae12016-12-23 20:17:23 +000073#if defined(_WIN32)
74 while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
75#else
Eric Fiselier162922f2016-10-14 06:46:30 +000076 while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
Eric Fiselier29aaae12016-12-23 20:17:23 +000077#endif
Eric Fiselier162922f2016-10-14 06:46:30 +000078 {
79 // If posix_memalign fails and there is a new_handler,
80 // call it to try free up memory.
81 std::new_handler nh = std::get_new_handler();
82 if (nh)
83 nh();
84 else {
85#ifndef _LIBCPP_NO_EXCEPTIONS
86 throw std::bad_alloc();
87#else
88 p = nullptr; // posix_memalign doesn't initialize 'p' on failure
89 break;
90#endif
91 }
92 }
93 return p;
94}
95
Shoaib Meenai2d71db42016-11-16 22:18:10 +000096_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000097void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000098operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000099{
100 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +0000101#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000102 try
103 {
Howard Hinnantffb308e2010-08-22 00:03:27 +0000104#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000105 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +0000106#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000107 }
108 catch (...)
109 {
110 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000111#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000112 return p;
113}
114
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000115_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000116void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000117operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
118{
119 void* p = 0;
120#ifndef _LIBCPP_NO_EXCEPTIONS
121 try
122 {
123#endif // _LIBCPP_NO_EXCEPTIONS
124 p = ::operator new(size, alignment);
125#ifndef _LIBCPP_NO_EXCEPTIONS
126 }
127 catch (...)
128 {
129 }
130#endif // _LIBCPP_NO_EXCEPTIONS
131 return p;
132}
133
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000134_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000135void*
136operator new[](size_t size) _THROW_BAD_ALLOC
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000137{
138 return ::operator new(size);
139}
140
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000141_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000142void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000143operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
144{
145 return ::operator new(size, alignment);
146}
147
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000148_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000149void*
Howard Hinnant28b24882011-12-01 20:21:04 +0000150operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000151{
152 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +0000153#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000154 try
155 {
Howard Hinnantffb308e2010-08-22 00:03:27 +0000156#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000157 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +0000158#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000159 }
160 catch (...)
161 {
162 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000163#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000164 return p;
165}
166
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000167_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000168void*
169operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
170{
171 void* p = 0;
172#ifndef _LIBCPP_NO_EXCEPTIONS
173 try
174 {
175#endif // _LIBCPP_NO_EXCEPTIONS
176 p = ::operator new[](size, alignment);
177#ifndef _LIBCPP_NO_EXCEPTIONS
178 }
179 catch (...)
180 {
181 }
182#endif // _LIBCPP_NO_EXCEPTIONS
183 return p;
184}
185
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000186_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000187void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000188operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000189{
190 if (ptr)
191 ::free(ptr);
192}
193
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000194_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000195void
Eric Fiselier162922f2016-10-14 06:46:30 +0000196operator delete(void* ptr, std::align_val_t) _NOEXCEPT
197{
198 if (ptr)
199 ::free(ptr);
200}
201
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000202_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000203void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000204operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000205{
206 ::operator delete(ptr);
207}
208
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000209_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000210void
Eric Fiselier162922f2016-10-14 06:46:30 +0000211operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
212{
213 ::operator delete(ptr, alignment);
214}
215
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000216_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000217void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000218operator delete(void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000219{
220 ::operator delete(ptr);
221}
222
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000223_LIBCPP_WEAK
Larisse Voufo574190d2015-02-15 05:18:55 +0000224void
Eric Fiselier162922f2016-10-14 06:46:30 +0000225operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
226{
227 ::operator delete(ptr, alignment);
228}
229
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000230_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000231void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000232operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000233{
Larisse Voufo574190d2015-02-15 05:18:55 +0000234 ::operator delete(ptr);
235}
236
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000237_LIBCPP_WEAK
Larisse Voufo574190d2015-02-15 05:18:55 +0000238void
Eric Fiselier162922f2016-10-14 06:46:30 +0000239operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
240{
241 ::operator delete(ptr, alignment);
242}
243
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000244_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000245void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000246operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000247{
248 ::operator delete[](ptr);
249}
250
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000251_LIBCPP_WEAK
Larisse Voufo574190d2015-02-15 05:18:55 +0000252void
Eric Fiselier162922f2016-10-14 06:46:30 +0000253operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
254{
255 ::operator delete[](ptr, alignment);
256}
257
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000258_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000259void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000260operator delete[] (void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000261{
262 ::operator delete[](ptr);
263}
264
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000265_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000266void
267operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
268{
269 ::operator delete[](ptr, alignment);
270}
271
Peter Collingbournedc009952013-10-06 22:13:16 +0000272#endif // !__GLIBCXX__
273
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274namespace std
275{
276
Peter Collingbournedc009952013-10-06 22:13:16 +0000277#ifndef __GLIBCXX__
Nick Kledzik09163cc2010-05-18 22:17:13 +0000278const nothrow_t nothrow = {};
Peter Collingbournedc009952013-10-06 22:13:16 +0000279#endif
Nick Kledzik09163cc2010-05-18 22:17:13 +0000280
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000281#ifndef _LIBCPPABI_VERSION
282
Peter Collingbournedc009952013-10-06 22:13:16 +0000283#ifndef __GLIBCXX__
284
Nick Kledzik09163cc2010-05-18 22:17:13 +0000285new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000286set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000287{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000288 return __sync_lock_test_and_set(&__new_handler, handler);
289}
290
291new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000292get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000293{
Joerg Sonnenbergerc7655a22014-01-04 17:43:00 +0000294 return __sync_fetch_and_add(&__new_handler, nullptr);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000295}
296
Peter Collingbournedc009952013-10-06 22:13:16 +0000297#endif // !__GLIBCXX__
298
David Chisnall3954f442012-02-29 12:59:17 +0000299#ifndef LIBCXXRT
300
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000301bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000302{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000303}
304
Peter Collingbournedc009952013-10-06 22:13:16 +0000305#ifndef __GLIBCXX__
306
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000307bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000308{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000309}
310
Howard Hinnantffb308e2010-08-22 00:03:27 +0000311const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000312bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000313{
314 return "std::bad_alloc";
315}
316
Peter Collingbournedc009952013-10-06 22:13:16 +0000317#endif // !__GLIBCXX__
318
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000319bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000320{
321}
322
Eric Fiselier740a49d2016-11-18 22:25:41 +0000323#ifndef __GLIBCXX__
324
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000325bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326{
327}
328
Eric Fiselier11ec4412014-11-01 00:11:25 +0000329const char*
330bad_array_new_length::what() const _NOEXCEPT
331{
332 return "bad_array_new_length";
333}
334
Eric Fiselier740a49d2016-11-18 22:25:41 +0000335#endif // !__GLIBCXX__
336
Eric Fiselier7cca7da2014-10-29 23:14:53 +0000337#endif //LIBCXXRT
338
Eric Fiselier740a49d2016-11-18 22:25:41 +0000339bad_array_length::bad_array_length() _NOEXCEPT
340{
341}
342
343#ifndef __GLIBCXX__
344
345bad_array_length::~bad_array_length() _NOEXCEPT
346{
347}
348
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349const char*
Marshall Clow3bf77132013-09-11 01:38:42 +0000350bad_array_length::what() const _NOEXCEPT
351{
352 return "bad_array_length";
353}
354
Eric Fiselier740a49d2016-11-18 22:25:41 +0000355#endif // !__GLIBCXX__
Marshall Clow3bf77132013-09-11 01:38:42 +0000356
Marshall Clow3bf77132013-09-11 01:38:42 +0000357#endif // _LIBCPPABI_VERSION
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000358
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000359#ifndef LIBSTDCXX
360
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361void
362__throw_bad_alloc()
363{
Howard Hinnant72f73582010-08-11 17:04:31 +0000364#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000365 throw bad_alloc();
Marshall Clow8fea1612016-08-25 15:09:01 +0000366#else
367 _VSTD::abort();
Howard Hinnant72f73582010-08-11 17:04:31 +0000368#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000369}
370
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000371#endif // !LIBSTDCXX
372
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373} // std