blob: 03b7a841698ef190153a3300bf88e63c86ec244a [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
Logan Chienaacc1c72014-04-12 11:56:41 +000029struct __cxa_exception {
Marshall Clow1df50ca2011-07-20 14:53:53 +000030#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.
Logan Chienaacc1c72014-04-12 11:56:41 +000035 size_t referenceCount;
Marshall Clow1df50ca2011-07-20 14:53:53 +000036#endif
37
38 // Manage the exception object itself.
Logan Chienaacc1c72014-04-12 11:56:41 +000039 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
Marshall Clow1df50ca2011-07-20 14:53:53 +000048#ifdef __ARM_EABI_UNWINDER__
Logan Chienaacc1c72014-04-12 11:56:41 +000049 __cxa_exception* nextPropagatingException;
50 int propagationCount;
Marshall Clow1df50ca2011-07-20 14:53:53 +000051#else
Logan Chienaacc1c72014-04-12 11:56:41 +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.
Logan Chienaacc1c72014-04-12 11:56:41 +000063 size_t referenceCount;
Marshall Clow1df50ca2011-07-20 14:53:53 +000064#endif
Logan Chienaacc1c72014-04-12 11:56:41 +000065
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
Logan Chienaacc1c72014-04-12 11:56:41 +000071struct __cxa_dependent_exception {
Marshall Clow1df50ca2011-07-20 14:53:53 +000072#if __LP64__
Logan Chienaacc1c72014-04-12 11:56:41 +000073 void* primaryException;
Marshall Clow1df50ca2011-07-20 14:53:53 +000074#endif
75
Logan Chienaacc1c72014-04-12 11:56:41 +000076 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;
Marshall Clow1df50ca2011-07-20 14:53:53 +000084
85#ifdef __ARM_EABI_UNWINDER__
Logan Chienaacc1c72014-04-12 11:56:41 +000086 __cxa_exception* nextPropagatingException;
87 int propagationCount;
Marshall Clow1df50ca2011-07-20 14:53:53 +000088#else
Logan Chienaacc1c72014-04-12 11:56:41 +000089 int handlerSwitchValue;
90 const unsigned char *actionRecord;
91 const unsigned char *languageSpecificData;
92 void * catchTemp;
93 void *adjustedPtr;
Marshall Clow1df50ca2011-07-20 14:53:53 +000094#endif
95
96#if !__LP64__
Logan Chienaacc1c72014-04-12 11:56:41 +000097 void* primaryException;
Marshall Clow1df50ca2011-07-20 14:53:53 +000098#endif
Logan Chienaacc1c72014-04-12 11:56:41 +000099
100 _Unwind_Exception unwindHeader;
101};
102
103struct __cxa_eh_globals {
104 __cxa_exception * caughtExceptions;
105 unsigned int uncaughtExceptions;
Marshall Clow1df50ca2011-07-20 14:53:53 +0000106#ifdef __ARM_EABI_UNWINDER__
Logan Chienaacc1c72014-04-12 11:56:41 +0000107 __cxa_exception* propagatingExceptions;
Marshall Clow1df50ca2011-07-20 14:53:53 +0000108#endif
Logan Chienaacc1c72014-04-12 11:56:41 +0000109};
Marshall Clow1df50ca2011-07-20 14:53:53 +0000110
Howard Hinnanteaa65af2012-02-02 20:47:28 +0000111#pragma GCC visibility pop
112#pragma GCC visibility push(default)
113
Logan Chienaacc1c72014-04-12 11:56:41 +0000114extern "C" __cxa_eh_globals * __cxa_get_globals ();
115extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
Marshall Clow1df50ca2011-07-20 14:53:53 +0000116
Logan Chienaacc1c72014-04-12 11:56:41 +0000117extern "C" void * __cxa_allocate_dependent_exception ();
118extern "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
Logan Chienaacc1c72014-04-12 11:56:41 +0000121
122} // namespace __cxxabiv1
Howard Hinnant4ac72dd2012-03-19 16:20:34 +0000123
124#endif // _CXA_EXCEPTION_H