blob: 66f05c45f873600c1c516379e311eade73256e81 [file] [log] [blame]
Howard Hinnantb9f2cc82011-12-06 18:01:47 +00001//===------------------------- 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
Howard Hinnant0f80bb72012-03-19 16:20:34 +000014#ifndef _CXA_EXCEPTION_H
15#define _CXA_EXCEPTION_H
16
Marshall Clow61b898e2011-07-20 14:53:53 +000017#include <exception> // for std::unexpected_handler and std::terminate_handler
18#include <cxxabi.h>
19#include "unwind.h"
20
21namespace __cxxabiv1 {
22
Howard Hinnant02406852012-02-02 20:47:28 +000023#pragma GCC visibility push(hidden)
24
Howard Hinnant2a70c102012-01-24 18:15:20 +000025static const uint64_t kOurExceptionClass = 0x434C4E47432B2B00; // CLNGC++\0
26static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1
Howard Hinnant7ab185e2012-02-01 18:15:15 +000027static const uint64_t get_vendor_and_language = 0xFFFFFFFFFFFFFF00; // mask for CLNGC++
Howard Hinnant2a70c102012-01-24 18:15:20 +000028
Marshall Clow61b898e2011-07-20 14:53:53 +000029 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 };
Howard Hinnant6eb54ad2011-12-08 19:35:18 +000068
69// http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html
Marshall Clow61b898e2011-07-20 14:53:53 +000070
71 struct __cxa_dependent_exception {
72#if __LP64__
73 void* primaryException;
74#endif
75
Marshall Clow61b898e2011-07-20 14:53:53 +000076 std::type_info *exceptionType;
77 void (*exceptionDestructor)(void *);
Marshall Clow61b898e2011-07-20 14:53:53 +000078 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
Howard Hinnant02406852012-02-02 20:47:28 +0000111#pragma GCC visibility pop
112#pragma GCC visibility push(default)
113
Howard Hinnant7da9b962012-01-30 16:07:00 +0000114 extern "C" __cxa_eh_globals * __cxa_get_globals ();
115 extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
Marshall Clow61b898e2011-07-20 14:53:53 +0000116
Howard Hinnant7da9b962012-01-30 16:07:00 +0000117 extern "C" void * __cxa_allocate_dependent_exception ();
118 extern "C" void __cxa_free_dependent_exception (void * dependent_exception);
Marshall Clow61b898e2011-07-20 14:53:53 +0000119
Howard Hinnant02406852012-02-02 20:47:28 +0000120#pragma GCC visibility pop
Dave Zarzycki74ecc632012-02-22 05:25:00 +0000121}
Howard Hinnant0f80bb72012-03-19 16:20:34 +0000122
123#endif // _CXA_EXCEPTION_H