blob: 1fb4b2da40d7d58552d7f5070a879a7bee8fa7af [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
Howard Hinnant155c2af2010-05-24 17:49:41 +000010#include <stdlib.h>
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000011
Howard Hinnantc51e1022010-05-11 19:42:16 +000012#include "new"
13
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000014#if __APPLE__
Howard Hinnantffb308e2010-08-22 00:03:27 +000015 #include <cxxabi.h>
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000016
17 #ifndef _LIBCPPABI_VERSION
18 // On Darwin, there are two STL shared libraries and a lower level ABI
19 // shared libray. The global holding the current new handler is
20 // in the ABI library and named __cxa_new_handler.
21 #define __new_handler __cxxabiapple::__cxa_new_handler
22 #endif
Howard Hinnantffb308e2010-08-22 00:03:27 +000023#else // __APPLE__
Howard Hinnant34468d42010-08-22 13:53:14 +000024 static std::new_handler __new_handler;
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000025#endif
26
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000027// Implement all new and delete operators as weak definitions
28// in this shared library, so that they can be overriden by programs
29// that define non-weak copies of the functions.
30
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000031__attribute__((__weak__, __visibility__("default")))
32void *
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000033operator new(std::size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000034#if !__has_feature(cxx_noexcept)
35 throw(std::bad_alloc)
36#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000037{
38 if (size == 0)
39 size = 1;
40 void* p;
41 while ((p = ::malloc(size)) == 0)
42 {
Howard Hinnant34468d42010-08-22 13:53:14 +000043 // If malloc fails and there is a new_handler,
44 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000045 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000046 if (nh)
47 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000048 else
Howard Hinnant72f73582010-08-11 17:04:31 +000049#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000050 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000051#else
52 break;
53#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000054 }
55 return p;
56}
57
58__attribute__((__weak__, __visibility__("default")))
59void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000060operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000061{
62 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000063#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000064 try
65 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000066#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000067 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000068#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000069 }
70 catch (...)
71 {
72 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000073#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000074 return p;
75}
76
77__attribute__((__weak__, __visibility__("default")))
78void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000079operator new[](size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000080#if !__has_feature(cxx_noexcept)
81 throw(std::bad_alloc)
82#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000083{
84 return ::operator new(size);
85}
86
87__attribute__((__weak__, __visibility__("default")))
88void*
Howard Hinnant28b24882011-12-01 20:21:04 +000089operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000090{
91 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000092#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000093 try
94 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000095#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000096 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +000097#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000098 }
99 catch (...)
100 {
101 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000102#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000103 return p;
104}
105
106__attribute__((__weak__, __visibility__("default")))
107void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000108operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000109{
110 if (ptr)
111 ::free(ptr);
112}
113
114__attribute__((__weak__, __visibility__("default")))
115void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000116operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000117{
118 ::operator delete(ptr);
119}
120
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000121__attribute__((__weak__, __visibility__("default")))
122void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000123operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000124{
125 ::operator delete (ptr);
126}
127
128__attribute__((__weak__, __visibility__("default")))
129void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000130operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000131{
132 ::operator delete[](ptr);
133}
134
Howard Hinnantc51e1022010-05-11 19:42:16 +0000135namespace std
136{
137
Nick Kledzik09163cc2010-05-18 22:17:13 +0000138const nothrow_t nothrow = {};
139
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000140#ifndef _LIBCPPABI_VERSION
141
Nick Kledzik09163cc2010-05-18 22:17:13 +0000142new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000143set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000144{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000145 return __sync_lock_test_and_set(&__new_handler, handler);
146}
147
148new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000149get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000150{
151 return __sync_fetch_and_add(&__new_handler, (new_handler)0);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000152}
153
David Chisnall3954f442012-02-29 12:59:17 +0000154#ifndef LIBCXXRT
155
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000156bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000157{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000158}
159
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000160bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000161{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000162}
163
Howard Hinnantffb308e2010-08-22 00:03:27 +0000164const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000165bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000166{
167 return "std::bad_alloc";
168}
169
David Chisnallba252b82012-03-14 14:11:13 +0000170#endif //LIBCXXRT
171
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000172bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000173{
174}
175
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000176bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000177{
178}
179
180const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000181bad_array_new_length::what() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000182{
183 return "bad_array_new_length";
184}
185
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000186#endif
187
Howard Hinnantc51e1022010-05-11 19:42:16 +0000188void
189__throw_bad_alloc()
190{
Howard Hinnant72f73582010-08-11 17:04:31 +0000191#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000192 throw bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +0000193#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000194}
195
196} // std