blob: 7c78a721ef708294aa97af84cc7d44afc21f1031 [file] [log] [blame]
Howard Hinnant987afbe2011-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"
Jonathan Roelofsc5f7e6f2014-02-12 04:49:09 +000010// http://mentorembedded.github.io/cxx-abi/abi-eh.html
Howard Hinnant987afbe2011-12-06 18:01:47 +000011//
12//===----------------------------------------------------------------------===//
13
Howard Hinnant4ac72dd2012-03-19 16:20:34 +000014#ifndef _CXA_EXCEPTION_H
15#define _CXA_EXCEPTION_H
16
Marshall Clow1df50ca2011-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 Hinnanteaa65af2012-02-02 20:47:28 +000023#pragma GCC visibility push(hidden)
24
Howard Hinnant6830b2a2012-01-24 18:15:20 +000025static const uint64_t kOurExceptionClass = 0x434C4E47432B2B00; // CLNGC++\0
26static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1
Howard Hinnant8aa78512012-02-01 18:15:15 +000027static const uint64_t get_vendor_and_language = 0xFFFFFFFFFFFFFF00; // mask for CLNGC++
Howard Hinnant6830b2a2012-01-24 18:15:20 +000028
Marshall Clow1df50ca2011-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
Mark Seaborn66471112013-11-30 17:37:21 +000044 __cxa_exception *nextException;
Marshall Clow1df50ca2011-07-20 14:53:53 +000045
Mark Seaborn66471112013-11-30 17:37:21 +000046 int handlerCount;
Marshall Clow1df50ca2011-07-20 14:53:53 +000047
48#ifdef __ARM_EABI_UNWINDER__
Mark Seaborn66471112013-11-30 17:37:21 +000049 __cxa_exception* nextPropagatingException;
50 int propagationCount;
Marshall Clow1df50ca2011-07-20 14:53:53 +000051#else
Mark Seaborn66471112013-11-30 17:37:21 +000052 int handlerSwitchValue;
53 const unsigned char *actionRecord;
54 const unsigned char *languageSpecificData;
55 void *catchTemp;
56 void *adjustedPtr;
Marshall Clow1df50ca2011-07-20 14:53:53 +000057#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 Hinnant6ccae152011-12-08 19:35:18 +000068
69// http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html
Marshall Clow1df50ca2011-07-20 14:53:53 +000070
71 struct __cxa_dependent_exception {
72#if __LP64__
73 void* primaryException;
74#endif
75
Marshall Clow1df50ca2011-07-20 14:53:53 +000076 std::type_info *exceptionType;
77 void (*exceptionDestructor)(void *);
Marshall Clow1df50ca2011-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 Hinnanteaa65af2012-02-02 20:47:28 +0000111#pragma GCC visibility pop
112#pragma GCC visibility push(default)
113
Howard Hinnant47cb85482012-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 Clow1df50ca2011-07-20 14:53:53 +0000116
Howard Hinnant47cb85482012-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 Clow1df50ca2011-07-20 14:53:53 +0000119
Howard Hinnanteaa65af2012-02-02 20:47:28 +0000120#pragma GCC visibility pop
Dave Zarzycki3cd25392012-02-22 05:25:00 +0000121}
Howard Hinnant4ac72dd2012-03-19 16:20:34 +0000122
123#endif // _CXA_EXCEPTION_H