add headers and implementation for <new>, <exception>, and <typeinfo>
llvm-svn: 103795
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 111e0cbe5159e1bb23c3beb60e959b656b509eab
diff --git a/src/new.cpp b/src/new.cpp
index 32e0cbd..bc105cc 100644
--- a/src/new.cpp
+++ b/src/new.cpp
@@ -7,11 +7,136 @@
//
//===----------------------------------------------------------------------===//
+#include <stdlib.h>
+#include <cxxabi.h>
+
#include "new"
+
+#if __APPLE__
+ // On Darwin, there are two STL shared libraries and a lower level ABI
+ // shared libray. The global holding the current new handler is
+ // in the ABI library and named __cxa_new_handler.
+ #define __new_handler __cxxabiapple::__cxa_new_handler
+#else
+ static std::new_handler __new_handler;
+#endif
+
+
+// Implement all new and delete operators as weak definitions
+// in this shared library, so that they can be overriden by programs
+// that define non-weak copies of the functions.
+
+
+__attribute__((__weak__, __visibility__("default")))
+void *
+operator new(std::size_t size) throw (std::bad_alloc)
+{
+ if (size == 0)
+ size = 1;
+ void* p;
+ while ((p = ::malloc(size)) == 0)
+ {
+ // If malloc fails and there is a new_handler,
+ // call it to try free up memory.
+ if (__new_handler)
+ __new_handler();
+ else
+ throw std::bad_alloc();
+ }
+ return p;
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void*
+operator new(size_t size, const std::nothrow_t&) throw()
+{
+ void* p = 0;
+ try
+ {
+ p = ::operator new(size);
+ }
+ catch (...)
+ {
+ }
+ return p;
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void*
+operator new[](size_t size) throw (std::bad_alloc)
+{
+ return ::operator new(size);
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void*
+operator new[](size_t size, const std::nothrow_t& nothrow) throw()
+{
+ void* p = 0;
+ try
+ {
+ p = ::operator new[](size);
+ }
+ catch (...)
+ {
+ }
+ return p;
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void
+operator delete(void* ptr) throw ()
+{
+ if (ptr)
+ ::free(ptr);
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void
+operator delete(void* ptr, const std::nothrow_t&) throw ()
+{
+ ::operator delete(ptr);
+}
+
+
+__attribute__((__weak__, __visibility__("default")))
+void
+operator delete[] (void* ptr) throw ()
+{
+ ::operator delete (ptr);
+}
+
+__attribute__((__weak__, __visibility__("default")))
+void
+operator delete[] (void* ptr, const std::nothrow_t&) throw ()
+{
+ ::operator delete[](ptr);
+}
+
+
namespace std
{
+bad_alloc::bad_alloc() throw()
+{
+}
+
+bad_alloc::~bad_alloc() throw()
+{
+}
+
+const char*
+bad_alloc::what() const throw()
+{
+ return "std::bad_alloc";
+}
+
+
+bad_array_new_length::bad_array_new_length() throw()
+{
+}
+
bad_array_new_length::~bad_array_new_length() throw()
{
}
@@ -22,6 +147,8 @@
return "bad_array_new_length";
}
+
+
void
__throw_bad_alloc()
{