blob: 4a2af8bcab14c8262fdc98057e04285d1477e371 [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
Howard Hinnanta4cabeb2012-07-26 17:42:39 +000016#ifndef __has_include
17#define __has_include(inc) 0
18#endif
19
Marshall Clowdde4bfe2013-03-18 17:45:34 +000020#ifdef __APPLE__
Howard Hinnantffb308e2010-08-22 00:03:27 +000021 #include <cxxabi.h>
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000022
23 #ifndef _LIBCPPABI_VERSION
24 // On Darwin, there are two STL shared libraries and a lower level ABI
25 // shared libray. The global holding the current new handler is
26 // in the ABI library and named __cxa_new_handler.
27 #define __new_handler __cxxabiapple::__cxa_new_handler
28 #endif
Howard Hinnantffb308e2010-08-22 00:03:27 +000029#else // __APPLE__
Howard Hinnanta4cabeb2012-07-26 17:42:39 +000030 #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
31 #include <cxxabi.h>
32 #endif // __has_include(<cxxabi.h>)
33 #ifndef _LIBCPPABI_VERSION
34 static std::new_handler __new_handler;
35 #endif // _LIBCPPABI_VERSION
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000036#endif
37
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000038// Implement all new and delete operators as weak definitions
39// in this shared library, so that they can be overriden by programs
40// that define non-weak copies of the functions.
41
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000042__attribute__((__weak__, __visibility__("default")))
43void *
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000044operator new(std::size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000045#if !__has_feature(cxx_noexcept)
46 throw(std::bad_alloc)
47#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000048{
49 if (size == 0)
50 size = 1;
51 void* p;
52 while ((p = ::malloc(size)) == 0)
53 {
Howard Hinnant34468d42010-08-22 13:53:14 +000054 // If malloc fails and there is a new_handler,
55 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000056 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000057 if (nh)
58 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000059 else
Howard Hinnant72f73582010-08-11 17:04:31 +000060#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000061 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000062#else
63 break;
64#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000065 }
66 return p;
67}
68
69__attribute__((__weak__, __visibility__("default")))
70void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000071operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000072{
73 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000074#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000075 try
76 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000077#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000078 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000079#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000080 }
81 catch (...)
82 {
83 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000084#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000085 return p;
86}
87
88__attribute__((__weak__, __visibility__("default")))
89void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000090operator new[](size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000091#if !__has_feature(cxx_noexcept)
92 throw(std::bad_alloc)
93#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000094{
95 return ::operator new(size);
96}
97
98__attribute__((__weak__, __visibility__("default")))
99void*
Howard Hinnant28b24882011-12-01 20:21:04 +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
117__attribute__((__weak__, __visibility__("default")))
118void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000119operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000120{
121 if (ptr)
122 ::free(ptr);
123}
124
125__attribute__((__weak__, __visibility__("default")))
126void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000127operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000128{
129 ::operator delete(ptr);
130}
131
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000132__attribute__((__weak__, __visibility__("default")))
133void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000134operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000135{
136 ::operator delete (ptr);
137}
138
139__attribute__((__weak__, __visibility__("default")))
140void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000141operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000142{
143 ::operator delete[](ptr);
144}
145
Howard Hinnantc51e1022010-05-11 19:42:16 +0000146namespace std
147{
148
Nick Kledzik09163cc2010-05-18 22:17:13 +0000149const nothrow_t nothrow = {};
150
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000151#ifndef _LIBCPPABI_VERSION
152
Nick Kledzik09163cc2010-05-18 22:17:13 +0000153new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000154set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000155{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000156 return __sync_lock_test_and_set(&__new_handler, handler);
157}
158
159new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000160get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000161{
162 return __sync_fetch_and_add(&__new_handler, (new_handler)0);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000163}
164
David Chisnall3954f442012-02-29 12:59:17 +0000165#ifndef LIBCXXRT
166
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000167bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000168{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000169}
170
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000171bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000172{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000173}
174
Howard Hinnantffb308e2010-08-22 00:03:27 +0000175const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000176bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000177{
178 return "std::bad_alloc";
179}
180
David Chisnallba252b82012-03-14 14:11:13 +0000181#endif //LIBCXXRT
182
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000183bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000184{
185}
186
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000187bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000188{
189}
190
191const char*
Marshall Clow3bf77132013-09-11 01:38:42 +0000192bad_array_length::what() const _NOEXCEPT
193{
194 return "bad_array_length";
195}
196
197bad_array_length::bad_array_length() _NOEXCEPT
198{
199}
200
201bad_array_length::~bad_array_length() _NOEXCEPT
202{
203}
204
205const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000206bad_array_new_length::what() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000207{
208 return "bad_array_new_length";
209}
210
Marshall Clow3bf77132013-09-11 01:38:42 +0000211#endif // _LIBCPPABI_VERSION
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000212
Howard Hinnantc51e1022010-05-11 19:42:16 +0000213void
214__throw_bad_alloc()
215{
Howard Hinnant72f73582010-08-11 17:04:31 +0000216#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000217 throw bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +0000218#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219}
220
221} // std