blob: f751f171fd40c32f5bf443d4efa8d45e610ef7cd [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//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
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
15#if __APPLE__
Howard Hinnant155c2af2010-05-24 17:49:41 +000016 #include <cxxabi.h>
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000017 // On Darwin, there are two STL shared libraries and a lower level ABI
18 // shared libray. The global holding the current new handler is
19 // in the ABI library and named __cxa_new_handler.
20 #define __new_handler __cxxabiapple::__cxa_new_handler
21#else
22 static std::new_handler __new_handler;
23#endif
24
25
26// Implement all new and delete operators as weak definitions
27// in this shared library, so that they can be overriden by programs
28// that define non-weak copies of the functions.
29
30
31__attribute__((__weak__, __visibility__("default")))
32void *
33operator new(std::size_t size) throw (std::bad_alloc)
34{
35 if (size == 0)
36 size = 1;
37 void* p;
38 while ((p = ::malloc(size)) == 0)
39 {
40 // If malloc fails and there is a new_handler,
41 // call it to try free up memory.
42 if (__new_handler)
43 __new_handler();
44 else
Howard Hinnant72f73582010-08-11 17:04:31 +000045#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000046 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000047#else
48 break;
49#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000050 }
51 return p;
52}
53
54__attribute__((__weak__, __visibility__("default")))
55void*
56operator new(size_t size, const std::nothrow_t&) throw()
57{
58 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000059#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000060 try
61 {
Howard Hinnant72f73582010-08-11 17:04:31 +000062#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000063 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000064#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000065 }
66 catch (...)
67 {
68 }
Howard Hinnant72f73582010-08-11 17:04:31 +000069#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000070 return p;
71}
72
73__attribute__((__weak__, __visibility__("default")))
74void*
75operator new[](size_t size) throw (std::bad_alloc)
76{
77 return ::operator new(size);
78}
79
80__attribute__((__weak__, __visibility__("default")))
81void*
82operator new[](size_t size, const std::nothrow_t& nothrow) throw()
83{
84 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000085#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000086 try
87 {
Howard Hinnant72f73582010-08-11 17:04:31 +000088#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000089 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +000090#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000091 }
92 catch (...)
93 {
94 }
Howard Hinnant72f73582010-08-11 17:04:31 +000095#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000096 return p;
97}
98
99__attribute__((__weak__, __visibility__("default")))
100void
101operator delete(void* ptr) throw ()
102{
103 if (ptr)
104 ::free(ptr);
105}
106
107__attribute__((__weak__, __visibility__("default")))
108void
109operator delete(void* ptr, const std::nothrow_t&) throw ()
110{
111 ::operator delete(ptr);
112}
113
114
115__attribute__((__weak__, __visibility__("default")))
116void
117operator delete[] (void* ptr) throw ()
118{
119 ::operator delete (ptr);
120}
121
122__attribute__((__weak__, __visibility__("default")))
123void
124operator delete[] (void* ptr, const std::nothrow_t&) throw ()
125{
126 ::operator delete[](ptr);
127}
128
129
Howard Hinnantc51e1022010-05-11 19:42:16 +0000130namespace std
131{
132
Nick Kledzik09163cc2010-05-18 22:17:13 +0000133const nothrow_t nothrow = {};
134
135new_handler
136set_new_handler(new_handler handler) throw()
137{
138 new_handler r = __new_handler;
139 __new_handler = handler;
140 return r;
141}
142
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000143bad_alloc::bad_alloc() throw()
144{
145}
146
147bad_alloc::~bad_alloc() throw()
148{
149}
150
151const char*
152bad_alloc::what() const throw()
153{
154 return "std::bad_alloc";
155}
156
157
158bad_array_new_length::bad_array_new_length() throw()
159{
160}
161
Howard Hinnantc51e1022010-05-11 19:42:16 +0000162bad_array_new_length::~bad_array_new_length() throw()
163{
164}
165
166const char*
167bad_array_new_length::what() const throw()
168{
169 return "bad_array_new_length";
170}
171
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000172
173
Howard Hinnantc51e1022010-05-11 19:42:16 +0000174void
175__throw_bad_alloc()
176{
Howard Hinnant72f73582010-08-11 17:04:31 +0000177#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000178 throw bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +0000179#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000180}
181
182} // std