13e519524SHoward Hinnant //===--------------------------- new.cpp ----------------------------------===// 23e519524SHoward Hinnant // 35b08a8a4SHoward Hinnant // The LLVM Compiler Infrastructure 43e519524SHoward Hinnant // 53e519524SHoward Hinnant // This file is distributed under the University of Illinois Open Source 63e519524SHoward Hinnant // License. See LICENSE.TXT for details. 73e519524SHoward Hinnant // 83e519524SHoward Hinnant //===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 10111e0cbeSNick Kledzik #include <stdlib.h> 11111e0cbeSNick Kledzik #include <cxxabi.h> 12111e0cbeSNick Kledzik 133e519524SHoward Hinnant #include "new" 143e519524SHoward Hinnant 15111e0cbeSNick Kledzik 16111e0cbeSNick Kledzik #if __APPLE__ 17111e0cbeSNick Kledzik // On Darwin, there are two STL shared libraries and a lower level ABI 18111e0cbeSNick Kledzik // shared libray. The global holding the current new handler is 19111e0cbeSNick Kledzik // in the ABI library and named __cxa_new_handler. 20111e0cbeSNick Kledzik #define __new_handler __cxxabiapple::__cxa_new_handler 21111e0cbeSNick Kledzik #else 22111e0cbeSNick Kledzik static std::new_handler __new_handler; 23111e0cbeSNick Kledzik #endif 24111e0cbeSNick Kledzik 25111e0cbeSNick Kledzik 26111e0cbeSNick Kledzik // Implement all new and delete operators as weak definitions 27111e0cbeSNick Kledzik // in this shared library, so that they can be overriden by programs 28111e0cbeSNick Kledzik // that define non-weak copies of the functions. 29111e0cbeSNick Kledzik 30111e0cbeSNick Kledzik 31111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 32111e0cbeSNick Kledzik void * 33111e0cbeSNick Kledzik operator new(std::size_t size) throw (std::bad_alloc) 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. 42111e0cbeSNick Kledzik if (__new_handler) 43111e0cbeSNick Kledzik __new_handler(); 44111e0cbeSNick Kledzik else 45111e0cbeSNick Kledzik throw std::bad_alloc(); 46111e0cbeSNick Kledzik } 47111e0cbeSNick Kledzik return p; 48111e0cbeSNick Kledzik } 49111e0cbeSNick Kledzik 50111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 51111e0cbeSNick Kledzik void* 52111e0cbeSNick Kledzik operator new(size_t size, const std::nothrow_t&) throw() 53111e0cbeSNick Kledzik { 54111e0cbeSNick Kledzik void* p = 0; 55111e0cbeSNick Kledzik try 56111e0cbeSNick Kledzik { 57111e0cbeSNick Kledzik p = ::operator new(size); 58111e0cbeSNick Kledzik } 59111e0cbeSNick Kledzik catch (...) 60111e0cbeSNick Kledzik { 61111e0cbeSNick Kledzik } 62111e0cbeSNick Kledzik return p; 63111e0cbeSNick Kledzik } 64111e0cbeSNick Kledzik 65111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 66111e0cbeSNick Kledzik void* 67111e0cbeSNick Kledzik operator new[](size_t size) throw (std::bad_alloc) 68111e0cbeSNick Kledzik { 69111e0cbeSNick Kledzik return ::operator new(size); 70111e0cbeSNick Kledzik } 71111e0cbeSNick Kledzik 72111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 73111e0cbeSNick Kledzik void* 74111e0cbeSNick Kledzik operator new[](size_t size, const std::nothrow_t& nothrow) throw() 75111e0cbeSNick Kledzik { 76111e0cbeSNick Kledzik void* p = 0; 77111e0cbeSNick Kledzik try 78111e0cbeSNick Kledzik { 79111e0cbeSNick Kledzik p = ::operator new[](size); 80111e0cbeSNick Kledzik } 81111e0cbeSNick Kledzik catch (...) 82111e0cbeSNick Kledzik { 83111e0cbeSNick Kledzik } 84111e0cbeSNick Kledzik return p; 85111e0cbeSNick Kledzik } 86111e0cbeSNick Kledzik 87111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 88111e0cbeSNick Kledzik void 89111e0cbeSNick Kledzik operator delete(void* ptr) throw () 90111e0cbeSNick Kledzik { 91111e0cbeSNick Kledzik if (ptr) 92111e0cbeSNick Kledzik ::free(ptr); 93111e0cbeSNick Kledzik } 94111e0cbeSNick Kledzik 95111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 96111e0cbeSNick Kledzik void 97111e0cbeSNick Kledzik operator delete(void* ptr, const std::nothrow_t&) throw () 98111e0cbeSNick Kledzik { 99111e0cbeSNick Kledzik ::operator delete(ptr); 100111e0cbeSNick Kledzik } 101111e0cbeSNick Kledzik 102111e0cbeSNick Kledzik 103111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 104111e0cbeSNick Kledzik void 105111e0cbeSNick Kledzik operator delete[] (void* ptr) throw () 106111e0cbeSNick Kledzik { 107111e0cbeSNick Kledzik ::operator delete (ptr); 108111e0cbeSNick Kledzik } 109111e0cbeSNick Kledzik 110111e0cbeSNick Kledzik __attribute__((__weak__, __visibility__("default"))) 111111e0cbeSNick Kledzik void 112111e0cbeSNick Kledzik operator delete[] (void* ptr, const std::nothrow_t&) throw () 113111e0cbeSNick Kledzik { 114111e0cbeSNick Kledzik ::operator delete[](ptr); 115111e0cbeSNick Kledzik } 116111e0cbeSNick Kledzik 117111e0cbeSNick Kledzik 1183e519524SHoward Hinnant namespace std 1193e519524SHoward Hinnant { 1203e519524SHoward Hinnant 121*62713dacSNick Kledzik const nothrow_t nothrow = {}; 122*62713dacSNick Kledzik 123*62713dacSNick Kledzik new_handler 124*62713dacSNick Kledzik set_new_handler(new_handler handler) throw() 125*62713dacSNick Kledzik { 126*62713dacSNick Kledzik new_handler r = __new_handler; 127*62713dacSNick Kledzik __new_handler = handler; 128*62713dacSNick Kledzik return r; 129*62713dacSNick Kledzik } 130*62713dacSNick Kledzik 131111e0cbeSNick Kledzik bad_alloc::bad_alloc() throw() 132111e0cbeSNick Kledzik { 133111e0cbeSNick Kledzik } 134111e0cbeSNick Kledzik 135111e0cbeSNick Kledzik bad_alloc::~bad_alloc() throw() 136111e0cbeSNick Kledzik { 137111e0cbeSNick Kledzik } 138111e0cbeSNick Kledzik 139111e0cbeSNick Kledzik const char* 140111e0cbeSNick Kledzik bad_alloc::what() const throw() 141111e0cbeSNick Kledzik { 142111e0cbeSNick Kledzik return "std::bad_alloc"; 143111e0cbeSNick Kledzik } 144111e0cbeSNick Kledzik 145111e0cbeSNick Kledzik 146111e0cbeSNick Kledzik bad_array_new_length::bad_array_new_length() throw() 147111e0cbeSNick Kledzik { 148111e0cbeSNick Kledzik } 149111e0cbeSNick Kledzik 1503e519524SHoward Hinnant bad_array_new_length::~bad_array_new_length() throw() 1513e519524SHoward Hinnant { 1523e519524SHoward Hinnant } 1533e519524SHoward Hinnant 1543e519524SHoward Hinnant const char* 1553e519524SHoward Hinnant bad_array_new_length::what() const throw() 1563e519524SHoward Hinnant { 1573e519524SHoward Hinnant return "bad_array_new_length"; 1583e519524SHoward Hinnant } 1593e519524SHoward Hinnant 160111e0cbeSNick Kledzik 161111e0cbeSNick Kledzik 1623e519524SHoward Hinnant void 1633e519524SHoward Hinnant __throw_bad_alloc() 1643e519524SHoward Hinnant { 1653e519524SHoward Hinnant throw bad_alloc(); 1663e519524SHoward Hinnant } 1673e519524SHoward Hinnant 1683e519524SHoward Hinnant } // std 169