blob: 55e70ad0e763e07db7d5d22221ed119d0083706a [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001//===--------------------------- new.cpp ----------------------------------===//
2//
Howard Hinnantc566dc32010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00004//
Howard Hinnantee11c312010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
Howard Hinnant155c2af2010-05-24 17:49:41 +000010#include <stdlib.h>
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000011
Howard Hinnantc51e1022010-05-11 19:42:16 +000012#include "new"
13
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000014#if __APPLE__
Howard Hinnantffb308e2010-08-22 00:03:27 +000015 #include <cxxabi.h>
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000016 // On Darwin, there are two STL shared libraries and a lower level ABI
Howard Hinnant34468d42010-08-22 13:53:14 +000017 // shared libray. The global holding the current new handler is
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000018 // in the ABI library and named __cxa_new_handler.
19 #define __new_handler __cxxabiapple::__cxa_new_handler
Howard Hinnantffb308e2010-08-22 00:03:27 +000020#else // __APPLE__
Howard Hinnant34468d42010-08-22 13:53:14 +000021 static std::new_handler __new_handler;
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000022#endif
23
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000024// Implement all new and delete operators as weak definitions
25// in this shared library, so that they can be overriden by programs
26// that define non-weak copies of the functions.
27
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000028__attribute__((__weak__, __visibility__("default")))
29void *
30operator new(std::size_t size) throw (std::bad_alloc)
31{
32 if (size == 0)
33 size = 1;
34 void* p;
35 while ((p = ::malloc(size)) == 0)
36 {
Howard Hinnant34468d42010-08-22 13:53:14 +000037 // If malloc fails and there is a new_handler,
38 // call it to try free up memory.
Howard Hinnant8c65b452010-12-04 19:56:43 +000039 std::new_handler nh = std::get_new_handler();
Howard Hinnantf64dfce2010-12-04 19:54:11 +000040 if (nh)
41 nh();
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000042 else
Howard Hinnant72f73582010-08-11 17:04:31 +000043#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000044 throw std::bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +000045#else
46 break;
47#endif
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000048 }
49 return p;
50}
51
52__attribute__((__weak__, __visibility__("default")))
53void*
54operator new(size_t size, const std::nothrow_t&) throw()
55{
56 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000057#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000058 try
59 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000060#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000061 p = ::operator new(size);
Howard Hinnant72f73582010-08-11 17:04:31 +000062#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000063 }
64 catch (...)
65 {
66 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000067#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000068 return p;
69}
70
71__attribute__((__weak__, __visibility__("default")))
72void*
73operator new[](size_t size) throw (std::bad_alloc)
74{
75 return ::operator new(size);
76}
77
78__attribute__((__weak__, __visibility__("default")))
79void*
80operator new[](size_t size, const std::nothrow_t& nothrow) throw()
81{
82 void* p = 0;
Howard Hinnant72f73582010-08-11 17:04:31 +000083#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000084 try
85 {
Howard Hinnantffb308e2010-08-22 00:03:27 +000086#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000087 p = ::operator new[](size);
Howard Hinnant72f73582010-08-11 17:04:31 +000088#ifndef _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000089 }
90 catch (...)
91 {
92 }
Howard Hinnantffb308e2010-08-22 00:03:27 +000093#endif // _LIBCPP_NO_EXCEPTIONS
Nick Kledzikd1a61bb2010-05-14 20:19:37 +000094 return p;
95}
96
97__attribute__((__weak__, __visibility__("default")))
98void
99operator delete(void* ptr) throw ()
100{
101 if (ptr)
102 ::free(ptr);
103}
104
105__attribute__((__weak__, __visibility__("default")))
106void
107operator delete(void* ptr, const std::nothrow_t&) throw ()
108{
109 ::operator delete(ptr);
110}
111
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000112__attribute__((__weak__, __visibility__("default")))
113void
114operator delete[] (void* ptr) throw ()
115{
116 ::operator delete (ptr);
117}
118
119__attribute__((__weak__, __visibility__("default")))
120void
121operator delete[] (void* ptr, const std::nothrow_t&) throw ()
122{
123 ::operator delete[](ptr);
124}
125
Howard Hinnantc51e1022010-05-11 19:42:16 +0000126namespace std
127{
128
Nick Kledzik09163cc2010-05-18 22:17:13 +0000129const nothrow_t nothrow = {};
130
131new_handler
132set_new_handler(new_handler handler) throw()
133{
Howard Hinnante65e8e32010-12-02 16:45:21 +0000134 return __sync_lock_test_and_set(&__new_handler, handler);
135}
136
137new_handler
138get_new_handler() throw()
139{
140 return __sync_fetch_and_add(&__new_handler, (new_handler)0);
Nick Kledzik09163cc2010-05-18 22:17:13 +0000141}
142
Howard Hinnantffb308e2010-08-22 00:03:27 +0000143bad_alloc::bad_alloc() throw()
144{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000145}
146
Howard Hinnantffb308e2010-08-22 00:03:27 +0000147bad_alloc::~bad_alloc() throw()
148{
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000149}
150
Howard Hinnantffb308e2010-08-22 00:03:27 +0000151const char*
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000152bad_alloc::what() const throw()
153{
154 return "std::bad_alloc";
155}
156
Nick Kledzikd1a61bb2010-05-14 20:19:37 +0000157bad_array_new_length::bad_array_new_length() throw()
158{
159}
160
Howard Hinnantc51e1022010-05-11 19:42:16 +0000161bad_array_new_length::~bad_array_new_length() throw()
162{
163}
164
165const char*
166bad_array_new_length::what() const throw()
167{
168 return "bad_array_new_length";
169}
170
Howard Hinnantc51e1022010-05-11 19:42:16 +0000171void
172__throw_bad_alloc()
173{
Howard Hinnant72f73582010-08-11 17:04:31 +0000174#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +0000175 throw bad_alloc();
Howard Hinnant72f73582010-08-11 17:04:31 +0000176#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000177}
178
179} // std