1 //===------------------------- cxa_exception.hpp --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
9 // This file implements the "Exception Handling APIs"
10 // http://mentorembedded.github.io/cxx-abi/abi-eh.html
12 //===----------------------------------------------------------------------===//
14 #ifndef _CXA_EXCEPTION_H
15 #define _CXA_EXCEPTION_H
17 #include <exception> // for std::unexpected_handler and std::terminate_handler
21 namespace __cxxabiv1 {
23 #pragma GCC visibility push(hidden)
25 static const uint64_t kOurExceptionClass = 0x434C4E47432B2B00; // CLNGC++\0
26 static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1
27 static const uint64_t get_vendor_and_language = 0xFFFFFFFFFFFFFF00; // mask for CLNGC++
29 struct __cxa_exception {
30 #if __LP64__ || LIBCXXABI_ARM_EHABI
31 // This is a new field to support C++ 0x exception_ptr.
32 // For binary compatibility it is at the start of this
33 // struct which is prepended to the object thrown in
34 // __cxa_allocate_exception.
35 size_t referenceCount;
38 // Manage the exception object itself.
39 std::type_info *exceptionType;
40 void (*exceptionDestructor)(void *);
41 std::unexpected_handler unexpectedHandler;
42 std::terminate_handler terminateHandler;
44 __cxa_exception *nextException;
48 #if LIBCXXABI_ARM_EHABI
49 __cxa_exception* nextPropagatingException;
52 int handlerSwitchValue;
53 const unsigned char *actionRecord;
54 const unsigned char *languageSpecificData;
59 #if !__LP64__ && !LIBCXXABI_ARM_EHABI
60 // This is a new field to support C++ 0x exception_ptr.
61 // For binary compatibility it is placed where the compiler
62 // previously adding padded to 64-bit align unwindHeader.
63 size_t referenceCount;
66 _Unwind_Exception unwindHeader;
69 // http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html
70 // The layout of this structure MUST match the layout of __cxa_exception, with
71 // primaryException instead of referenceCount.
72 struct __cxa_dependent_exception {
73 #if __LP64__ || LIBCXXABI_ARM_EHABI
74 void* primaryException;
77 std::type_info *exceptionType;
78 void (*exceptionDestructor)(void *);
79 std::unexpected_handler unexpectedHandler;
80 std::terminate_handler terminateHandler;
82 __cxa_exception *nextException;
86 #if LIBCXXABI_ARM_EHABI
87 __cxa_exception* nextPropagatingException;
90 int handlerSwitchValue;
91 const unsigned char *actionRecord;
92 const unsigned char *languageSpecificData;
97 #if !__LP64__ && !LIBCXXABI_ARM_EHABI
98 void* primaryException;
101 _Unwind_Exception unwindHeader;
104 struct __cxa_eh_globals {
105 __cxa_exception * caughtExceptions;
106 unsigned int uncaughtExceptions;
107 #if LIBCXXABI_ARM_EHABI
108 __cxa_exception* propagatingExceptions;
112 #pragma GCC visibility pop
113 #pragma GCC visibility push(default)
115 extern "C" __cxa_eh_globals * __cxa_get_globals ();
116 extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
118 extern "C" void * __cxa_allocate_dependent_exception ();
119 extern "C" void __cxa_free_dependent_exception (void * dependent_exception);
121 #pragma GCC visibility pop
123 } // namespace __cxxabiv1
125 #endif // _CXA_EXCEPTION_H