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> 16111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 17111e0cbeSNick Kledzik // shared libray. The global holding the current new handler is 18111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 19111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 20940e211cSHoward Hinnant #else // __APPLE__ 21111e0cbeSNick Kledzik static std::new_handler __new_handler; 22111e0cbeSNick Kledzik #endif 23111e0cbeSNick Kledzik 24111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 25111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 26111e0cbeSNick Kledzik // that define non-weak copies of the functions. 27111e0cbeSNick Kledzik 28111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 29111e0cbeSNick Kledzik void * 30fafca58cSHoward Hinnant operator new(std::size_t size) 31*93a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 32*93a16c0fSHoward Hinnant throw(std::bad_alloc) 33*93a16c0fSHoward Hinnant #endif 34111e0cbeSNick Kledzik { 35111e0cbeSNick Kledzik if (size == 0) 36111e0cbeSNick Kledzik size = 1; 37111e0cbeSNick Kledzik void* p; 38111e0cbeSNick Kledzik while ((p = ::malloc(size)) == 0) 39111e0cbeSNick Kledzik { 40111e0cbeSNick Kledzik // If malloc fails and there is a new_handler, 41111e0cbeSNick Kledzik // call it to try free up memory. 4275357bcdSHoward Hinnant std::new_handler nh = std::get_new_handler(); 43816cb897SHoward Hinnant if (nh) 44816cb897SHoward Hinnant nh(); 45111e0cbeSNick Kledzik else 4654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 47111e0cbeSNick Kledzik throw std::bad_alloc(); 4854b409fdSHoward Hinnant #else 4954b409fdSHoward Hinnant break; 5054b409fdSHoward Hinnant #endif 51111e0cbeSNick Kledzik } 52111e0cbeSNick Kledzik return p; 53111e0cbeSNick Kledzik } 54111e0cbeSNick Kledzik 55111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 56111e0cbeSNick Kledzik void* 57fafca58cSHoward Hinnant operator new(size_t size, const std::nothrow_t&) _NOEXCEPT 58111e0cbeSNick Kledzik { 59111e0cbeSNick Kledzik void* p = 0; 6054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 61111e0cbeSNick Kledzik try 62111e0cbeSNick Kledzik { 63940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 64111e0cbeSNick Kledzik p = ::operator new(size); 6554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 66111e0cbeSNick Kledzik } 67111e0cbeSNick Kledzik catch (...) 68111e0cbeSNick Kledzik { 69111e0cbeSNick Kledzik } 70940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 71111e0cbeSNick Kledzik return p; 72111e0cbeSNick Kledzik } 73111e0cbeSNick Kledzik 74111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 75111e0cbeSNick Kledzik void* 76fafca58cSHoward Hinnant operator new[](size_t size) 77*93a16c0fSHoward Hinnant #if !__has_feature(cxx_noexcept) 78*93a16c0fSHoward Hinnant throw(std::bad_alloc) 79*93a16c0fSHoward Hinnant #endif 80111e0cbeSNick Kledzik { 81111e0cbeSNick Kledzik return ::operator new(size); 82111e0cbeSNick Kledzik } 83111e0cbeSNick Kledzik 84111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 85111e0cbeSNick Kledzik void* 86fafca58cSHoward Hinnant operator new[](size_t size, const std::nothrow_t& nothrow) _NOEXCEPT 87111e0cbeSNick Kledzik { 88111e0cbeSNick Kledzik void* p = 0; 8954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 90111e0cbeSNick Kledzik try 91111e0cbeSNick Kledzik { 92940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 93111e0cbeSNick Kledzik p = ::operator new[](size); 9454b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 95111e0cbeSNick Kledzik } 96111e0cbeSNick Kledzik catch (...) 97111e0cbeSNick Kledzik { 98111e0cbeSNick Kledzik } 99940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 100111e0cbeSNick Kledzik return p; 101111e0cbeSNick Kledzik } 102111e0cbeSNick Kledzik 103111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 104111e0cbeSNick Kledzik void 105fafca58cSHoward Hinnant operator delete(void* ptr) _NOEXCEPT 106111e0cbeSNick Kledzik { 107111e0cbeSNick Kledzik if (ptr) 108111e0cbeSNick Kledzik ::free(ptr); 109111e0cbeSNick Kledzik } 110111e0cbeSNick Kledzik 111111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 112111e0cbeSNick Kledzik void 113fafca58cSHoward Hinnant operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT 114111e0cbeSNick Kledzik { 115111e0cbeSNick Kledzik ::operator delete(ptr); 116111e0cbeSNick Kledzik } 117111e0cbeSNick Kledzik 118111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 119111e0cbeSNick Kledzik void 120fafca58cSHoward Hinnant operator delete[] (void* ptr) _NOEXCEPT 121111e0cbeSNick Kledzik { 122111e0cbeSNick Kledzik ::operator delete (ptr); 123111e0cbeSNick Kledzik } 124111e0cbeSNick Kledzik 125111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 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 1323e519524SHoward Hinnant namespace std 1333e519524SHoward Hinnant { 1343e519524SHoward Hinnant 13562713dacSNick Kledzik const nothrow_t nothrow = {}; 13662713dacSNick Kledzik 13762713dacSNick Kledzik new_handler 138fafca58cSHoward Hinnant set_new_handler(new_handler handler) _NOEXCEPT 13962713dacSNick Kledzik { 1401596c453SHoward Hinnant return __sync_lock_test_and_set(&__new_handler, handler); 1411596c453SHoward Hinnant } 1421596c453SHoward Hinnant 1431596c453SHoward Hinnant new_handler 144fafca58cSHoward Hinnant get_new_handler() _NOEXCEPT 1451596c453SHoward Hinnant { 1461596c453SHoward Hinnant return __sync_fetch_and_add(&__new_handler, (new_handler)0); 14762713dacSNick Kledzik } 14862713dacSNick Kledzik 149fafca58cSHoward Hinnant bad_alloc::bad_alloc() _NOEXCEPT 150111e0cbeSNick Kledzik { 151111e0cbeSNick Kledzik } 152111e0cbeSNick Kledzik 153fafca58cSHoward Hinnant bad_alloc::~bad_alloc() _NOEXCEPT 154111e0cbeSNick Kledzik { 155111e0cbeSNick Kledzik } 156111e0cbeSNick Kledzik 157111e0cbeSNick Kledzik const char* 158fafca58cSHoward Hinnant bad_alloc::what() const _NOEXCEPT 159111e0cbeSNick Kledzik { 160111e0cbeSNick Kledzik return "std::bad_alloc"; 161111e0cbeSNick Kledzik } 162111e0cbeSNick Kledzik 163fafca58cSHoward Hinnant bad_array_new_length::bad_array_new_length() _NOEXCEPT 164111e0cbeSNick Kledzik { 165111e0cbeSNick Kledzik } 166111e0cbeSNick Kledzik 167fafca58cSHoward Hinnant bad_array_new_length::~bad_array_new_length() _NOEXCEPT 1683e519524SHoward Hinnant { 1693e519524SHoward Hinnant } 1703e519524SHoward Hinnant 1713e519524SHoward Hinnant const char* 172fafca58cSHoward Hinnant bad_array_new_length::what() const _NOEXCEPT 1733e519524SHoward Hinnant { 1743e519524SHoward Hinnant return "bad_array_new_length"; 1753e519524SHoward Hinnant } 1763e519524SHoward Hinnant 1773e519524SHoward Hinnant void 1783e519524SHoward Hinnant __throw_bad_alloc() 1793e519524SHoward Hinnant { 18054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 1813e519524SHoward Hinnant throw bad_alloc(); 18254b409fdSHoward Hinnant #endif 1833e519524SHoward Hinnant } 1843e519524SHoward Hinnant 1853e519524SHoward Hinnant } // std 186