Exception handling stuctures, and thread-local variables for exception handling

llvm-svn: 135586
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 1df50ca6a2f60b3b60ca6adc1ab98f33184c3597
diff --git a/src/cxa_exception.hpp b/src/cxa_exception.hpp
new file mode 100644
index 0000000..eda9951
--- /dev/null
+++ b/src/cxa_exception.hpp
@@ -0,0 +1,95 @@
+#include <exception> // for std::unexpected_handler and std::terminate_handler
+#include <cxxabi.h>
+#include "unwind.h"
+
+namespace __cxxabiv1 {
+
+    struct __cxa_exception { 
+#if __LP64__
+    // This is a new field to support C++ 0x exception_ptr.
+    // For binary compatibility it is at the start of this
+    // struct which is prepended to the object thrown in
+    // __cxa_allocate_exception.
+        size_t referenceCount;
+#endif
+    
+    //  Manage the exception object itself.
+        std::type_info *exceptionType;
+        void (*exceptionDestructor)(void *); 
+        std::unexpected_handler unexpectedHandler;
+        std::terminate_handler  terminateHandler;
+        
+         __cxa_exception *nextException;
+        
+         int handlerCount;
+    
+#ifdef __ARM_EABI_UNWINDER__
+         __cxa_exception* nextPropagatingException;
+         int propagationCount;
+#else
+         int handlerSwitchValue;
+         const unsigned char *actionRecord;
+         const unsigned char *languageSpecificData;
+         void *catchTemp;
+         void *adjustedPtr;
+#endif
+
+#if !__LP64__
+    // This is a new field to support C++ 0x exception_ptr.
+    // For binary compatibility it is placed where the compiler
+    // previously adding padded to 64-bit align unwindHeader.
+        size_t referenceCount;
+#endif
+    
+        _Unwind_Exception unwindHeader;
+        };
+    
+    struct __cxa_dependent_exception {
+#if __LP64__
+        void* primaryException;
+#endif
+    
+    // Unused dummy data (should be set to null)
+        std::type_info *exceptionType;
+        void (*exceptionDestructor)(void *); 
+    
+        std::unexpected_handler unexpectedHandler;
+        std::terminate_handler terminateHandler;
+    
+        __cxa_exception *nextException;
+    
+        int handlerCount;
+    
+#ifdef __ARM_EABI_UNWINDER__
+        __cxa_exception* nextPropagatingException;
+        int propagationCount;
+#else
+        int handlerSwitchValue;
+        const unsigned char *actionRecord;
+        const unsigned char *languageSpecificData;
+        void * catchTemp;
+        void *adjustedPtr;
+#endif
+    
+#if !__LP64__
+        void* primaryException;
+#endif
+    
+        _Unwind_Exception unwindHeader;
+        };
+        
+    struct __cxa_eh_globals {
+        __cxa_exception *   caughtExceptions;
+        unsigned int        uncaughtExceptions;
+#ifdef __ARM_EABI_UNWINDER__
+        __cxa_exception* propagatingExceptions;
+#endif
+    };
+
+    extern "C" __cxa_eh_globals * __cxa_get_globals      () throw();
+    extern "C" __cxa_eh_globals * __cxa_get_globals_fast () throw();
+
+    extern "C" void * __cxa_allocate_dependent_exception () throw();
+    extern "C" void __cxa_free_dependent_exception (void * dependent_exception) throw();
+
+}
\ No newline at end of file