blob: f2987b1f75b443a544c1bef459e7fd04e7463da1 [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>
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000016 // On Darwin, there are two STL shared libraries and a lower level ABI
Howard Hinnant34468d42010-08-22 13:53:14 +000017 // shared libray. The global holding the current new handler is
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000018 // in the ABI library and named __cxa_new_handler.
19 #define __new_handler __cxxabiapple::__cxa_new_handler
Howard Hinnantffb308e2010-08-22 00:03:27 +000020#else // __APPLE__
Howard Hinnant34468d42010-08-22 13:53:14 +000021 static std::new_handler __new_handler;
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000022#endif
23
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000024// Implement all new and delete operators as weak definitions
25// in this shared library, so that they can be overriden by programs
26// that define non-weak copies of the functions.
27
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000028__attribute__((__weak__, __visibility__("default")))
29void *
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000030operator new(std::size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000031#if !__has_feature(cxx_noexcept)
32 throw(std::bad_alloc)
33#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000034{
35 if (size == 0)
36 size = 1;
37 void* p;
38 while ((p = ::malloc(size)) == 0)
39 {
Howard Hinnant34468d42010-08-22 13:53:14 +000040 // If malloc fails and there is a new_handler,
41 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000042 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000043 if (nh)
44 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000045 else
Howard Hinnant72f73582010-08-11 17:04:31 +000046#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000047 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000048#else
49 break;
50#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000051 }
52 return p;
53}
54
55__attribute__((__weak__, __visibility__("default")))
56void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000057operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000058{
59 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000060#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000061 try
62 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000063#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000064 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000065#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000066 }
67 catch (...)
68 {
69 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000070#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000071 return p;
72}
73
74__attribute__((__weak__, __visibility__("default")))
75void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000076operator new[](size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000077#if !__has_feature(cxx_noexcept)
78 throw(std::bad_alloc)
79#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000080{
81 return ::operator new(size);
82}
83
84__attribute__((__weak__, __visibility__("default")))
85void*
Howard Hinnant28b24882011-12-01 20:21:04 +000086operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000087{
88 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000089#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000090 try
91 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000092#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000093 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +000094#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000095 }
96 catch (...)
97 {
98 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000099#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000100 return p;
101}
102
103__attribute__((__weak__, __visibility__("default")))
104void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000105operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000106{
107 if (ptr)
108 ::free(ptr);
109}
110
111__attribute__((__weak__, __visibility__("default")))
112void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000113operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000114{
115 ::operator delete(ptr);
116}
117
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000118__attribute__((__weak__, __visibility__("default")))
119void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000120operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000121{
122 ::operator delete (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
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132namespace std
133{
134
Nick Kledzik09163cc2010-05-18 22:17:13 +0000135const nothrow_t nothrow = {};
136
137new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000138set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000139{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000140 return __sync_lock_test_and_set(&__new_handler, handler);
141}
142
143new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000144get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000145{
146 return __sync_fetch_and_add(&__new_handler, (new_handler)0);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000147}
148
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000149bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000150{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000151}
152
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000153bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000154{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000155}
156
Howard Hinnantffb308e2010-08-22 00:03:27 +0000157const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000158bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000159{
160 return "std::bad_alloc";
161}
162
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000163bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000164{
165}
166
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000167bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168{
169}
170
171const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000172bad_array_new_length::what() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000173{
174 return "bad_array_new_length";
175}
176
Howard Hinnantc51e1022010-05-11 19:42:16 +0000177void
178__throw_bad_alloc()
179{
Howard Hinnant72f73582010-08-11 17:04:31 +0000180#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000181 throw bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +0000182#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000183}
184
185} // std