blob: b23a516ff37f9ab8567f81b4a9c32a1540bfbeca [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===--------------------------- new.cpp ----------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
Howard Hinnantb64f8b02010-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 Hinnantbc8d3f92010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
Howard Hinnantadff4892010-05-24 17:49:41 +000010#include <stdlib.h>
Nick Kledzik804b6e72010-05-14 20:19:37 +000011
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000012#include "new"
13
Howard Hinnant8b5bb3c2012-07-26 17:42:39 +000014#ifndef __has_include
15#define __has_include(inc) 0
16#endif
17
Marshall Clowdece7fe2013-03-18 17:45:34 +000018#ifdef __APPLE__
Howard Hinnant16e6e1d2010-08-22 00:03:27 +000019 #include <cxxabi.h>
Howard Hinnantdea7f392012-02-02 20:48:35 +000020
21 #ifndef _LIBCPPABI_VERSION
22 // On Darwin, there are two STL shared libraries and a lower level ABI
23 // shared libray. The global holding the current new handler is
24 // in the ABI library and named __cxa_new_handler.
25 #define __new_handler __cxxabiapple::__cxa_new_handler
26 #endif
Howard Hinnant16e6e1d2010-08-22 00:03:27 +000027#else // __APPLE__
Howard Hinnant8b5bb3c2012-07-26 17:42:39 +000028 #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
29 #include <cxxabi.h>
30 #endif // __has_include(<cxxabi.h>)
31 #ifndef _LIBCPPABI_VERSION
32 static std::new_handler __new_handler;
33 #endif // _LIBCPPABI_VERSION
Nick Kledzik804b6e72010-05-14 20:19:37 +000034#endif
35
Nick Kledzik804b6e72010-05-14 20:19:37 +000036// Implement all new and delete operators as weak definitions
37// in this shared library, so that they can be overriden by programs
38// that define non-weak copies of the functions.
39
Nick Kledzik804b6e72010-05-14 20:19:37 +000040__attribute__((__weak__, __visibility__("default")))
41void *
Howard Hinnanted569212011-05-26 18:23:59 +000042operator new(std::size_t size)
Howard Hinnant912012e2011-07-14 01:34:46 +000043#if !__has_feature(cxx_noexcept)
44 throw(std::bad_alloc)
45#endif
Nick Kledzik804b6e72010-05-14 20:19:37 +000046{
47 if (size == 0)
48 size = 1;
49 void* p;
50 while ((p = ::malloc(size)) == 0)
51 {
Howard Hinnantd5109772010-08-22 13:53:14 +000052 // If malloc fails and there is a new_handler,
53 // call it to try free up memory.
Howard Hinnantd42c4be2010-12-04 19:56:43 +000054 std::new_handler nh = std::get_new_handler();
Howard Hinnant1f970ad2010-12-04 19:54:11 +000055 if (nh)
56 nh();
Nick Kledzik804b6e72010-05-14 20:19:37 +000057 else
Howard Hinnantd4444702010-08-11 17:04:31 +000058#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +000059 throw std::bad_alloc();
Howard Hinnantd4444702010-08-11 17:04:31 +000060#else
61 break;
62#endif
Nick Kledzik804b6e72010-05-14 20:19:37 +000063 }
64 return p;
65}
66
67__attribute__((__weak__, __visibility__("default")))
68void*
Howard Hinnanted569212011-05-26 18:23:59 +000069operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +000070{
71 void* p = 0;
Howard Hinnantd4444702010-08-11 17:04:31 +000072#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +000073 try
74 {
Howard Hinnant16e6e1d2010-08-22 00:03:27 +000075#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +000076 p = ::operator new(size);
Howard Hinnantd4444702010-08-11 17:04:31 +000077#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +000078 }
79 catch (...)
80 {
81 }
Howard Hinnant16e6e1d2010-08-22 00:03:27 +000082#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +000083 return p;
84}
85
86__attribute__((__weak__, __visibility__("default")))
87void*
Howard Hinnanted569212011-05-26 18:23:59 +000088operator new[](size_t size)
Howard Hinnant912012e2011-07-14 01:34:46 +000089#if !__has_feature(cxx_noexcept)
90 throw(std::bad_alloc)
91#endif
Nick Kledzik804b6e72010-05-14 20:19:37 +000092{
93 return ::operator new(size);
94}
95
96__attribute__((__weak__, __visibility__("default")))
97void*
Howard Hinnantec3773c2011-12-01 20:21:04 +000098operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +000099{
100 void* p = 0;
Howard Hinnantd4444702010-08-11 17:04:31 +0000101#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +0000102 try
103 {
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000104#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +0000105 p = ::operator new[](size);
Howard Hinnantd4444702010-08-11 17:04:31 +0000106#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +0000107 }
108 catch (...)
109 {
110 }
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000111#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzik804b6e72010-05-14 20:19:37 +0000112 return p;
113}
114
115__attribute__((__weak__, __visibility__("default")))
116void
Howard Hinnanted569212011-05-26 18:23:59 +0000117operator delete(void* ptr) _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +0000118{
119 if (ptr)
120 ::free(ptr);
121}
122
123__attribute__((__weak__, __visibility__("default")))
124void
Howard Hinnanted569212011-05-26 18:23:59 +0000125operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +0000126{
127 ::operator delete(ptr);
128}
129
Nick Kledzik804b6e72010-05-14 20:19:37 +0000130__attribute__((__weak__, __visibility__("default")))
131void
Howard Hinnanted569212011-05-26 18:23:59 +0000132operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +0000133{
134 ::operator delete (ptr);
135}
136
137__attribute__((__weak__, __visibility__("default")))
138void
Howard Hinnanted569212011-05-26 18:23:59 +0000139operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +0000140{
141 ::operator delete[](ptr);
142}
143
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000144namespace std
145{
146
Nick Kledzik76fdaa72010-05-18 22:17:13 +0000147const nothrow_t nothrow = {};
148
Howard Hinnantdea7f392012-02-02 20:48:35 +0000149#ifndef _LIBCPPABI_VERSION
150
Nick Kledzik76fdaa72010-05-18 22:17:13 +0000151new_handler
Howard Hinnanted569212011-05-26 18:23:59 +0000152set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik76fdaa72010-05-18 22:17:13 +0000153{
Howard Hinnanta4451512010-12-02 16:45:21 +0000154 return __sync_lock_test_and_set(&__new_handler, handler);
155}
156
157new_handler
Howard Hinnanted569212011-05-26 18:23:59 +0000158get_new_handler() _NOEXCEPT
Howard Hinnanta4451512010-12-02 16:45:21 +0000159{
160 return __sync_fetch_and_add(&__new_handler, (new_handler)0);
Nick Kledzik76fdaa72010-05-18 22:17:13 +0000161}
162
David Chisnall1e8b3f92012-02-29 12:59:17 +0000163#ifndef LIBCXXRT
164
Howard Hinnanted569212011-05-26 18:23:59 +0000165bad_alloc::bad_alloc() _NOEXCEPT
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000166{
Nick Kledzik804b6e72010-05-14 20:19:37 +0000167}
168
Howard Hinnanted569212011-05-26 18:23:59 +0000169bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000170{
Nick Kledzik804b6e72010-05-14 20:19:37 +0000171}
172
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000173const char*
Howard Hinnanted569212011-05-26 18:23:59 +0000174bad_alloc::what() const _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +0000175{
176 return "std::bad_alloc";
177}
178
David Chisnall21a84cf2012-03-14 14:11:13 +0000179#endif //LIBCXXRT
180
Howard Hinnanted569212011-05-26 18:23:59 +0000181bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzik804b6e72010-05-14 20:19:37 +0000182{
183}
184
Howard Hinnanted569212011-05-26 18:23:59 +0000185bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000186{
187}
188
189const char*
Howard Hinnanted569212011-05-26 18:23:59 +0000190bad_array_new_length::what() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000191{
192 return "bad_array_new_length";
193}
194
Howard Hinnantdea7f392012-02-02 20:48:35 +0000195#endif
196
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000197void
198__throw_bad_alloc()
199{
Howard Hinnantd4444702010-08-11 17:04:31 +0000200#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000201 throw bad_alloc();
Howard Hinnantd4444702010-08-11 17:04:31 +0000202#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000203}
204
205} // std