new.cpp revision 321222
1219820Sjeff//===--------------------------- new.cpp ----------------------------------===//
2219820Sjeff//
3219820Sjeff//                     The LLVM Compiler Infrastructure
4219820Sjeff//
5219820Sjeff// This file is dual licensed under the MIT and the University of Illinois Open
6219820Sjeff// Source Licenses. See LICENSE.TXT for details.
7219820Sjeff//
8219820Sjeff//===----------------------------------------------------------------------===//
9219820Sjeff
10219820Sjeff#define _LIBCPP_BUILDING_NEW
11219820Sjeff
12219820Sjeff#include <stdlib.h>
13219820Sjeff
14219820Sjeff#include "new"
15219820Sjeff
16219820Sjeff#ifndef __has_include
17219820Sjeff#define __has_include(inc) 0
18219820Sjeff#endif
19219820Sjeff
20219820Sjeff#if defined(__APPLE__) && !defined(LIBCXXRT)
21219820Sjeff    #include <cxxabi.h>
22219820Sjeff
23219820Sjeff    #ifndef _LIBCPPABI_VERSION
24219820Sjeff        // On Darwin, there are two STL shared libraries and a lower level ABI
25219820Sjeff        // shared library.  The global holding the current new handler is
26219820Sjeff        // in the ABI library and named __cxa_new_handler.
27219820Sjeff        #define __new_handler __cxxabiapple::__cxa_new_handler
28219820Sjeff    #endif
29219820Sjeff#else  // __APPLE__
30219820Sjeff    #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
31219820Sjeff        #include <cxxabi.h>
32219820Sjeff    #endif  // __has_include(<cxxabi.h>)
33219820Sjeff    #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
34219820Sjeff        static std::new_handler __new_handler;
35219820Sjeff    #endif  // _LIBCPPABI_VERSION
36219820Sjeff#endif
37219820Sjeff
38219820Sjeff#ifndef __GLIBCXX__
39219820Sjeff
40219820Sjeff// Implement all new and delete operators as weak definitions
41219820Sjeff// in this shared library, so that they can be overriden by programs
42219820Sjeff// that define non-weak copies of the functions.
43219820Sjeff
44219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
45219820Sjeffvoid *
46219820Sjeffoperator new(std::size_t size)
47219820Sjeff#if !__has_feature(cxx_noexcept)
48219820Sjeff    throw(std::bad_alloc)
49219820Sjeff#endif
50219820Sjeff{
51219820Sjeff    if (size == 0)
52219820Sjeff        size = 1;
53219820Sjeff    void* p;
54219820Sjeff    while ((p = ::malloc(size)) == 0)
55219820Sjeff    {
56219820Sjeff        // If malloc fails and there is a new_handler,
57219820Sjeff        // call it to try free up memory.
58219820Sjeff        std::new_handler nh = std::get_new_handler();
59219820Sjeff        if (nh)
60219820Sjeff            nh();
61219820Sjeff        else
62219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS
63219820Sjeff            throw std::bad_alloc();
64219820Sjeff#else
65219820Sjeff            break;
66219820Sjeff#endif
67219820Sjeff    }
68219820Sjeff    return p;
69219820Sjeff}
70219820Sjeff
71219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
72219820Sjeffvoid*
73219820Sjeffoperator new(size_t size, const std::nothrow_t&) _NOEXCEPT
74219820Sjeff{
75219820Sjeff    void* p = 0;
76219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS
77219820Sjeff    try
78219820Sjeff    {
79219820Sjeff#endif  // _LIBCPP_NO_EXCEPTIONS
80219820Sjeff        p = ::operator new(size);
81219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS
82219820Sjeff    }
83219820Sjeff    catch (...)
84219820Sjeff    {
85219820Sjeff    }
86219820Sjeff#endif  // _LIBCPP_NO_EXCEPTIONS
87219820Sjeff    return p;
88219820Sjeff}
89219820Sjeff
90219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
91219820Sjeffvoid*
92219820Sjeffoperator new[](size_t size)
93219820Sjeff#if !__has_feature(cxx_noexcept)
94219820Sjeff    throw(std::bad_alloc)
95219820Sjeff#endif
96219820Sjeff{
97219820Sjeff    return ::operator new(size);
98219820Sjeff}
99219820Sjeff
100219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
101219820Sjeffvoid*
102219820Sjeffoperator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
103219820Sjeff{
104219820Sjeff    void* p = 0;
105219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS
106219820Sjeff    try
107219820Sjeff    {
108219820Sjeff#endif  // _LIBCPP_NO_EXCEPTIONS
109219820Sjeff        p = ::operator new[](size);
110219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS
111219820Sjeff    }
112219820Sjeff    catch (...)
113219820Sjeff    {
114219820Sjeff    }
115219820Sjeff#endif  // _LIBCPP_NO_EXCEPTIONS
116219820Sjeff    return p;
117219820Sjeff}
118219820Sjeff
119219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
120219820Sjeffvoid
121219820Sjeffoperator delete(void* ptr) _NOEXCEPT
122219820Sjeff{
123219820Sjeff    if (ptr)
124219820Sjeff        ::free(ptr);
125219820Sjeff}
126219820Sjeff
127219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
128219820Sjeffvoid
129219820Sjeffoperator delete(void* ptr, size_t) _NOEXCEPT
130219820Sjeff{
131219820Sjeff    ::operator delete(ptr);
132219820Sjeff}
133219820Sjeff
134219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
135219820Sjeffvoid
136219820Sjeffoperator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
137219820Sjeff{
138219820Sjeff    ::operator delete(ptr);
139219820Sjeff}
140219820Sjeff
141219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
142219820Sjeffvoid
143219820Sjeffoperator delete(void* ptr, size_t, const std::nothrow_t&) _NOEXCEPT
144219820Sjeff{
145219820Sjeff    ::operator delete(ptr);
146219820Sjeff}
147219820Sjeff
148219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
149219820Sjeffvoid
150219820Sjeffoperator delete[] (void* ptr) _NOEXCEPT
151219820Sjeff{
152219820Sjeff    ::operator delete(ptr);
153219820Sjeff}
154219820Sjeff
155219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
156219820Sjeffvoid
157219820Sjeffoperator delete[] (void* ptr, size_t) _NOEXCEPT
158219820Sjeff{
159219820Sjeff    ::operator delete[](ptr);
160219820Sjeff}
161219820Sjeff
162219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
163219820Sjeffvoid
164219820Sjeffoperator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
165219820Sjeff{
166219820Sjeff    ::operator delete[](ptr);
167219820Sjeff}
168219820Sjeff
169219820Sjeff_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS
170219820Sjeffvoid
171219820Sjeffoperator delete[] (void* ptr, size_t, const std::nothrow_t&) _NOEXCEPT
172219820Sjeff{
173219820Sjeff    ::operator delete[](ptr);
174219820Sjeff}
175219820Sjeff
176219820Sjeff#endif // !__GLIBCXX__
177219820Sjeff
178219820Sjeffnamespace std
179219820Sjeff{
180219820Sjeff
181219820Sjeff#ifndef __GLIBCXX__
182219820Sjeffconst nothrow_t nothrow = {};
183219820Sjeff#endif
184219820Sjeff
185219820Sjeff#ifndef _LIBCPPABI_VERSION
186219820Sjeff
187219820Sjeff#ifndef __GLIBCXX__
188219820Sjeff
189219820Sjeffnew_handler
190219820Sjeffset_new_handler(new_handler handler) _NOEXCEPT
191219820Sjeff{
192219820Sjeff    return __sync_lock_test_and_set(&__new_handler, handler);
193219820Sjeff}
194219820Sjeff
195219820Sjeffnew_handler
196219820Sjeffget_new_handler() _NOEXCEPT
197219820Sjeff{
198219820Sjeff    return __sync_fetch_and_add(&__new_handler, nullptr);
199219820Sjeff}
200219820Sjeff
201219820Sjeff#endif // !__GLIBCXX__
202219820Sjeff
203219820Sjeff#ifndef LIBCXXRT
204219820Sjeff
205219820Sjeffbad_alloc::bad_alloc() _NOEXCEPT
206219820Sjeff{
207219820Sjeff}
208219820Sjeff
209219820Sjeff#ifndef __GLIBCXX__
210219820Sjeff
211219820Sjeffbad_alloc::~bad_alloc() _NOEXCEPT
212219820Sjeff{
213219820Sjeff}
214219820Sjeff
215219820Sjeffconst char*
216219820Sjeffbad_alloc::what() const _NOEXCEPT
217219820Sjeff{
218219820Sjeff    return "std::bad_alloc";
219219820Sjeff}
220219820Sjeff
221219820Sjeff#endif // !__GLIBCXX__
222219820Sjeff
223219820Sjeffbad_array_new_length::bad_array_new_length() _NOEXCEPT
224219820Sjeff{
225219820Sjeff}
226219820Sjeff
227219820Sjeffbad_array_new_length::~bad_array_new_length() _NOEXCEPT
228219820Sjeff{
229219820Sjeff}
230219820Sjeff
231219820Sjeffconst char*
232219820Sjeffbad_array_new_length::what() const _NOEXCEPT
233219820Sjeff{
234219820Sjeff    return "bad_array_new_length";
235219820Sjeff}
236219820Sjeff
237219820Sjeff#endif //LIBCXXRT
238219820Sjeff
239219820Sjeffconst char*
240219820Sjeffbad_array_length::what() const _NOEXCEPT
241219820Sjeff{
242219820Sjeff    return "bad_array_length";
243219820Sjeff}
244219820Sjeff
245219820Sjeffbad_array_length::bad_array_length() _NOEXCEPT
246219820Sjeff{
247219820Sjeff}
248219820Sjeff
249219820Sjeffbad_array_length::~bad_array_length() _NOEXCEPT
250219820Sjeff{
251219820Sjeff}
252219820Sjeff
253219820Sjeff#endif // _LIBCPPABI_VERSION
254219820Sjeff
255219820Sjeff#ifndef LIBSTDCXX
256219820Sjeff
257219820Sjeffvoid
258219820Sjeff__throw_bad_alloc()
259219820Sjeff{
260219820Sjeff#ifndef _LIBCPP_NO_EXCEPTIONS
261219820Sjeff    throw bad_alloc();
262219820Sjeff#endif
263219820Sjeff}
264219820Sjeff
265219820Sjeff#endif // !LIBSTDCXX
266219820Sjeff
267219820Sjeff}  // std
268219820Sjeff