blob: 8e002d4a95f3c98a13f8a5c65fa90cf523ea5603 [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 Fiselier86c674e2014-11-01 00:41:42 +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)
Peter Collingbournedc009952013-10-06 22:13:16 +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
Howard Hinnantdaf51d72013-10-06 20:53:24 +000040_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
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
Howard Hinnantdaf51d72013-10-06 20:53:24 +000064_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
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;
73 while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
74 {
75 // If posix_memalign fails and there is a new_handler,
76 // call it to try free up memory.
77 std::new_handler nh = std::get_new_handler();
78 if (nh)
79 nh();
80 else {
81#ifndef _LIBCPP_NO_EXCEPTIONS
82 throw std::bad_alloc();
83#else
84 p = nullptr; // posix_memalign doesn't initialize 'p' on failure
85 break;
86#endif
87 }
88 }
89 return p;
90}
91
92_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000093void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000094operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000095{
96 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000097#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000098 try
99 {
Howard Hinnantffb308e2010-08-22 00:03:27 +0000100#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000101 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +0000102#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000103 }
104 catch (...)
105 {
106 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000107#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000108 return p;
109}
110
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000111_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000112void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000113operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
114{
115 void* p = 0;
116#ifndef _LIBCPP_NO_EXCEPTIONS
117 try
118 {
119#endif // _LIBCPP_NO_EXCEPTIONS
120 p = ::operator new(size, alignment);
121#ifndef _LIBCPP_NO_EXCEPTIONS
122 }
123 catch (...)
124 {
125 }
126#endif // _LIBCPP_NO_EXCEPTIONS
127 return p;
128}
129
130_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
131void*
132operator new[](size_t size) _THROW_BAD_ALLOC
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000133{
134 return ::operator new(size);
135}
136
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000137_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000138void*
Eric Fiselier162922f2016-10-14 06:46:30 +0000139operator new[](size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
140{
141 return ::operator new(size, alignment);
142}
143
144_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
145void*
Howard Hinnant28b24882011-12-01 20:21:04 +0000146operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000147{
148 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +0000149#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000150 try
151 {
Howard Hinnantffb308e2010-08-22 00:03:27 +0000152#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000153 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +0000154#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000155 }
156 catch (...)
157 {
158 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000159#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000160 return p;
161}
162
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000163_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Eric Fiselier162922f2016-10-14 06:46:30 +0000164void*
165operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
166{
167 void* p = 0;
168#ifndef _LIBCPP_NO_EXCEPTIONS
169 try
170 {
171#endif // _LIBCPP_NO_EXCEPTIONS
172 p = ::operator new[](size, alignment);
173#ifndef _LIBCPP_NO_EXCEPTIONS
174 }
175 catch (...)
176 {
177 }
178#endif // _LIBCPP_NO_EXCEPTIONS
179 return p;
180}
181
182_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000183void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000184operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000185{
186 if (ptr)
187 ::free(ptr);
188}
189
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000190_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000191void
Eric Fiselier162922f2016-10-14 06:46:30 +0000192operator delete(void* ptr, std::align_val_t) _NOEXCEPT
193{
194 if (ptr)
195 ::free(ptr);
196}
197
198_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
199void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000200operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000201{
202 ::operator delete(ptr);
203}
204
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000205_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000206void
Eric Fiselier162922f2016-10-14 06:46:30 +0000207operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
208{
209 ::operator delete(ptr, alignment);
210}
211
212_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
213void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000214operator delete(void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000215{
216 ::operator delete(ptr);
217}
218
219_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
220void
Eric Fiselier162922f2016-10-14 06:46:30 +0000221operator delete(void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
222{
223 ::operator delete(ptr, alignment);
224}
225
226_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
227void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000228operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000229{
Larisse Voufo574190d2015-02-15 05:18:55 +0000230 ::operator delete(ptr);
231}
232
233_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
234void
Eric Fiselier162922f2016-10-14 06:46:30 +0000235operator delete[] (void* ptr, std::align_val_t alignment) _NOEXCEPT
236{
237 ::operator delete(ptr, alignment);
238}
239
240_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
241void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000242operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000243{
244 ::operator delete[](ptr);
245}
246
Larisse Voufo574190d2015-02-15 05:18:55 +0000247_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
248void
Eric Fiselier162922f2016-10-14 06:46:30 +0000249operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) _NOEXCEPT
250{
251 ::operator delete[](ptr, alignment);
252}
253
254_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
255void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000256operator delete[] (void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000257{
258 ::operator delete[](ptr);
259}
260
Eric Fiselier162922f2016-10-14 06:46:30 +0000261_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
262void
263operator delete[] (void* ptr, size_t, std::align_val_t alignment) _NOEXCEPT
264{
265 ::operator delete[](ptr, alignment);
266}
267
Peter Collingbournedc009952013-10-06 22:13:16 +0000268#endif // !__GLIBCXX__
269
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270namespace std
271{
272
Peter Collingbournedc009952013-10-06 22:13:16 +0000273#ifndef __GLIBCXX__
Nick Kledzik09163cc2010-05-18 22:17:13 +0000274const nothrow_t nothrow = {};
Peter Collingbournedc009952013-10-06 22:13:16 +0000275#endif
Nick Kledzik09163cc2010-05-18 22:17:13 +0000276
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000277#ifndef _LIBCPPABI_VERSION
278
Peter Collingbournedc009952013-10-06 22:13:16 +0000279#ifndef __GLIBCXX__
280
Nick Kledzik09163cc2010-05-18 22:17:13 +0000281new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000282set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000283{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000284 return __sync_lock_test_and_set(&__new_handler, handler);
285}
286
287new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000288get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000289{
Joerg Sonnenbergerc7655a22014-01-04 17:43:00 +0000290 return __sync_fetch_and_add(&__new_handler, nullptr);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000291}
292
Peter Collingbournedc009952013-10-06 22:13:16 +0000293#endif // !__GLIBCXX__
294
David Chisnall3954f442012-02-29 12:59:17 +0000295#ifndef LIBCXXRT
296
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000297bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000298{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000299}
300
Peter Collingbournedc009952013-10-06 22:13:16 +0000301#ifndef __GLIBCXX__
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
Howard Hinnantffb308e2010-08-22 00:03:27 +0000307const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000308bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000309{
310 return "std::bad_alloc";
311}
312
Peter Collingbournedc009952013-10-06 22:13:16 +0000313#endif // !__GLIBCXX__
314
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000315bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000316{
317}
318
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000319bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320{
321}
322
Eric Fiselier11ec4412014-11-01 00:11:25 +0000323const char*
324bad_array_new_length::what() const _NOEXCEPT
325{
326 return "bad_array_new_length";
327}
328
Eric Fiselier7cca7da2014-10-29 23:14:53 +0000329#endif //LIBCXXRT
330
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331const char*
Marshall Clow3bf77132013-09-11 01:38:42 +0000332bad_array_length::what() const _NOEXCEPT
333{
334 return "bad_array_length";
335}
336
337bad_array_length::bad_array_length() _NOEXCEPT
338{
339}
340
341bad_array_length::~bad_array_length() _NOEXCEPT
342{
343}
344
Marshall Clow3bf77132013-09-11 01:38:42 +0000345#endif // _LIBCPPABI_VERSION
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000346
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000347#ifndef LIBSTDCXX
348
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349void
350__throw_bad_alloc()
351{
Howard Hinnant72f73582010-08-11 17:04:31 +0000352#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353 throw bad_alloc();
Marshall Clow8fea1612016-08-25 15:09:01 +0000354#else
355 _VSTD::abort();
Howard Hinnant72f73582010-08-11 17:04:31 +0000356#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000357}
358
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000359#endif // !LIBSTDCXX
360
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361} // std