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 16dce0696aSHoward Hinnant #ifndef __has_include 17dce0696aSHoward Hinnant #define __has_include(inc) 0 18dce0696aSHoward Hinnant #endif 19dce0696aSHoward Hinnant 2022b131ffSEric Fiselier #if defined(__APPLE__) && !defined(LIBCXXRT) 21128ba719SHoward Hinnant #include <cxxabi.h> 222c9c6a57SHoward Hinnant 232c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 24111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 25c1cf9818SMarshall Clow // shared library. The global holding the current new handler is 26111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 27111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 282c9c6a57SHoward Hinnant #endif 29940e211cSHoward Hinnant #else // __APPLE__ 30dce0696aSHoward Hinnant #if defined(LIBCXXRT) || __has_include(<cxxabi.h>) 31dce0696aSHoward Hinnant #include <cxxabi.h> 32dce0696aSHoward Hinnant #endif // __has_include(<cxxabi.h>) 33926aa5f4SPeter Collingbourne #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__) 34111e0cbeSNick Kledzik static std::new_handler __new_handler; 35dce0696aSHoward Hinnant #endif // _LIBCPPABI_VERSION 36111e0cbeSNick Kledzik #endif 37111e0cbeSNick Kledzik 38926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 39926aa5f4SPeter Collingbourne 40111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 41111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 42111e0cbeSNick Kledzik // that define non-weak copies of the functions. 43111e0cbeSNick Kledzik 4432f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 45111e0cbeSNick Kledzik void * 46fafca58cSHoward Hinnant operator new(std::size_t size) 4793a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 4893a16c0fSHoward Hinnant throw(std::bad_alloc) 4993a16c0fSHoward Hinnant #endif 50111e0cbeSNick Kledzik { 51111e0cbeSNick Kledzik if (size == 0) 52111e0cbeSNick Kledzik size = 1; 53111e0cbeSNick Kledzik void* p; 54111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 55111e0cbeSNick Kledzik { 56111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 57111e0cbeSNick Kledzik // call it to try free up memory. 5875357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 59816cb897SHoward Hinnant if (nh) 60816cb897SHoward Hinnant nh(); 61111e0cbeSNick Kledzik else 6254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 63111e0cbeSNick Kledzik throw std::bad_alloc(); 6454b409fdSHoward Hinnant #else 6554b409fdSHoward Hinnant break; 6654b409fdSHoward Hinnant #endif 67111e0cbeSNick Kledzik } 68111e0cbeSNick Kledzik return p; 69111e0cbeSNick Kledzik } 70111e0cbeSNick Kledzik 7132f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 72111e0cbeSNick Kledzik void* 73fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 74111e0cbeSNick Kledzik { 75111e0cbeSNick Kledzik void* p = 0; 7654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 77111e0cbeSNick Kledzik try 78111e0cbeSNick Kledzik { 79940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 80111e0cbeSNick Kledzik p = ::operator new(size); 8154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 82111e0cbeSNick Kledzik } 83111e0cbeSNick Kledzik catch (...) 84111e0cbeSNick Kledzik { 85111e0cbeSNick Kledzik } 86940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 87111e0cbeSNick Kledzik return p; 88111e0cbeSNick Kledzik } 89111e0cbeSNick Kledzik 9032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 91111e0cbeSNick Kledzik void* 92fafca58cSHoward Hinnant operator new[](size_t size) 9393a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 9493a16c0fSHoward Hinnant throw(std::bad_alloc) 9593a16c0fSHoward Hinnant #endif 96111e0cbeSNick Kledzik { 97111e0cbeSNick Kledzik return ::operator new(size); 98111e0cbeSNick Kledzik } 99111e0cbeSNick Kledzik 10032f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 101111e0cbeSNick Kledzik void* 102c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 103111e0cbeSNick Kledzik { 104111e0cbeSNick Kledzik void* p = 0; 10554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 106111e0cbeSNick Kledzik try 107111e0cbeSNick Kledzik { 108940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 109111e0cbeSNick Kledzik p = ::operator new[](size); 11054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 111111e0cbeSNick Kledzik } 112111e0cbeSNick Kledzik catch (...) 113111e0cbeSNick Kledzik { 114111e0cbeSNick Kledzik } 115940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 116111e0cbeSNick Kledzik return p; 117111e0cbeSNick Kledzik } 118111e0cbeSNick Kledzik 11932f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 120111e0cbeSNick Kledzik void 121fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 122111e0cbeSNick Kledzik { 123111e0cbeSNick Kledzik if (ptr) 124111e0cbeSNick Kledzik ::free(ptr); 125111e0cbeSNick Kledzik } 126111e0cbeSNick Kledzik 12732f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 128111e0cbeSNick Kledzik void 129fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 130111e0cbeSNick Kledzik { 131111e0cbeSNick Kledzik ::operator delete(ptr); 132111e0cbeSNick Kledzik } 133111e0cbeSNick Kledzik 13432f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 135111e0cbeSNick Kledzik void 136*e4864e0bSLarisse Voufo operator delete(void* ptr, size_t) _NOEXCEPT 137d36bd700SLarisse Voufo { 138d36bd700SLarisse Voufo ::operator delete(ptr); 139d36bd700SLarisse Voufo } 140d36bd700SLarisse Voufo 141d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 142d36bd700SLarisse Voufo void 143*e4864e0bSLarisse Voufo operator delete(void* ptr, size_t, const std::nothrow_t& nt) _NOEXCEPT 144*e4864e0bSLarisse Voufo { 145*e4864e0bSLarisse Voufo ::operator delete(ptr, nt); 146*e4864e0bSLarisse Voufo } 147*e4864e0bSLarisse Voufo 148*e4864e0bSLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 149*e4864e0bSLarisse Voufo void 150fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT 151111e0cbeSNick Kledzik { 152111e0cbeSNick Kledzik ::operator delete(ptr); 153111e0cbeSNick Kledzik } 154111e0cbeSNick Kledzik 15532f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 156111e0cbeSNick Kledzik void 157fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 158111e0cbeSNick Kledzik { 159111e0cbeSNick Kledzik ::operator delete[](ptr); 160111e0cbeSNick Kledzik } 161111e0cbeSNick Kledzik 162d36bd700SLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 163d36bd700SLarisse Voufo void 164*e4864e0bSLarisse Voufo operator delete[] (void* ptr, size_t) _NOEXCEPT 165d36bd700SLarisse Voufo { 166d36bd700SLarisse Voufo ::operator delete[](ptr); 167d36bd700SLarisse Voufo } 168d36bd700SLarisse Voufo 169*e4864e0bSLarisse Voufo _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 170*e4864e0bSLarisse Voufo void 171*e4864e0bSLarisse Voufo operator delete[] (void* ptr, size_t, const std::nothrow_t& nt) _NOEXCEPT 172*e4864e0bSLarisse Voufo { 173*e4864e0bSLarisse Voufo ::operator delete[](ptr, nt); 174*e4864e0bSLarisse Voufo } 175*e4864e0bSLarisse Voufo 176926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__ 177926aa5f4SPeter Collingbourne 1783e519524SHoward Hinnant namespace std 1793e519524SHoward Hinnant { 1803e519524SHoward Hinnant 181926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 18262713dacSNick Kledzik const nothrow_t nothrow = {}; 183926aa5f4SPeter Collingbourne #endif 18462713dacSNick Kledzik 1852c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 1862c9c6a57SHoward Hinnant 187926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 188926aa5f4SPeter Collingbourne 18962713dacSNick Kledzik new_handler 190fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 19162713dacSNick Kledzik { 1921596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1931596c453SHoward Hinnant } 1941596c453SHoward Hinnant 1951596c453SHoward Hinnant new_handler 196fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1971596c453SHoward Hinnant { 198634b9dd7SJoerg Sonnenberger return __sync_fetch_and_add(&__new_handler, nullptr); 19962713dacSNick Kledzik } 20062713dacSNick Kledzik 201926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__ 202926aa5f4SPeter Collingbourne 203e1da544eSDavid Chisnall #ifndef LIBCXXRT 204e1da544eSDavid Chisnall 205fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 206111e0cbeSNick Kledzik { 207111e0cbeSNick Kledzik } 208111e0cbeSNick Kledzik 209926aa5f4SPeter Collingbourne #ifndef __GLIBCXX__ 210926aa5f4SPeter Collingbourne 211fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 212111e0cbeSNick Kledzik { 213111e0cbeSNick Kledzik } 214111e0cbeSNick Kledzik 215111e0cbeSNick Kledzik const char* 216fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 217111e0cbeSNick Kledzik { 218111e0cbeSNick Kledzik return "std::bad_alloc"; 219111e0cbeSNick Kledzik } 220111e0cbeSNick Kledzik 221926aa5f4SPeter Collingbourne #endif // !__GLIBCXX__ 222926aa5f4SPeter Collingbourne 223fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 224111e0cbeSNick Kledzik { 225111e0cbeSNick Kledzik } 226111e0cbeSNick Kledzik 227fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 2283e519524SHoward Hinnant { 2293e519524SHoward Hinnant } 2303e519524SHoward Hinnant 2311d558b84SEric Fiselier const char* 2321d558b84SEric Fiselier bad_array_new_length::what() const _NOEXCEPT 2331d558b84SEric Fiselier { 2341d558b84SEric Fiselier return "bad_array_new_length"; 2351d558b84SEric Fiselier } 2361d558b84SEric Fiselier 237fd465fe5SEric Fiselier #endif //LIBCXXRT 238fd465fe5SEric Fiselier 2393e519524SHoward Hinnant const char* 2406e8ebb2cSMarshall Clow bad_array_length::what() const _NOEXCEPT 2416e8ebb2cSMarshall Clow { 2426e8ebb2cSMarshall Clow return "bad_array_length"; 2436e8ebb2cSMarshall Clow } 2446e8ebb2cSMarshall Clow 2456e8ebb2cSMarshall Clow bad_array_length::bad_array_length() _NOEXCEPT 2466e8ebb2cSMarshall Clow { 2476e8ebb2cSMarshall Clow } 2486e8ebb2cSMarshall Clow 2496e8ebb2cSMarshall Clow bad_array_length::~bad_array_length() _NOEXCEPT 2506e8ebb2cSMarshall Clow { 2516e8ebb2cSMarshall Clow } 2526e8ebb2cSMarshall Clow 2536e8ebb2cSMarshall Clow #endif // _LIBCPPABI_VERSION 2542c9c6a57SHoward Hinnant 25526dd09e5SPeter Collingbourne #ifndef LIBSTDCXX 25626dd09e5SPeter Collingbourne 2573e519524SHoward Hinnant void 2583e519524SHoward Hinnant __throw_bad_alloc() 2593e519524SHoward Hinnant { 26054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 2613e519524SHoward Hinnant throw bad_alloc(); 26254b409fdSHoward Hinnant #endif 2633e519524SHoward Hinnant } 2643e519524SHoward Hinnant 26526dd09e5SPeter Collingbourne #endif // !LIBSTDCXX 26626dd09e5SPeter Collingbourne 2673e519524SHoward Hinnant } // std 268