1227825Stheraven//===--------------------------- new.cpp ----------------------------------===//
2227825Stheraven//
3227825Stheraven//                     The LLVM Compiler Infrastructure
4227825Stheraven//
5227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open
6227825Stheraven// Source Licenses. See LICENSE.TXT for details.
7227825Stheraven//
8227825Stheraven//===----------------------------------------------------------------------===//
9227825Stheraven
10227825Stheraven#include <stdlib.h>
11227825Stheraven
12227825Stheraven#include "new"
13227825Stheraven
14241903Sdim#ifndef __has_include
15241903Sdim#define __has_include(inc) 0
16241903Sdim#endif
17241903Sdim
18249998Sdim#ifdef __APPLE__
19227825Stheraven    #include <cxxabi.h>
20232950Stheraven
21232950Stheraven    #ifndef _LIBCPPABI_VERSION
22232950Stheraven        // On Darwin, there are two STL shared libraries and a lower level ABI
23232950Stheraven        // shared libray.  The global holding the current new handler is
24232950Stheraven        // in the ABI library and named __cxa_new_handler.
25232950Stheraven        #define __new_handler __cxxabiapple::__cxa_new_handler
26232950Stheraven    #endif
27227825Stheraven#else  // __APPLE__
28241903Sdim    #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
29241903Sdim        #include <cxxabi.h>
30241903Sdim    #endif  // __has_include(<cxxabi.h>)
31241903Sdim    #ifndef _LIBCPPABI_VERSION
32241903Sdim        static std::new_handler __new_handler;
33241903Sdim    #endif  // _LIBCPPABI_VERSION
34227825Stheraven#endif
35227825Stheraven
36227825Stheraven// Implement all new and delete operators as weak definitions
37227825Stheraven// in this shared library, so that they can be overriden by programs
38227825Stheraven// that define non-weak copies of the functions.
39227825Stheraven
40227825Stheraven__attribute__((__weak__, __visibility__("default")))
41227825Stheravenvoid *
42227825Stheravenoperator new(std::size_t size)
43227825Stheraven#if !__has_feature(cxx_noexcept)
44227825Stheraven    throw(std::bad_alloc)
45227825Stheraven#endif
46227825Stheraven{
47227825Stheraven    if (size == 0)
48227825Stheraven        size = 1;
49227825Stheraven    void* p;
50227825Stheraven    while ((p = ::malloc(size)) == 0)
51227825Stheraven    {
52227825Stheraven        // If malloc fails and there is a new_handler,
53227825Stheraven        // call it to try free up memory.
54227825Stheraven        std::new_handler nh = std::get_new_handler();
55227825Stheraven        if (nh)
56227825Stheraven            nh();
57227825Stheraven        else
58227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
59227825Stheraven            throw std::bad_alloc();
60227825Stheraven#else
61227825Stheraven            break;
62227825Stheraven#endif
63227825Stheraven    }
64227825Stheraven    return p;
65227825Stheraven}
66227825Stheraven
67227825Stheraven__attribute__((__weak__, __visibility__("default")))
68227825Stheravenvoid*
69227825Stheravenoperator new(size_t size, const std::nothrow_t&) _NOEXCEPT
70227825Stheraven{
71227825Stheraven    void* p = 0;
72227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
73227825Stheraven    try
74227825Stheraven    {
75227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
76227825Stheraven        p = ::operator new(size);
77227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
78227825Stheraven    }
79227825Stheraven    catch (...)
80227825Stheraven    {
81227825Stheraven    }
82227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
83227825Stheraven    return p;
84227825Stheraven}
85227825Stheraven
86227825Stheraven__attribute__((__weak__, __visibility__("default")))
87227825Stheravenvoid*
88227825Stheravenoperator new[](size_t size)
89227825Stheraven#if !__has_feature(cxx_noexcept)
90227825Stheraven    throw(std::bad_alloc)
91227825Stheraven#endif
92227825Stheraven{
93227825Stheraven    return ::operator new(size);
94227825Stheraven}
95227825Stheraven
96227825Stheraven__attribute__((__weak__, __visibility__("default")))
97227825Stheravenvoid*
98232950Stheravenoperator new[](size_t size, const std::nothrow_t&) _NOEXCEPT
99227825Stheraven{
100227825Stheraven    void* p = 0;
101227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
102227825Stheraven    try
103227825Stheraven    {
104227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
105227825Stheraven        p = ::operator new[](size);
106227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
107227825Stheraven    }
108227825Stheraven    catch (...)
109227825Stheraven    {
110227825Stheraven    }
111227825Stheraven#endif  // _LIBCPP_NO_EXCEPTIONS
112227825Stheraven    return p;
113227825Stheraven}
114227825Stheraven
115227825Stheraven__attribute__((__weak__, __visibility__("default")))
116227825Stheravenvoid
117227825Stheravenoperator delete(void* ptr) _NOEXCEPT
118227825Stheraven{
119227825Stheraven    if (ptr)
120227825Stheraven        ::free(ptr);
121227825Stheraven}
122227825Stheraven
123227825Stheraven__attribute__((__weak__, __visibility__("default")))
124227825Stheravenvoid
125227825Stheravenoperator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT
126227825Stheraven{
127227825Stheraven    ::operator delete(ptr);
128227825Stheraven}
129227825Stheraven
130227825Stheraven__attribute__((__weak__, __visibility__("default")))
131227825Stheravenvoid
132227825Stheravenoperator delete[] (void* ptr) _NOEXCEPT
133227825Stheraven{
134227825Stheraven    ::operator delete (ptr);
135227825Stheraven}
136227825Stheraven
137227825Stheraven__attribute__((__weak__, __visibility__("default")))
138227825Stheravenvoid
139227825Stheravenoperator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT
140227825Stheraven{
141227825Stheraven    ::operator delete[](ptr);
142227825Stheraven}
143227825Stheraven
144227825Stheravennamespace std
145227825Stheraven{
146227825Stheraven
147227825Stheravenconst nothrow_t nothrow = {};
148227825Stheraven
149232950Stheraven#ifndef _LIBCPPABI_VERSION
150232950Stheraven
151227825Stheravennew_handler
152227825Stheravenset_new_handler(new_handler handler) _NOEXCEPT
153227825Stheraven{
154227825Stheraven    return __sync_lock_test_and_set(&__new_handler, handler);
155227825Stheraven}
156227825Stheraven
157227825Stheravennew_handler
158227825Stheravenget_new_handler() _NOEXCEPT
159227825Stheraven{
160227825Stheraven    return __sync_fetch_and_add(&__new_handler, (new_handler)0);
161227825Stheraven}
162227825Stheraven
163232950Stheraven#ifndef LIBCXXRT
164232950Stheraven
165227825Stheravenbad_alloc::bad_alloc() _NOEXCEPT
166227825Stheraven{
167227825Stheraven}
168227825Stheraven
169227825Stheravenbad_alloc::~bad_alloc() _NOEXCEPT
170227825Stheraven{
171227825Stheraven}
172227825Stheraven
173227825Stheravenconst char*
174227825Stheravenbad_alloc::what() const _NOEXCEPT
175227825Stheraven{
176227825Stheraven    return "std::bad_alloc";
177227825Stheraven}
178227825Stheraven
179232972Stheraven#endif //LIBCXXRT
180232972Stheraven
181227825Stheravenbad_array_new_length::bad_array_new_length() _NOEXCEPT
182227825Stheraven{
183227825Stheraven}
184227825Stheraven
185227825Stheravenbad_array_new_length::~bad_array_new_length() _NOEXCEPT
186227825Stheraven{
187227825Stheraven}
188227825Stheraven
189227825Stheravenconst char*
190227825Stheravenbad_array_new_length::what() const _NOEXCEPT
191227825Stheraven{
192227825Stheraven    return "bad_array_new_length";
193227825Stheraven}
194227825Stheraven
195232950Stheraven#endif
196232950Stheraven
197227825Stheravenvoid
198227825Stheraven__throw_bad_alloc()
199227825Stheraven{
200227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS
201227825Stheraven    throw bad_alloc();
202227825Stheraven#endif
203227825Stheraven}
204227825Stheraven
205227825Stheraven}  // std
206