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 27*e1da544eSDavid Chisnall #if !defined (LIBCXXRT) // && !defined(_LIBCPPABI_VERSION) 282c9c6a57SHoward Hinnant 29111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 30111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 31111e0cbeSNick Kledzik // that define non-weak copies of the functions. 32111e0cbeSNick Kledzik 33111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 34111e0cbeSNick Kledzik void * 35fafca58cSHoward Hinnant operator new(std::size_t size) 3693a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 3793a16c0fSHoward Hinnant throw(std::bad_alloc) 3893a16c0fSHoward Hinnant #endif 39111e0cbeSNick Kledzik { 40111e0cbeSNick Kledzik if (size == 0) 41111e0cbeSNick Kledzik size = 1; 42111e0cbeSNick Kledzik void* p; 43111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 44111e0cbeSNick Kledzik { 45111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 46111e0cbeSNick Kledzik // call it to try free up memory. 4775357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 48816cb897SHoward Hinnant if (nh) 49816cb897SHoward Hinnant nh(); 50111e0cbeSNick Kledzik else 5154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 52111e0cbeSNick Kledzik throw std::bad_alloc(); 5354b409fdSHoward Hinnant #else 5454b409fdSHoward Hinnant break; 5554b409fdSHoward Hinnant #endif 56111e0cbeSNick Kledzik } 57111e0cbeSNick Kledzik return p; 58111e0cbeSNick Kledzik } 59111e0cbeSNick Kledzik 60111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 61111e0cbeSNick Kledzik void* 62fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 63111e0cbeSNick Kledzik { 64111e0cbeSNick Kledzik void* p = 0; 6554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 66111e0cbeSNick Kledzik try 67111e0cbeSNick Kledzik { 68940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 69111e0cbeSNick Kledzik p = ::operator new(size); 7054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 71111e0cbeSNick Kledzik } 72111e0cbeSNick Kledzik catch (...) 73111e0cbeSNick Kledzik { 74111e0cbeSNick Kledzik } 75940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 76111e0cbeSNick Kledzik return p; 77111e0cbeSNick Kledzik } 78111e0cbeSNick Kledzik 79111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 80111e0cbeSNick Kledzik void* 81fafca58cSHoward Hinnant operator new[](size_t size) 8293a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 8393a16c0fSHoward Hinnant throw(std::bad_alloc) 8493a16c0fSHoward Hinnant #endif 85111e0cbeSNick Kledzik { 86111e0cbeSNick Kledzik return ::operator new(size); 87111e0cbeSNick Kledzik } 88111e0cbeSNick Kledzik 89111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 90111e0cbeSNick Kledzik void* 91c206366fSHoward Hinnant operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT 92111e0cbeSNick Kledzik { 93111e0cbeSNick Kledzik void* p = 0; 9454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 95111e0cbeSNick Kledzik try 96111e0cbeSNick Kledzik { 97940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 98111e0cbeSNick Kledzik p = ::operator new[](size); 9954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 100111e0cbeSNick Kledzik } 101111e0cbeSNick Kledzik catch (...) 102111e0cbeSNick Kledzik { 103111e0cbeSNick Kledzik } 104940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 105111e0cbeSNick Kledzik return p; 106111e0cbeSNick Kledzik } 107111e0cbeSNick Kledzik 108111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 109111e0cbeSNick Kledzik void 110fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 111111e0cbeSNick Kledzik { 112111e0cbeSNick Kledzik if (ptr) 113111e0cbeSNick Kledzik ::free(ptr); 114111e0cbeSNick Kledzik } 115111e0cbeSNick Kledzik 116111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 117111e0cbeSNick Kledzik void 118fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 119111e0cbeSNick Kledzik { 120111e0cbeSNick Kledzik ::operator delete(ptr); 121111e0cbeSNick Kledzik } 122111e0cbeSNick Kledzik 123111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 124111e0cbeSNick Kledzik void 125fafca58cSHoward Hinnant operator delete[] (void* ptr) _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, const std::nothrow_t&) _NOEXCEPT 133111e0cbeSNick Kledzik { 134111e0cbeSNick Kledzik ::operator delete[](ptr); 135111e0cbeSNick Kledzik } 136111e0cbeSNick Kledzik 137*e1da544eSDavid Chisnall #endif // !_LIBCPPABI_VERSION && !LIBCXXRT 1382c9c6a57SHoward Hinnant 1393e519524SHoward Hinnant namespace std 1403e519524SHoward Hinnant { 1413e519524SHoward Hinnant 14262713dacSNick Kledzik const nothrow_t nothrow = {}; 14362713dacSNick Kledzik 1442c9c6a57SHoward Hinnant #ifndef _LIBCPPABI_VERSION 1452c9c6a57SHoward Hinnant 14662713dacSNick Kledzik new_handler 147fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 14862713dacSNick Kledzik { 1491596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1501596c453SHoward Hinnant } 1511596c453SHoward Hinnant 1521596c453SHoward Hinnant new_handler 153fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1541596c453SHoward Hinnant { 1551596c453SHoward Hinnant return __sync_fetch_and_add(&__new_handler, (new_handler)0); 15662713dacSNick Kledzik } 15762713dacSNick Kledzik 158*e1da544eSDavid Chisnall #ifndef LIBCXXRT 159*e1da544eSDavid Chisnall 160fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 161111e0cbeSNick Kledzik { 162111e0cbeSNick Kledzik } 163111e0cbeSNick Kledzik 164fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 165111e0cbeSNick Kledzik { 166111e0cbeSNick Kledzik } 167111e0cbeSNick Kledzik 168111e0cbeSNick Kledzik const char* 169fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 170111e0cbeSNick Kledzik { 171111e0cbeSNick Kledzik return "std::bad_alloc"; 172111e0cbeSNick Kledzik } 173111e0cbeSNick Kledzik 174fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 175111e0cbeSNick Kledzik { 176111e0cbeSNick Kledzik } 177111e0cbeSNick Kledzik 178fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 1793e519524SHoward Hinnant { 1803e519524SHoward Hinnant } 1813e519524SHoward Hinnant 1823e519524SHoward Hinnant const char* 183fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT 1843e519524SHoward Hinnant { 1853e519524SHoward Hinnant return "bad_array_new_length"; 1863e519524SHoward Hinnant } 1873e519524SHoward Hinnant 1882c9c6a57SHoward Hinnant #endif 189*e1da544eSDavid Chisnall #endif //LIBCXXRT 1902c9c6a57SHoward Hinnant 1913e519524SHoward Hinnant void 1923e519524SHoward Hinnant __throw_bad_alloc() 1933e519524SHoward Hinnant { 19454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 1953e519524SHoward Hinnant throw bad_alloc(); 19654b409fdSHoward Hinnant #endif 1973e519524SHoward Hinnant } 1983e519524SHoward Hinnant 1993e519524SHoward Hinnant } // std 200