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 14dce0696aSHoward Hinnant #ifndef __has_include 15dce0696aSHoward Hinnant #define __has_include(inc) 0 16dce0696aSHoward Hinnant #endif 17dce0696aSHoward Hinnant 18*b56e8587SMarshall Clow #ifdef __APPLE__ 19128ba719SHoward Hinnant #include <cxxabi.h> 202c9c6a57SHoward Hinnant 212c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 22111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 23111e0cbeSNick Kledzik // shared libray. The global holding the current new handler is 24111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 25111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 262c9c6a57SHoward Hinnant #endif 27940e211cSHoward Hinnant #else // __APPLE__ 28dce0696aSHoward Hinnant #if defined(LIBCXXRT) || __has_include(<cxxabi.h>) 29dce0696aSHoward Hinnant #include <cxxabi.h> 30dce0696aSHoward Hinnant #endif // __has_include(<cxxabi.h>) 31dce0696aSHoward Hinnant #ifndef _LIBCPPABI_VERSION 32111e0cbeSNick Kledzik static std::new_handler __new_handler; 33dce0696aSHoward Hinnant #endif // _LIBCPPABI_VERSION 34111e0cbeSNick Kledzik #endif 35111e0cbeSNick Kledzik 36111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 37111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 38111e0cbeSNick Kledzik // that define non-weak copies of the functions. 39111e0cbeSNick Kledzik 40111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 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 67111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 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 86111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 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 96111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 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 115111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 116111e0cbeSNick Kledzik void 117fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 118111e0cbeSNick Kledzik { 119111e0cbeSNick Kledzik if (ptr) 120111e0cbeSNick Kledzik ::free(ptr); 121111e0cbeSNick Kledzik } 122111e0cbeSNick Kledzik 123111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 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 130111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 131111e0cbeSNick Kledzik void 132fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT 133111e0cbeSNick Kledzik { 134111e0cbeSNick Kledzik ::operator delete (ptr); 135111e0cbeSNick Kledzik } 136111e0cbeSNick Kledzik 137111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 138111e0cbeSNick Kledzik void 139fafca58cSHoward Hinnant operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT 140111e0cbeSNick Kledzik { 141111e0cbeSNick Kledzik ::operator delete[](ptr); 142111e0cbeSNick Kledzik } 143111e0cbeSNick Kledzik 1443e519524SHoward Hinnant namespace std 1453e519524SHoward Hinnant { 1463e519524SHoward Hinnant 14762713dacSNick Kledzik const nothrow_t nothrow = {}; 14862713dacSNick Kledzik 1492c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 1502c9c6a57SHoward Hinnant 15162713dacSNick Kledzik new_handler 152fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 15362713dacSNick Kledzik { 1541596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1551596c453SHoward Hinnant } 1561596c453SHoward Hinnant 1571596c453SHoward Hinnant new_handler 158fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1591596c453SHoward Hinnant { 1601596c453SHoward Hinnant return __sync_fetch_and_add(&__new_handler, (new_handler)0); 16162713dacSNick Kledzik } 16262713dacSNick Kledzik 163e1da544eSDavid Chisnall #ifndef LIBCXXRT 164e1da544eSDavid Chisnall 165fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 166111e0cbeSNick Kledzik { 167111e0cbeSNick Kledzik } 168111e0cbeSNick Kledzik 169fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 170111e0cbeSNick Kledzik { 171111e0cbeSNick Kledzik } 172111e0cbeSNick Kledzik 173111e0cbeSNick Kledzik const char* 174fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 175111e0cbeSNick Kledzik { 176111e0cbeSNick Kledzik return "std::bad_alloc"; 177111e0cbeSNick Kledzik } 178111e0cbeSNick Kledzik 1791e02029fSDavid Chisnall #endif //LIBCXXRT 1801e02029fSDavid Chisnall 181fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 182111e0cbeSNick Kledzik { 183111e0cbeSNick Kledzik } 184111e0cbeSNick Kledzik 185fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 1863e519524SHoward Hinnant { 1873e519524SHoward Hinnant } 1883e519524SHoward Hinnant 1893e519524SHoward Hinnant const char* 190fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT 1913e519524SHoward Hinnant { 1923e519524SHoward Hinnant return "bad_array_new_length"; 1933e519524SHoward Hinnant } 1943e519524SHoward Hinnant 1952c9c6a57SHoward Hinnant #endif 1962c9c6a57SHoward Hinnant 1973e519524SHoward Hinnant void 1983e519524SHoward Hinnant __throw_bad_alloc() 1993e519524SHoward Hinnant { 20054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 2013e519524SHoward Hinnant throw bad_alloc(); 20254b409fdSHoward Hinnant #endif 2033e519524SHoward Hinnant } 2043e519524SHoward Hinnant 2053e519524SHoward Hinnant } // std 206