22c4da38f0ab11d75d44650e7ce512943641ee5d
[platform/framework/web/crosswalk.git] / src / third_party / libc++abi / trunk / src / cxa_exception.hpp
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://www.codesourcery.com/public/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 __LP64__
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 #ifdef __ARM_EABI_UNWINDER__
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 !__LP64__
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     
71     struct __cxa_dependent_exception {
72 #if __LP64__
73         void* primaryException;
74 #endif
75     
76         std::type_info *exceptionType;
77         void (*exceptionDestructor)(void *); 
78         std::unexpected_handler unexpectedHandler;
79         std::terminate_handler terminateHandler;
80     
81         __cxa_exception *nextException;
82     
83         int handlerCount;
84     
85 #ifdef __ARM_EABI_UNWINDER__
86         __cxa_exception* nextPropagatingException;
87         int propagationCount;
88 #else
89         int handlerSwitchValue;
90         const unsigned char *actionRecord;
91         const unsigned char *languageSpecificData;
92         void * catchTemp;
93         void *adjustedPtr;
94 #endif
95     
96 #if !__LP64__
97         void* primaryException;
98 #endif
99     
100         _Unwind_Exception unwindHeader;
101         };
102         
103     struct __cxa_eh_globals {
104         __cxa_exception *   caughtExceptions;
105         unsigned int        uncaughtExceptions;
106 #ifdef __ARM_EABI_UNWINDER__
107         __cxa_exception* propagatingExceptions;
108 #endif
109     };
110
111 #pragma GCC visibility pop
112 #pragma GCC visibility push(default)
113
114     extern "C" __cxa_eh_globals * __cxa_get_globals      ();
115     extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
116
117     extern "C" void * __cxa_allocate_dependent_exception ();
118     extern "C" void __cxa_free_dependent_exception (void * dependent_exception);
119
120 #pragma GCC visibility pop
121 }
122
123 #endif  // _CXA_EXCEPTION_H