Chameleon

Chameleon Svn Source Tree

Root/branches/xZenu/src/modules/uClibcxx/include/unwind-cxx.h

Source at commit 1406 created 12 years 10 months ago.
By meklort, Revert drivers.c so that kexts are only loaded when OSBundleRequired is set and that value is not safe mode. Added some comments about it too.
1// -*- C++ -*- Exception handling and frame unwind runtime interface routines.
2// Copyright (C) 2001 Free Software Foundation, Inc.
3//
4// This file is part of GCC.
5//
6// GCC is free software; you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation; either version 2, or (at your option)
9// any later version.
10//
11// GCC is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with GCC; see the file COPYING. If not, write to
18// the Free Software Foundation, 59 Temple Place - Suite 330,
19// Boston, MA 02111-1307, USA.
20
21// As a special exception, you may use this file as part of a free software
22// library without restriction. Specifically, if other files instantiate
23// templates or use macros or inline functions from this file, or you compile
24// this file and link it with other files to produce an executable, this
25// file does not by itself cause the resulting executable to be covered by
26// the GNU General Public License. This exception does not however
27// invalidate any other reasons why the executable file might be covered by
28// the GNU General Public License.
29
30// This is derived from the C++ ABI for IA-64. Where we diverge
31// for cross-architecture compatibility are noted with "@@@".
32
33#ifndef _UNWIND_CXX_H
34#define _UNWIND_CXX_H 1
35
36// Level 2: C++ ABI
37
38#include <typeinfo>
39#include <exception>
40#include <cstddef>
41#include <unwind.h>
42
43#pragma GCC visibility push(default)
44
45namespace __cxxabiv1
46{
47
48#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
49
50// A C++ exception object consists of a header, which is a wrapper around
51// an unwind object header with additional C++ specific information,
52// followed by the exception object itself.
53
54struct __cxa_exception
55{
56 // Manage the exception object itself.
57 std::type_info *exceptionType;
58 void (*exceptionDestructor)(void *);
59
60 // The C++ standard has entertaining rules wrt calling set_terminate
61 // and set_unexpected in the middle of the exception cleanup process.
62 std::unexpected_handler unexpectedHandler;
63 std::terminate_handler terminateHandler;
64
65 // The caught exception stack threads through here.
66 __cxa_exception *nextException;
67
68 // How many nested handlers have caught this exception. A negated
69 // value is a signal that this object has been rethrown.
70 int handlerCount;
71
72 // Cache parsed handler data from the personality routine Phase 1
73 // for Phase 2 and __cxa_call_unexpected.
74 int handlerSwitchValue;
75 const unsigned char *actionRecord;
76 const unsigned char *languageSpecificData;
77 _Unwind_Ptr catchTemp;
78 void *adjustedPtr;
79
80 // The generic exception header. Must be last.
81 _Unwind_Exception unwindHeader;
82};
83
84// Each thread in a C++ program has access to a __cxa_eh_globals object.
85struct __cxa_eh_globals
86{
87 __cxa_exception *caughtExceptions;
88 unsigned int uncaughtExceptions;
89};
90
91
92// The __cxa_eh_globals for the current thread can be obtained by using
93// either of the following functions. The "fast" version assumes at least
94// one prior call of __cxa_get_globals has been made from the current
95// thread, so no initialization is necessary.
96extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
97extern "C" __cxa_eh_globals *__cxa_get_globals_fast () throw();
98#endif
99
100#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
101// Allocate memory for the exception plus the thown object.
102extern "C" void *__cxa_allocate_exception(std::size_t thrown_size) throw();
103
104// Free the space allocated for the exception.
105extern "C" void __cxa_free_exception(void *thrown_exception) throw();
106
107// Throw the exception.
108extern "C" void __cxa_throw (void *thrown_exception,
109 std::type_info *tinfo,
110 void (*dest) (void *))
111 __attribute__((noreturn));
112
113// Used to implement exception handlers.
114extern "C" void *__cxa_begin_catch (void *) throw();
115extern "C" void __cxa_end_catch ();
116extern "C" void __cxa_rethrow () __attribute__((noreturn));
117#endif
118
119// These facilitate code generation for recurring situations.
120extern "C" void __cxa_bad_cast ();
121extern "C" void __cxa_bad_typeid ();
122
123// @@@ These are not directly specified by the IA-64 C++ ABI.
124
125// Handles re-checking the exception specification if unexpectedHandler
126// throws, and if bad_exception needs to be thrown. Called from the
127// compiler.
128extern "C" void __cxa_call_unexpected (void *) __attribute__((noreturn));
129
130// Invokes given handler, dying appropriately if the user handler was
131// so inconsiderate as to return.
132extern void __terminate(std::terminate_handler) __attribute__((noreturn));
133extern void __unexpected(std::unexpected_handler) __attribute__((noreturn));
134
135// The current installed user handlers.
136extern std::terminate_handler __terminate_handler;
137extern std::unexpected_handler __unexpected_handler;
138
139#ifdef __UCLIBCXX_EXCEPTION_SUPPORT__
140// Acquire the C++ exception header from the C++ object.
141static inline __cxa_exception *
142__get_exception_header_from_obj (void *ptr)
143{
144 return reinterpret_cast<__cxa_exception *>(ptr) - 1;
145}
146
147// Acquire the C++ exception header from the generic exception header.
148static inline __cxa_exception *
149__get_exception_header_from_ue (_Unwind_Exception *exc)
150{
151 return reinterpret_cast<__cxa_exception *>(exc + 1) - 1;
152}
153#endif
154} /* namespace __cxxabiv1 */
155
156#pragma GCC visibility pop
157
158#endif // _UNWIND_CXX_H
159

Archive Download this file

Revision: 1406