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 20b56e8587SMarshall Clow #ifdef __APPLE__ 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 25111e0cbeSNick Kledzik // shared libray. 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>) 33dce0696aSHoward Hinnant #ifndef _LIBCPPABI_VERSION 34111e0cbeSNick Kledzik static std::new_handler __new_handler; 35dce0696aSHoward Hinnant #endif // _LIBCPPABI_VERSION 36111e0cbeSNick Kledzik #endif 37111e0cbeSNick Kledzik 38111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 39111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 40111e0cbeSNick Kledzik // that define non-weak copies of the functions. 41111e0cbeSNick Kledzik 42*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 43111e0cbeSNick Kledzik void * 44fafca58cSHoward Hinnant operator new(std::size_t size) 4593a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 4693a16c0fSHoward Hinnant throw(std::bad_alloc) 4793a16c0fSHoward Hinnant #endif 48111e0cbeSNick Kledzik { 49111e0cbeSNick Kledzik if (size == 0) 50111e0cbeSNick Kledzik size = 1; 51111e0cbeSNick Kledzik void* p; 52111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 53111e0cbeSNick Kledzik { 54111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 55111e0cbeSNick Kledzik // call it to try free up memory. 5675357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 57816cb897SHoward Hinnant if (nh) 58816cb897SHoward Hinnant nh(); 59111e0cbeSNick Kledzik else 6054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 61111e0cbeSNick Kledzik throw std::bad_alloc(); 6254b409fdSHoward Hinnant #else 6354b409fdSHoward Hinnant break; 6454b409fdSHoward Hinnant #endif 65111e0cbeSNick Kledzik } 66111e0cbeSNick Kledzik return p; 67111e0cbeSNick Kledzik } 68111e0cbeSNick Kledzik 69*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 70111e0cbeSNick Kledzik void* 71fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 72111e0cbeSNick Kledzik { 73111e0cbeSNick Kledzik void* p = 0; 7454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 75111e0cbeSNick Kledzik try 76111e0cbeSNick Kledzik { 77940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 78111e0cbeSNick Kledzik p = ::operator new(size); 7954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 80111e0cbeSNick Kledzik } 81111e0cbeSNick Kledzik catch (...) 82111e0cbeSNick Kledzik { 83111e0cbeSNick Kledzik } 84940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 85111e0cbeSNick Kledzik return p; 86111e0cbeSNick Kledzik } 87111e0cbeSNick Kledzik 88*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 89111e0cbeSNick Kledzik void* 90fafca58cSHoward Hinnant operator new[](size_t size) 9193a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 9293a16c0fSHoward Hinnant throw(std::bad_alloc) 9393a16c0fSHoward Hinnant #endif 94111e0cbeSNick Kledzik { 95111e0cbeSNick Kledzik return ::operator new(size); 96111e0cbeSNick Kledzik } 97111e0cbeSNick Kledzik 98*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 99111e0cbeSNick Kledzik void* 100c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 101111e0cbeSNick Kledzik { 102111e0cbeSNick Kledzik void* p = 0; 10354b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 104111e0cbeSNick Kledzik try 105111e0cbeSNick Kledzik { 106940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 107111e0cbeSNick Kledzik p = ::operator new[](size); 10854b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 109111e0cbeSNick Kledzik } 110111e0cbeSNick Kledzik catch (...) 111111e0cbeSNick Kledzik { 112111e0cbeSNick Kledzik } 113940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 114111e0cbeSNick Kledzik return p; 115111e0cbeSNick Kledzik } 116111e0cbeSNick Kledzik 117*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 118111e0cbeSNick Kledzik void 119fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 120111e0cbeSNick Kledzik { 121111e0cbeSNick Kledzik if (ptr) 122111e0cbeSNick Kledzik ::free(ptr); 123111e0cbeSNick Kledzik } 124111e0cbeSNick Kledzik 125*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 126111e0cbeSNick Kledzik void 127fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 128111e0cbeSNick Kledzik { 129111e0cbeSNick Kledzik ::operator delete(ptr); 130111e0cbeSNick Kledzik } 131111e0cbeSNick Kledzik 132*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 133111e0cbeSNick Kledzik void 134fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT 135111e0cbeSNick Kledzik { 136111e0cbeSNick Kledzik ::operator delete (ptr); 137111e0cbeSNick Kledzik } 138111e0cbeSNick Kledzik 139*32f9a776SHoward Hinnant _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS 140111e0cbeSNick Kledzik void 141fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 142111e0cbeSNick Kledzik { 143111e0cbeSNick Kledzik ::operator delete[](ptr); 144111e0cbeSNick Kledzik } 145111e0cbeSNick Kledzik 1463e519524SHoward Hinnant namespace std 1473e519524SHoward Hinnant { 1483e519524SHoward Hinnant 14962713dacSNick Kledzik const nothrow_t nothrow = {}; 15062713dacSNick Kledzik 1512c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 1522c9c6a57SHoward Hinnant 15362713dacSNick Kledzik new_handler 154fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 15562713dacSNick Kledzik { 1561596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1571596c453SHoward Hinnant } 1581596c453SHoward Hinnant 1591596c453SHoward Hinnant new_handler 160fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1611596c453SHoward Hinnant { 1621596c453SHoward Hinnant return __sync_fetch_and_add(&__new_handler, (new_handler)0); 16362713dacSNick Kledzik } 16462713dacSNick Kledzik 165e1da544eSDavid Chisnall #ifndef LIBCXXRT 166e1da544eSDavid Chisnall 167fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 168111e0cbeSNick Kledzik { 169111e0cbeSNick Kledzik } 170111e0cbeSNick Kledzik 171fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 172111e0cbeSNick Kledzik { 173111e0cbeSNick Kledzik } 174111e0cbeSNick Kledzik 175111e0cbeSNick Kledzik const char* 176fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 177111e0cbeSNick Kledzik { 178111e0cbeSNick Kledzik return "std::bad_alloc"; 179111e0cbeSNick Kledzik } 180111e0cbeSNick Kledzik 1811e02029fSDavid Chisnall #endif //LIBCXXRT 1821e02029fSDavid Chisnall 183fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 184111e0cbeSNick Kledzik { 185111e0cbeSNick Kledzik } 186111e0cbeSNick Kledzik 187fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 1883e519524SHoward Hinnant { 1893e519524SHoward Hinnant } 1903e519524SHoward Hinnant 1913e519524SHoward Hinnant const char* 1926e8ebb2cSMarshall Clow bad_array_length::what() const _NOEXCEPT 1936e8ebb2cSMarshall Clow { 1946e8ebb2cSMarshall Clow return "bad_array_length"; 1956e8ebb2cSMarshall Clow } 1966e8ebb2cSMarshall Clow 1976e8ebb2cSMarshall Clow bad_array_length::bad_array_length() _NOEXCEPT 1986e8ebb2cSMarshall Clow { 1996e8ebb2cSMarshall Clow } 2006e8ebb2cSMarshall Clow 2016e8ebb2cSMarshall Clow bad_array_length::~bad_array_length() _NOEXCEPT 2026e8ebb2cSMarshall Clow { 2036e8ebb2cSMarshall Clow } 2046e8ebb2cSMarshall Clow 2056e8ebb2cSMarshall Clow const char* 206fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT 2073e519524SHoward Hinnant { 2083e519524SHoward Hinnant return "bad_array_new_length"; 2093e519524SHoward Hinnant } 2103e519524SHoward Hinnant 2116e8ebb2cSMarshall Clow #endif // _LIBCPPABI_VERSION 2122c9c6a57SHoward Hinnant 2133e519524SHoward Hinnant void 2143e519524SHoward Hinnant __throw_bad_alloc() 2153e519524SHoward Hinnant { 21654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 2173e519524SHoward Hinnant throw bad_alloc(); 21854b409fdSHoward Hinnant #endif 2193e519524SHoward Hinnant } 2203e519524SHoward Hinnant 2213e519524SHoward Hinnant } // std 222