13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===// 23e519524SHoward Hinnant // 35b08a8a4SHoward Hinnant // The LLVM Compiler Infrastructure 43e519524SHoward Hinnant // 5412dbebeSHoward Hinnant // This file is dual licensed under the MIT and the University of Illinois Open 6412dbebeSHoward Hinnant // Source Licenses. See LICENSE.TXT for details. 73e519524SHoward Hinnant // 83e519524SHoward Hinnant //===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 106e8ebb2cSMarshall Clow #define _LIBCPP_BUILDING_NEW 116e8ebb2cSMarshall Clow 12111e0cbeSNick Kledzik #include <stdlib.h> 13111e0cbeSNick Kledzik 143e519524SHoward Hinnant #include "new" 153e519524SHoward Hinnant 1622b131ffSEric Fiselier #if defined(__APPLE__) && !defined(LIBCXXRT) 17128ba719SHoward Hinnant #include <cxxabi.h> 182c9c6a57SHoward Hinnant 192c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 20111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 21c1cf9818SMarshall Clow // shared library. The global holding the current new handler is 22111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 23111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 242c9c6a57SHoward Hinnant #endif 25940e211cSHoward Hinnant #else // __APPLE__ 26929df471SBenjamin Kramer #if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI) 27dce0696aSHoward Hinnant #include <cxxabi.h> 28929df471SBenjamin Kramer #endif // defined(LIBCXX_BUILDING_LIBCXXABI) 29926aa5f4SPeter Collingbourne #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) 30111e0cbeSNick Kledzik static std::new_handler __new_handler; 31dce0696aSHoward Hinnant #endif // _LIBCPPABI_VERSION 32111e0cbeSNick Kledzik #endif 33111e0cbeSNick Kledzik 34926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 35926aa5f4SPeter Collingbourne 36111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 3710fe4209SEric Fiselier // in this shared library, so that they can be overridden by programs 38111e0cbeSNick Kledzik // that define non-weak copies of the functions. 39111e0cbeSNick Kledzik 4032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 41111e0cbeSNick Kledzik void * 42fafca58cSHoward Hinnant operator new(std::size_t size) 4393a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 4493a16c0fSHoward Hinnant throw(std::bad_alloc) 4593a16c0fSHoward Hinnant #endif 46111e0cbeSNick Kledzik { 47111e0cbeSNick Kledzik if (size == 0) 48111e0cbeSNick Kledzik size = 1; 49111e0cbeSNick Kledzik void* p; 50111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 51111e0cbeSNick Kledzik { 52111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 53111e0cbeSNick Kledzik // call it to try free up memory. 5475357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 55816cb897SHoward Hinnant if (nh) 56816cb897SHoward Hinnant nh(); 57111e0cbeSNick Kledzik else 5854b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 59111e0cbeSNick Kledzik throw std::bad_alloc(); 6054b409fdSHoward Hinnant #else 6154b409fdSHoward Hinnant break; 6254b409fdSHoward Hinnant #endif 63111e0cbeSNick Kledzik } 64111e0cbeSNick Kledzik return p; 65111e0cbeSNick Kledzik } 66111e0cbeSNick Kledzik 6732f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 68111e0cbeSNick Kledzik void* 69fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 70111e0cbeSNick Kledzik { 71111e0cbeSNick Kledzik void* p = 0; 7254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 73111e0cbeSNick Kledzik try 74111e0cbeSNick Kledzik { 75940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 76111e0cbeSNick Kledzik p = ::operator new(size); 7754b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 78111e0cbeSNick Kledzik } 79111e0cbeSNick Kledzik catch (...) 80111e0cbeSNick Kledzik { 81111e0cbeSNick Kledzik } 82940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 83111e0cbeSNick Kledzik return p; 84111e0cbeSNick Kledzik } 85111e0cbeSNick Kledzik 8632f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 87111e0cbeSNick Kledzik void* 88fafca58cSHoward Hinnant operator new[](size_t size) 8993a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 9093a16c0fSHoward Hinnant throw(std::bad_alloc) 9193a16c0fSHoward Hinnant #endif 92111e0cbeSNick Kledzik { 93111e0cbeSNick Kledzik return ::operator new(size); 94111e0cbeSNick Kledzik } 95111e0cbeSNick Kledzik 9632f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 97111e0cbeSNick Kledzik void* 98c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 99111e0cbeSNick Kledzik { 100111e0cbeSNick Kledzik void* p = 0; 10154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 102111e0cbeSNick Kledzik try 103111e0cbeSNick Kledzik { 104940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 105111e0cbeSNick Kledzik p = ::operator new[](size); 10654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 107111e0cbeSNick Kledzik } 108111e0cbeSNick Kledzik catch (...) 109111e0cbeSNick Kledzik { 110111e0cbeSNick Kledzik } 111940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 112111e0cbeSNick Kledzik return p; 113111e0cbeSNick Kledzik } 114111e0cbeSNick Kledzik 11532f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 116111e0cbeSNick Kledzik void 117fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 118111e0cbeSNick Kledzik { 119111e0cbeSNick Kledzik if (ptr) 120111e0cbeSNick Kledzik ::free(ptr); 121111e0cbeSNick Kledzik } 122111e0cbeSNick Kledzik 12332f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 124111e0cbeSNick Kledzik void 125fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 126111e0cbeSNick Kledzik { 127111e0cbeSNick Kledzik ::operator delete(ptr); 128111e0cbeSNick Kledzik } 129111e0cbeSNick Kledzik 13032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 131111e0cbeSNick Kledzik void 132e4864e0bSLarisse Voufo operator delete(void* ptr, size_t) _NOEXCEPT 133d36bd700SLarisse Voufo { 134d36bd700SLarisse Voufo ::operator delete(ptr); 135d36bd700SLarisse Voufo } 136d36bd700SLarisse Voufo 137d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 138d36bd700SLarisse Voufo void 139fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT 140111e0cbeSNick Kledzik { 141111e0cbeSNick Kledzik ::operator delete(ptr); 142111e0cbeSNick Kledzik } 143111e0cbeSNick Kledzik 14432f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 145111e0cbeSNick Kledzik void 146fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 147111e0cbeSNick Kledzik { 148111e0cbeSNick Kledzik ::operator delete[](ptr); 149111e0cbeSNick Kledzik } 150111e0cbeSNick Kledzik 151d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 152d36bd700SLarisse Voufo void 153e4864e0bSLarisse Voufo operator delete[] (void* ptr, size_t) _NOEXCEPT 154d36bd700SLarisse Voufo { 155d36bd700SLarisse Voufo ::operator delete[](ptr); 156d36bd700SLarisse Voufo } 157d36bd700SLarisse Voufo 158926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__ 159926aa5f4SPeter Collingbourne 1603e519524SHoward Hinnant namespace std 1613e519524SHoward Hinnant { 1623e519524SHoward Hinnant 163926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 16462713dacSNick Kledzik const nothrow_t nothrow = {}; 165926aa5f4SPeter Collingbourne #endif 16662713dacSNick Kledzik 1672c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 1682c9c6a57SHoward Hinnant 169926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 170926aa5f4SPeter Collingbourne 17162713dacSNick Kledzik new_handler 172fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 17362713dacSNick Kledzik { 1741596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1751596c453SHoward Hinnant } 1761596c453SHoward Hinnant 1771596c453SHoward Hinnant new_handler 178fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1791596c453SHoward Hinnant { 180634b9dd7SJoerg Sonnenberger return __sync_fetch_and_add(&__new_handler, nullptr); 18162713dacSNick Kledzik } 18262713dacSNick Kledzik 183926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__ 184926aa5f4SPeter Collingbourne 185e1da544eSDavid Chisnall #ifndef LIBCXXRT 186e1da544eSDavid Chisnall 187fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 188111e0cbeSNick Kledzik { 189111e0cbeSNick Kledzik } 190111e0cbeSNick Kledzik 191926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 192926aa5f4SPeter Collingbourne 193fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 194111e0cbeSNick Kledzik { 195111e0cbeSNick Kledzik } 196111e0cbeSNick Kledzik 197111e0cbeSNick Kledzik const char* 198fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 199111e0cbeSNick Kledzik { 200111e0cbeSNick Kledzik return "std::bad_alloc"; 201111e0cbeSNick Kledzik } 202111e0cbeSNick Kledzik 203926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__ 204926aa5f4SPeter Collingbourne 205fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 206111e0cbeSNick Kledzik { 207111e0cbeSNick Kledzik } 208111e0cbeSNick Kledzik 209fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 2103e519524SHoward Hinnant { 2113e519524SHoward Hinnant } 2123e519524SHoward Hinnant 2131d558b84SEric Fiselier const char* 2141d558b84SEric Fiselier bad_array_new_length::what() const _NOEXCEPT 2151d558b84SEric Fiselier { 2161d558b84SEric Fiselier return "bad_array_new_length"; 2171d558b84SEric Fiselier } 2181d558b84SEric Fiselier 219fd465fe5SEric Fiselier #endif //LIBCXXRT 220fd465fe5SEric Fiselier 2213e519524SHoward Hinnant const char* 2226e8ebb2cSMarshall Clow bad_array_length::what() const _NOEXCEPT 2236e8ebb2cSMarshall Clow { 2246e8ebb2cSMarshall Clow return "bad_array_length"; 2256e8ebb2cSMarshall Clow } 2266e8ebb2cSMarshall Clow 2276e8ebb2cSMarshall Clow bad_array_length::bad_array_length() _NOEXCEPT 2286e8ebb2cSMarshall Clow { 2296e8ebb2cSMarshall Clow } 2306e8ebb2cSMarshall Clow 2316e8ebb2cSMarshall Clow bad_array_length::~bad_array_length() _NOEXCEPT 2326e8ebb2cSMarshall Clow { 2336e8ebb2cSMarshall Clow } 2346e8ebb2cSMarshall Clow 2356e8ebb2cSMarshall Clow #endif // _LIBCPPABI_VERSION 2362c9c6a57SHoward Hinnant 23726dd09e5SPeter Collingbourne #ifndef LIBSTDCXX 23826dd09e5SPeter Collingbourne 2393e519524SHoward Hinnant void 2403e519524SHoward Hinnant __throw_bad_alloc() 2413e519524SHoward Hinnant { 24254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 2433e519524SHoward Hinnant throw bad_alloc(); 244*d437fa5cSMarshall Clow #else 245*d437fa5cSMarshall Clow _VSTD::abort(); 24654b409fdSHoward Hinnant #endif 2473e519524SHoward Hinnant } 2483e519524SHoward Hinnant 24926dd09e5SPeter Collingbourne #endif // !LIBSTDCXX 25026dd09e5SPeter Collingbourne 2513e519524SHoward Hinnant } // std 252