blob: 1c171a871b9bd972809a055daa70a0a5a66eb7fe [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
David Chisnall3954f442012-02-29 12:59:17 +000027#if !defined (LIBCXXRT) // && !defined(_LIBCPPABI_VERSION)
Howard Hinnant4ad4eee2012-02-02 20:48:35 +000028
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000029// Implement all new and delete operators as weak definitions
30// in this shared library, so that they can be overriden by programs
31// that define non-weak copies of the functions.
32
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000033__attribute__((__weak__, __visibility__("default")))
34void *
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000035operator new(std::size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000036#if !__has_feature(cxx_noexcept)
37 throw(std::bad_alloc)
38#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000039{
40 if (size == 0)
41 size = 1;
42 void* p;
43 while ((p = ::malloc(size)) == 0)
44 {
Howard Hinnant34468d42010-08-22 13:53:14 +000045 // If malloc fails and there is a new_handler,
46 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000047 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000048 if (nh)
49 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000050 else
Howard Hinnant72f73582010-08-11 17:04:31 +000051#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000052 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000053#else
54 break;
55#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000056 }
57 return p;
58}
59
60__attribute__((__weak__, __visibility__("default")))
61void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000062operator new(size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000063{
64 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000065#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000066 try
67 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000068#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000069 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000070#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000071 }
72 catch (...)
73 {
74 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000075#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000076 return p;
77}
78
79__attribute__((__weak__, __visibility__("default")))
80void*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +000081operator new[](size_t size)
Howard Hinnantfac2ab72011-07-14 01:34:46 +000082#if !__has_feature(cxx_noexcept)
83 throw(std::bad_alloc)
84#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000085{
86 return ::operator new(size);
87}
88
89__attribute__((__weak__, __visibility__("default")))
90void*
Howard Hinnant28b24882011-12-01 20:21:04 +000091operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000092{
93 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000094#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000095 try
96 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000097#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000098 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +000099#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000100 }
101 catch (...)
102 {
103 }
Howard Hinnantffb308e2010-08-22 00:03:27 +0000104#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000105 return p;
106}
107
108__attribute__((__weak__, __visibility__("default")))
109void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000110operator delete(void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000111{
112 if (ptr)
113 ::free(ptr);
114}
115
116__attribute__((__weak__, __visibility__("default")))
117void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000118operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000119{
120 ::operator delete(ptr);
121}
122
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000123__attribute__((__weak__, __visibility__("default")))
124void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000125operator delete[] (void* ptr) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000126{
127 ::operator delete (ptr);
128}
129
130__attribute__((__weak__, __visibility__("default")))
131void
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000132operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000133{
134 ::operator delete[](ptr);
135}
136
David Chisnall3954f442012-02-29 12:59:17 +0000137#endif // !_LIBCPPABI_VERSION && !LIBCXXRT
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000138
Howard Hinnantc51e1022010-05-11 19:42:16 +0000139namespace std
140{
141
Nick Kledzik09163cc2010-05-18 22:17:13 +0000142const nothrow_t nothrow = {};
143
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000144#ifndef _LIBCPPABI_VERSION
145
Nick Kledzik09163cc2010-05-18 22:17:13 +0000146new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000147set_new_handler(new_handler handler) _NOEXCEPT
Nick Kledzik09163cc2010-05-18 22:17:13 +0000148{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000149 return __sync_lock_test_and_set(&__new_handler, handler);
150}
151
152new_handler
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000153get_new_handler() _NOEXCEPT
Howard Hinnante65e8e32010-12-02 16:45:21 +0000154{
155 return __sync_fetch_and_add(&__new_handler, (new_handler)0);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000156}
157
David Chisnall3954f442012-02-29 12:59:17 +0000158#ifndef LIBCXXRT
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 Hinnant1bc52cf2011-05-26 18:23:59 +0000164bad_alloc::~bad_alloc() _NOEXCEPT
Howard Hinnantffb308e2010-08-22 00:03:27 +0000165{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000166}
167
Howard Hinnantffb308e2010-08-22 00:03:27 +0000168const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000169bad_alloc::what() const _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000170{
171 return "std::bad_alloc";
172}
173
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000174bad_array_new_length::bad_array_new_length() _NOEXCEPT
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000175{
176}
177
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000178bad_array_new_length::~bad_array_new_length() _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000179{
180}
181
182const char*
Howard Hinnant1bc52cf2011-05-26 18:23:59 +0000183bad_array_new_length::what() const _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000184{
185 return "bad_array_new_length";
186}
187
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000188#endif
David Chisnall3954f442012-02-29 12:59:17 +0000189#endif //LIBCXXRT
Howard Hinnant4ad4eee2012-02-02 20:48:35 +0000190
Howard Hinnantc51e1022010-05-11 19:42:16 +0000191void
192__throw_bad_alloc()
193{
Howard Hinnant72f73582010-08-11 17:04:31 +0000194#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000195 throw bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +0000196#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197}
198
199} // std