blob: 391718fdad7e03e79a2bdf9d9cc3eb3e1b821dfc [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 Fiselier850652f2017-01-20 01:13:49 +000067void*
68operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
69{
70 void* p = 0;
71#ifndef _LIBCPP_NO_EXCEPTIONS
72 try
73 {
74#endif // _LIBCPP_NO_EXCEPTIONS
75 p = ::operator new(size);
76#ifndef _LIBCPP_NO_EXCEPTIONS
77 }
78 catch (...)
79 {
80 }
81#endif // _LIBCPP_NO_EXCEPTIONS
82 return p;
83}
84
85_LIBCPP_WEAK
86void*
87operator new[](size_t size) _THROW_BAD_ALLOC
88{
89 return ::operator new(size);
90}
91
92_LIBCPP_WEAK
93void*
94operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
95{
96 void* p = 0;
97#ifndef _LIBCPP_NO_EXCEPTIONS
98 try
99 {
100#endif // _LIBCPP_NO_EXCEPTIONS
101 p = ::operator new[](size);
102#ifndef _LIBCPP_NO_EXCEPTIONS
103 }
104 catch (...)
105 {
106 }
107#endif // _LIBCPP_NO_EXCEPTIONS
108 return p;
109}
110
111_LIBCPP_WEAK
112void
113operator delete(void* ptr) _NOEXCEPT
114{
115 if (ptr)
116 ::free(ptr);
117}
118
119_LIBCPP_WEAK
120void
121operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
122{
123 ::operator delete(ptr);
124}
125
126_LIBCPP_WEAK
127void
128operator delete(void* ptr, size_t) _NOEXCEPT
129{
130 ::operator delete(ptr);
131}
132
133_LIBCPP_WEAK
134void
135operator delete[] (void* ptr) _NOEXCEPT
136{
137 ::operator delete(ptr);
138}
139
140_LIBCPP_WEAK
141void
142operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
143{
144 ::operator delete[](ptr);
145}
146
147_LIBCPP_WEAK
148void
149operator delete[] (void* ptr, size_t) _NOEXCEPT
150{
151 ::operator delete[](ptr);
152}
153
154_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000155void *
156operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
157{
158 if (size == 0)
159 size = 1;
160 if (static_cast<size_t>(alignment) < sizeof(void*))
161 alignment = std::align_val_t(sizeof(void*));
162 void* p;
Saleem Abdulrasoolee302e42017-01-03 21:53:51 +0000163#if defined(_LIBCPP_MSVCRT)
Eric Fiselier29aaae12016-12-23 20:17:23 +0000164 while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
165#else
Eric Fiselier162922f2016-10-14 06:46:30 +0000166 while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
Eric Fiselier29aaae12016-12-23 20:17:23 +0000167#endif
Eric Fiselier162922f2016-10-14 06:46:30 +0000168 {
169 // If posix_memalign fails and there is a new_handler,
170 // call it to try free up memory.
171 std::new_handler nh = std::get_new_handler();
172 if (nh)
173 nh();
174 else {
175#ifndef _LIBCPP_NO_EXCEPTIONS
176 throw std::bad_alloc();
177#else
178 p = nullptr; // posix_memalign doesn't initialize 'p' on failure
179 break;
180#endif
181 }
182 }
183 return p;
184}
185
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000186_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000187void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000188operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
189{
190 void* p = 0;
191#ifndef _LIBCPP_NO_EXCEPTIONS
192 try
193 {
194#endif // _LIBCPP_NO_EXCEPTIONS
195 p = ::operator new(size, alignment);
196#ifndef _LIBCPP_NO_EXCEPTIONS
197 }
198 catch (...)
199 {
200 }
201#endif // _LIBCPP_NO_EXCEPTIONS
202 return p;
203}
204
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000205_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000206void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000207operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
208{
209 return ::operator new(size, alignment);
210}
211
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000212_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000213void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000214operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
215{
216 void* p = 0;
217#ifndef _LIBCPP_NO_EXCEPTIONS
218 try
219 {
220#endif // _LIBCPP_NO_EXCEPTIONS
221 p = ::operator new[](size, alignment);
222#ifndef _LIBCPP_NO_EXCEPTIONS
223 }
224 catch (...)
225 {
226 }
227#endif // _LIBCPP_NO_EXCEPTIONS
228 return p;
229}
230
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000231_LIBCPP_WEAK
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000232void
Eric Fiselier162922f2016-10-14 06:46:30 +0000233operator delete(void* ptr, std::align_val_t) _NOEXCEPT
234{
235 if (ptr)
Shoaib Meenai35d3e692017-01-12 06:22:36 +0000236#if defined(_LIBCPP_MSVCRT)
237 ::_aligned_free(ptr);
238#else
Eric Fiselier162922f2016-10-14 06:46:30 +0000239 ::free(ptr);
Shoaib Meenai35d3e692017-01-12 06:22:36 +0000240#endif
Eric Fiselier162922f2016-10-14 06:46:30 +0000241}
242
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000243_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000244void
Eric Fiselier162922f2016-10-14 06:46:30 +0000245operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
246{
247 ::operator delete(ptr, alignment);
248}
249
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000250_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000251void
Eric Fiselier162922f2016-10-14 06:46:30 +0000252operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
253{
254 ::operator delete(ptr, alignment);
255}
256
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000257_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000258void
Eric Fiselier162922f2016-10-14 06:46:30 +0000259operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
260{
261 ::operator delete(ptr, alignment);
262}
263
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000264_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000265void
Eric Fiselier162922f2016-10-14 06:46:30 +0000266operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
267{
268 ::operator delete[](ptr, alignment);
269}
270
Shoaib Meenai2d71db42016-11-16 22:18:10 +0000271_LIBCPP_WEAK
Eric Fiselier162922f2016-10-14 06:46:30 +0000272void
Eric Fiselier162922f2016-10-14 06:46:30 +0000273operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
274{
275 ::operator delete[](ptr, alignment);
276}
277
Peter Collingbournedc009952013-10-06 22:13:16 +0000278#endif // !__GLIBCXX__
279
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280namespace std
281{
282
Peter Collingbournedc009952013-10-06 22:13:16 +0000283#ifndef __GLIBCXX__
Nick Kledzik09163cc2010-05-18 22:17:13 +0000284const nothrow_t nothrow = {};
Peter Collingbournedc009952013-10-06 22:13:16 +0000285#endif
Nick Kledzik09163cc2010-05-18 22:17:13 +0000286
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000287#ifndef _LIBCPPABI_VERSION
288
Peter Collingbournedc009952013-10-06 22:13:16 +0000289#ifndef __GLIBCXX__
290
Nick Kledzik09163cc2010-05-18 22:17:13 +0000291new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000292set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000293{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000294 return __sync_lock_test_and_set(&__new_handler, handler);
295}
296
297new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000298get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000299{
Joerg Sonnenbergerc7655a22014-01-04 17:43:00 +0000300 return __sync_fetch_and_add(&__new_handler, nullptr);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000301}
302
Peter Collingbournedc009952013-10-06 22:13:16 +0000303#endif // !__GLIBCXX__
304
David Chisnall3954f442012-02-29 12:59:17 +0000305#ifndef LIBCXXRT
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
Peter Collingbournedc009952013-10-06 22:13:16 +0000311#ifndef __GLIBCXX__
312
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000313bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000314{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000315}
316
Howard Hinnantffb308e2010-08-22 00:03:27 +0000317const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000318bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000319{
320 return "std::bad_alloc";
321}
322
Peter Collingbournedc009952013-10-06 22:13:16 +0000323#endif // !__GLIBCXX__
324
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000325bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000326{
327}
328
Eric Fiselier740a49d2016-11-18 22:25:41 +0000329#ifndef __GLIBCXX__
330
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000331bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332{
333}
334
Eric Fiselier11ec4412014-11-01 00:11:25 +0000335const char*
336bad_array_new_length::what() const _NOEXCEPT
337{
338 return "bad_array_new_length";
339}
340
Eric Fiselier740a49d2016-11-18 22:25:41 +0000341#endif // !__GLIBCXX__
342
Eric Fiselier7cca7da2014-10-29 23:14:53 +0000343#endif //LIBCXXRT
344
Eric Fiselier740a49d2016-11-18 22:25:41 +0000345bad_array_length::bad_array_length() _NOEXCEPT
346{
347}
348
349#ifndef __GLIBCXX__
350
351bad_array_length::~bad_array_length() _NOEXCEPT
352{
353}
354
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355const char*
Marshall Clow3bf77132013-09-11 01:38:42 +0000356bad_array_length::what() const _NOEXCEPT
357{
358 return "bad_array_length";
359}
360
Eric Fiselier740a49d2016-11-18 22:25:41 +0000361#endif // !__GLIBCXX__
Marshall Clow3bf77132013-09-11 01:38:42 +0000362
Marshall Clow3bf77132013-09-11 01:38:42 +0000363#endif // _LIBCPPABI_VERSION
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000364
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000365#ifndef LIBSTDCXX
366
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367void
368__throw_bad_alloc()
369{
Howard Hinnant72f73582010-08-11 17:04:31 +0000370#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371 throw bad_alloc();
Marshall Clow8fea1612016-08-25 15:09:01 +0000372#else
373 _VSTD::abort();
Howard Hinnant72f73582010-08-11 17:04:31 +0000374#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375}
376
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000377#endif // !LIBSTDCXX
378
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379} // std