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 10111e0cbeSNick Kledzik #include <stdlib.h> 11111e0cbeSNick Kledzik 123e519524SHoward Hinnant #include "new" 133e519524SHoward Hinnant 14111e0cbeSNick Kledzik #if __APPLE__ 15128ba719SHoward Hinnant #include <cxxabi.h> 162c9c6a57SHoward Hinnant 172c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 18111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 19111e0cbeSNick Kledzik // shared libray. The global holding the current new handler is 20111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 21111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 222c9c6a57SHoward Hinnant #endif 23940e211cSHoward Hinnant #else // __APPLE__ 24111e0cbeSNick Kledzik static std::new_handler __new_handler; 25111e0cbeSNick Kledzik #endif 26111e0cbeSNick Kledzik 27111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 28111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 29111e0cbeSNick Kledzik // that define non-weak copies of the functions. 30111e0cbeSNick Kledzik 31111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 32111e0cbeSNick Kledzik void * 33fafca58cSHoward Hinnant operator new(std::size_t size) 3493a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 3593a16c0fSHoward Hinnant throw(std::bad_alloc) 3693a16c0fSHoward Hinnant #endif 37111e0cbeSNick Kledzik { 38111e0cbeSNick Kledzik if (size == 0) 39111e0cbeSNick Kledzik size = 1; 40111e0cbeSNick Kledzik void* p; 41111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 42111e0cbeSNick Kledzik { 43111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 44111e0cbeSNick Kledzik // call it to try free up memory. 4575357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 46816cb897SHoward Hinnant if (nh) 47816cb897SHoward Hinnant nh(); 48111e0cbeSNick Kledzik else 4954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 50111e0cbeSNick Kledzik throw std::bad_alloc(); 5154b409fdSHoward Hinnant #else 5254b409fdSHoward Hinnant break; 5354b409fdSHoward Hinnant #endif 54111e0cbeSNick Kledzik } 55111e0cbeSNick Kledzik return p; 56111e0cbeSNick Kledzik } 57111e0cbeSNick Kledzik 58111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 59111e0cbeSNick Kledzik void* 60fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 61111e0cbeSNick Kledzik { 62111e0cbeSNick Kledzik void* p = 0; 6354b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 64111e0cbeSNick Kledzik try 65111e0cbeSNick Kledzik { 66940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 67111e0cbeSNick Kledzik p = ::operator new(size); 6854b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 69111e0cbeSNick Kledzik } 70111e0cbeSNick Kledzik catch (...) 71111e0cbeSNick Kledzik { 72111e0cbeSNick Kledzik } 73940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 74111e0cbeSNick Kledzik return p; 75111e0cbeSNick Kledzik } 76111e0cbeSNick Kledzik 77111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 78111e0cbeSNick Kledzik void* 79fafca58cSHoward Hinnant operator new[](size_t size) 8093a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 8193a16c0fSHoward Hinnant throw(std::bad_alloc) 8293a16c0fSHoward Hinnant #endif 83111e0cbeSNick Kledzik { 84111e0cbeSNick Kledzik return ::operator new(size); 85111e0cbeSNick Kledzik } 86111e0cbeSNick Kledzik 87111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 88111e0cbeSNick Kledzik void* 89c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 90111e0cbeSNick Kledzik { 91111e0cbeSNick Kledzik void* p = 0; 9254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 93111e0cbeSNick Kledzik try 94111e0cbeSNick Kledzik { 95940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 96111e0cbeSNick Kledzik p = ::operator new[](size); 9754b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 98111e0cbeSNick Kledzik } 99111e0cbeSNick Kledzik catch (...) 100111e0cbeSNick Kledzik { 101111e0cbeSNick Kledzik } 102940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 103111e0cbeSNick Kledzik return p; 104111e0cbeSNick Kledzik } 105111e0cbeSNick Kledzik 106111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 107111e0cbeSNick Kledzik void 108fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 109111e0cbeSNick Kledzik { 110111e0cbeSNick Kledzik if (ptr) 111111e0cbeSNick Kledzik ::free(ptr); 112111e0cbeSNick Kledzik } 113111e0cbeSNick Kledzik 114111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 115111e0cbeSNick Kledzik void 116fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 117111e0cbeSNick Kledzik { 118111e0cbeSNick Kledzik ::operator delete(ptr); 119111e0cbeSNick Kledzik } 120111e0cbeSNick Kledzik 121111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 122111e0cbeSNick Kledzik void 123fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT 124111e0cbeSNick Kledzik { 125111e0cbeSNick Kledzik ::operator delete (ptr); 126111e0cbeSNick Kledzik } 127111e0cbeSNick Kledzik 128111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 129111e0cbeSNick Kledzik void 130fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 131111e0cbeSNick Kledzik { 132111e0cbeSNick Kledzik ::operator delete[](ptr); 133111e0cbeSNick Kledzik } 134111e0cbeSNick Kledzik 1353e519524SHoward Hinnant namespace std 1363e519524SHoward Hinnant { 1373e519524SHoward Hinnant 13862713dacSNick Kledzik const nothrow_t nothrow = {}; 13962713dacSNick Kledzik 1402c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 1412c9c6a57SHoward Hinnant 14262713dacSNick Kledzik new_handler 143fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 14462713dacSNick Kledzik { 1451596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1461596c453SHoward Hinnant } 1471596c453SHoward Hinnant 1481596c453SHoward Hinnant new_handler 149fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1501596c453SHoward Hinnant { 1511596c453SHoward Hinnant return __sync_fetch_and_add(&__new_handler, (new_handler)0); 15262713dacSNick Kledzik } 15362713dacSNick Kledzik 154e1da544eSDavid Chisnall #ifndef LIBCXXRT 155e1da544eSDavid Chisnall 156fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 157111e0cbeSNick Kledzik { 158111e0cbeSNick Kledzik } 159111e0cbeSNick Kledzik 160fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 161111e0cbeSNick Kledzik { 162111e0cbeSNick Kledzik } 163111e0cbeSNick Kledzik 164111e0cbeSNick Kledzik const char* 165fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 166111e0cbeSNick Kledzik { 167111e0cbeSNick Kledzik return "std::bad_alloc"; 168111e0cbeSNick Kledzik } 169111e0cbeSNick Kledzik 170*1e02029fSDavid Chisnall #endif //LIBCXXRT 171*1e02029fSDavid Chisnall 172fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 173111e0cbeSNick Kledzik { 174111e0cbeSNick Kledzik } 175111e0cbeSNick Kledzik 176fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 1773e519524SHoward Hinnant { 1783e519524SHoward Hinnant } 1793e519524SHoward Hinnant 1803e519524SHoward Hinnant const char* 181fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT 1823e519524SHoward Hinnant { 1833e519524SHoward Hinnant return "bad_array_new_length"; 1843e519524SHoward Hinnant } 1853e519524SHoward Hinnant 1862c9c6a57SHoward Hinnant #endif 1872c9c6a57SHoward Hinnant 1883e519524SHoward Hinnant void 1893e519524SHoward Hinnant __throw_bad_alloc() 1903e519524SHoward Hinnant { 19154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 1923e519524SHoward Hinnant throw bad_alloc(); 19354b409fdSHoward Hinnant #endif 1943e519524SHoward Hinnant } 1953e519524SHoward Hinnant 1963e519524SHoward Hinnant } // std 197