1 //===------------------------- cxa_exception.hpp --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //
9 //  This file implements the "Exception Handling APIs"
10 //  http://mentorembedded.github.io/cxx-abi/abi-eh.html
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef _CXA_EXCEPTION_H
15 #define _CXA_EXCEPTION_H
16 
17 #include <exception> // for std::unexpected_handler and std::terminate_handler
18 #include <cxxabi.h>
19 #include "unwind.h"
20 
21 namespace __cxxabiv1 {
22 
23 #pragma GCC visibility push(hidden)
24 
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++
28 
29 struct __cxa_exception {
30 #if defined(__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;
36 #endif
37 
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;
43 
44     __cxa_exception *nextException;
45 
46     int handlerCount;
47 
48 #if LIBCXXABI_ARM_EHABI
49     __cxa_exception* nextPropagatingException;
50     int propagationCount;
51 #else
52     int handlerSwitchValue;
53     const unsigned char *actionRecord;
54     const unsigned char *languageSpecificData;
55     void *catchTemp;
56     void *adjustedPtr;
57 #endif
58 
59 #if !defined(__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;
64 #endif
65 
66     _Unwind_Exception unwindHeader;
67 };
68 
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 defined(__LP64__) || LIBCXXABI_ARM_EHABI
74     void* primaryException;
75 #endif
76 
77     std::type_info *exceptionType;
78     void (*exceptionDestructor)(void *);
79     std::unexpected_handler unexpectedHandler;
80     std::terminate_handler terminateHandler;
81 
82     __cxa_exception *nextException;
83 
84     int handlerCount;
85 
86 #if LIBCXXABI_ARM_EHABI
87     __cxa_exception* nextPropagatingException;
88     int propagationCount;
89 #else
90     int handlerSwitchValue;
91     const unsigned char *actionRecord;
92     const unsigned char *languageSpecificData;
93     void * catchTemp;
94     void *adjustedPtr;
95 #endif
96 
97 #if !defined(__LP64__) && !LIBCXXABI_ARM_EHABI
98     void* primaryException;
99 #endif
100 
101     _Unwind_Exception unwindHeader;
102 };
103 
104 struct __cxa_eh_globals {
105     __cxa_exception *   caughtExceptions;
106     unsigned int        uncaughtExceptions;
107 #if LIBCXXABI_ARM_EHABI
108     __cxa_exception* propagatingExceptions;
109 #endif
110 };
111 
112 #pragma GCC visibility pop
113 #pragma GCC visibility push(default)
114 
115 extern "C" __cxa_eh_globals * __cxa_get_globals      ();
116 extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
117 
118 extern "C" void * __cxa_allocate_dependent_exception ();
119 extern "C" void __cxa_free_dependent_exception (void * dependent_exception);
120 
121 #pragma GCC visibility pop
122 
123 }  // namespace __cxxabiv1
124 
125 #endif  // _CXA_EXCEPTION_H
126