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