blob: d5db4611eaaa304bb7eb7a5bf63974de298659bf [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 *
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000042operator new(std::size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000043#if !__has_feature(cxx_noexcept)
44 throw(std::bad_alloc)
45#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000046{
47 if (size == 0)
48 size = 1;
49 void* p;
50 while ((p = ::malloc(size)) == 0)
51 {
Howard Hinnant34468d42010-08-22 13:53:14 +000052 // If malloc fails and there is a new_handler,
53 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000054 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000055 if (nh)
56 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000057 else
Howard Hinnant72f73582010-08-11 17:04:31 +000058#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000059 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000060#else
61 break;
62#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000063 }
64 return p;
65}
66
Howard Hinnantdaf51d72013-10-06 20:53:24 +000067_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000068void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000069operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000070{
71 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000072#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000073 try
74 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000075#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000076 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000077#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000078 }
79 catch (...)
80 {
81 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000082#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000083 return p;
84}
85
Howard Hinnantdaf51d72013-10-06 20:53:24 +000086_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000087void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000088operator new[](size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000089#if !__has_feature(cxx_noexcept)
90 throw(std::bad_alloc)
91#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000092{
93 return ::operator new(size);
94}
95
Howard Hinnantdaf51d72013-10-06 20:53:24 +000096_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000097void*
Howard Hinnant28b24882011-12-01 20:21:04 +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
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000115_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000116void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000117operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000118{
119 if (ptr)
120 ::free(ptr);
121}
122
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000123_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000124void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000125operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000126{
127 ::operator delete(ptr);
128}
129
Howard Hinnantdaf51d72013-10-06 20:53:24 +0000130_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000131void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000132operator delete(void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000133{
134 ::operator delete(ptr);
135}
136
137_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
138void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000139operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000140{
Larisse Voufo574190d2015-02-15 05:18:55 +0000141 ::operator delete(ptr);
142}
143
144_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
145void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000146operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000147{
148 ::operator delete[](ptr);
149}
150
Larisse Voufo574190d2015-02-15 05:18:55 +0000151_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
152void
Larisse Voufoa744a7e2015-02-20 06:13:05 +0000153operator delete[] (void* ptr, size_t) _NOEXCEPT
Larisse Voufo574190d2015-02-15 05:18:55 +0000154{
155 ::operator delete[](ptr);
156}
157
Peter Collingbournedc009952013-10-06 22:13:16 +0000158#endif // !__GLIBCXX__
159
Howard Hinnantc51e1022010-05-11 19:42:16 +0000160namespace std
161{
162
Peter Collingbournedc009952013-10-06 22:13:16 +0000163#ifndef __GLIBCXX__
Nick Kledzik09163cc2010-05-18 22:17:13 +0000164const nothrow_t nothrow = {};
Peter Collingbournedc009952013-10-06 22:13:16 +0000165#endif
Nick Kledzik09163cc2010-05-18 22:17:13 +0000166
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000167#ifndef _LIBCPPABI_VERSION
168
Peter Collingbournedc009952013-10-06 22:13:16 +0000169#ifndef __GLIBCXX__
170
Nick Kledzik09163cc2010-05-18 22:17:13 +0000171new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000172set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000173{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000174 return __sync_lock_test_and_set(&__new_handler, handler);
175}
176
177new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000178get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000179{
Joerg Sonnenbergerc7655a22014-01-04 17:43:00 +0000180 return __sync_fetch_and_add(&__new_handler, nullptr);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000181}
182
Peter Collingbournedc009952013-10-06 22:13:16 +0000183#endif // !__GLIBCXX__
184
David Chisnall3954f442012-02-29 12:59:17 +0000185#ifndef LIBCXXRT
186
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000187bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000188{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000189}
190
Peter Collingbournedc009952013-10-06 22:13:16 +0000191#ifndef __GLIBCXX__
192
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000193bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000194{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000195}
196
Howard Hinnantffb308e2010-08-22 00:03:27 +0000197const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000198bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000199{
200 return "std::bad_alloc";
201}
202
Peter Collingbournedc009952013-10-06 22:13:16 +0000203#endif // !__GLIBCXX__
204
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000205bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000206{
207}
208
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000209bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000210{
211}
212
Eric Fiselier11ec4412014-11-01 00:11:25 +0000213const char*
214bad_array_new_length::what() const _NOEXCEPT
215{
216 return "bad_array_new_length";
217}
218
Eric Fiselier7cca7da2014-10-29 23:14:53 +0000219#endif //LIBCXXRT
220
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221const char*
Marshall Clow3bf77132013-09-11 01:38:42 +0000222bad_array_length::what() const _NOEXCEPT
223{
224 return "bad_array_length";
225}
226
227bad_array_length::bad_array_length() _NOEXCEPT
228{
229}
230
231bad_array_length::~bad_array_length() _NOEXCEPT
232{
233}
234
Marshall Clow3bf77132013-09-11 01:38:42 +0000235#endif // _LIBCPPABI_VERSION
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000236
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000237#ifndef LIBSTDCXX
238
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239void
240__throw_bad_alloc()
241{
Howard Hinnant72f73582010-08-11 17:04:31 +0000242#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243 throw bad_alloc();
Marshall Clow8fea1612016-08-25 15:09:01 +0000244#else
245 _VSTD::abort();
Howard Hinnant72f73582010-08-11 17:04:31 +0000246#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247}
248
Peter Collingbourne22dc63b2013-10-06 22:13:19 +0000249#endif // !LIBSTDCXX
250
Howard Hinnantc51e1022010-05-11 19:42:16 +0000251} // std