1*53ee8cc1Swenshuai.xi /* Exception handling and frame unwind runtime interface routines.
2*53ee8cc1Swenshuai.xi Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi
4*53ee8cc1Swenshuai.xi This file is part of GCC.
5*53ee8cc1Swenshuai.xi
6*53ee8cc1Swenshuai.xi GCC is free software; you can redistribute it and/or modify it
7*53ee8cc1Swenshuai.xi under the terms of the GNU General Public License as published by
8*53ee8cc1Swenshuai.xi the Free Software Foundation; either version 2, or (at your option)
9*53ee8cc1Swenshuai.xi any later version.
10*53ee8cc1Swenshuai.xi
11*53ee8cc1Swenshuai.xi GCC is distributed in the hope that it will be useful, but WITHOUT
12*53ee8cc1Swenshuai.xi ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13*53ee8cc1Swenshuai.xi or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14*53ee8cc1Swenshuai.xi License for more details.
15*53ee8cc1Swenshuai.xi
16*53ee8cc1Swenshuai.xi You should have received a copy of the GNU General Public License
17*53ee8cc1Swenshuai.xi along with GCC; see the file COPYING. If not, write to the Free
18*53ee8cc1Swenshuai.xi Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
19*53ee8cc1Swenshuai.xi 02110-1301, USA. */
20*53ee8cc1Swenshuai.xi
21*53ee8cc1Swenshuai.xi /* As a special exception, if you include this header file into source
22*53ee8cc1Swenshuai.xi files compiled by GCC, this header file does not by itself cause
23*53ee8cc1Swenshuai.xi the resulting executable to be covered by the GNU General Public
24*53ee8cc1Swenshuai.xi License. This exception does not however invalidate any other
25*53ee8cc1Swenshuai.xi reasons why the executable file might be covered by the GNU General
26*53ee8cc1Swenshuai.xi Public License. */
27*53ee8cc1Swenshuai.xi
28*53ee8cc1Swenshuai.xi /* This is derived from the C++ ABI for IA-64. Where we diverge
29*53ee8cc1Swenshuai.xi for cross-architecture compatibility are noted with "@@@". */
30*53ee8cc1Swenshuai.xi
31*53ee8cc1Swenshuai.xi #ifndef _UNWIND_H
32*53ee8cc1Swenshuai.xi #define _UNWIND_H
33*53ee8cc1Swenshuai.xi
34*53ee8cc1Swenshuai.xi #ifndef HIDE_EXPORTS
35*53ee8cc1Swenshuai.xi #pragma GCC visibility push(default)
36*53ee8cc1Swenshuai.xi #endif
37*53ee8cc1Swenshuai.xi
38*53ee8cc1Swenshuai.xi #ifdef __cplusplus
39*53ee8cc1Swenshuai.xi extern "C" {
40*53ee8cc1Swenshuai.xi #endif
41*53ee8cc1Swenshuai.xi
42*53ee8cc1Swenshuai.xi /* Level 1: Base ABI */
43*53ee8cc1Swenshuai.xi
44*53ee8cc1Swenshuai.xi /* @@@ The IA-64 ABI uses uint64 throughout. Most places this is
45*53ee8cc1Swenshuai.xi inefficient for 32-bit and smaller machines. */
46*53ee8cc1Swenshuai.xi typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
47*53ee8cc1Swenshuai.xi typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
48*53ee8cc1Swenshuai.xi #if defined(__ia64__) && defined(__hpux__)
49*53ee8cc1Swenshuai.xi typedef unsigned _Unwind_Ptr __attribute__((__mode__(__word__)));
50*53ee8cc1Swenshuai.xi #else
51*53ee8cc1Swenshuai.xi typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
52*53ee8cc1Swenshuai.xi #endif
53*53ee8cc1Swenshuai.xi typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__)));
54*53ee8cc1Swenshuai.xi
55*53ee8cc1Swenshuai.xi /* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and
56*53ee8cc1Swenshuai.xi consumer of an exception. We'll go along with this for now even on
57*53ee8cc1Swenshuai.xi 32-bit machines. We'll need to provide some other option for
58*53ee8cc1Swenshuai.xi 16-bit machines and for machines with > 8 bits per byte. */
59*53ee8cc1Swenshuai.xi typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
60*53ee8cc1Swenshuai.xi
61*53ee8cc1Swenshuai.xi /* The unwind interface uses reason codes in several contexts to
62*53ee8cc1Swenshuai.xi identify the reasons for failures or other actions. */
63*53ee8cc1Swenshuai.xi typedef enum
64*53ee8cc1Swenshuai.xi {
65*53ee8cc1Swenshuai.xi _URC_NO_REASON = 0,
66*53ee8cc1Swenshuai.xi _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
67*53ee8cc1Swenshuai.xi _URC_FATAL_PHASE2_ERROR = 2,
68*53ee8cc1Swenshuai.xi _URC_FATAL_PHASE1_ERROR = 3,
69*53ee8cc1Swenshuai.xi _URC_NORMAL_STOP = 4,
70*53ee8cc1Swenshuai.xi _URC_END_OF_STACK = 5,
71*53ee8cc1Swenshuai.xi _URC_HANDLER_FOUND = 6,
72*53ee8cc1Swenshuai.xi _URC_INSTALL_CONTEXT = 7,
73*53ee8cc1Swenshuai.xi _URC_CONTINUE_UNWIND = 8
74*53ee8cc1Swenshuai.xi } _Unwind_Reason_Code;
75*53ee8cc1Swenshuai.xi
76*53ee8cc1Swenshuai.xi
77*53ee8cc1Swenshuai.xi /* The unwind interface uses a pointer to an exception header object
78*53ee8cc1Swenshuai.xi as its representation of an exception being thrown. In general, the
79*53ee8cc1Swenshuai.xi full representation of an exception object is language- and
80*53ee8cc1Swenshuai.xi implementation-specific, but it will be prefixed by a header
81*53ee8cc1Swenshuai.xi understood by the unwind interface. */
82*53ee8cc1Swenshuai.xi
83*53ee8cc1Swenshuai.xi struct _Unwind_Exception;
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code,
86*53ee8cc1Swenshuai.xi struct _Unwind_Exception *);
87*53ee8cc1Swenshuai.xi
88*53ee8cc1Swenshuai.xi struct _Unwind_Exception
89*53ee8cc1Swenshuai.xi {
90*53ee8cc1Swenshuai.xi _Unwind_Exception_Class exception_class;
91*53ee8cc1Swenshuai.xi _Unwind_Exception_Cleanup_Fn exception_cleanup;
92*53ee8cc1Swenshuai.xi _Unwind_Word private_1;
93*53ee8cc1Swenshuai.xi _Unwind_Word private_2;
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi /* @@@ The IA-64 ABI says that this structure must be double-word aligned.
96*53ee8cc1Swenshuai.xi Taking that literally does not make much sense generically. Instead we
97*53ee8cc1Swenshuai.xi provide the maximum alignment required by any type for the machine. */
98*53ee8cc1Swenshuai.xi } __attribute__((__aligned__));
99*53ee8cc1Swenshuai.xi
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi /* The ACTIONS argument to the personality routine is a bitwise OR of one
102*53ee8cc1Swenshuai.xi or more of the following constants. */
103*53ee8cc1Swenshuai.xi typedef int _Unwind_Action;
104*53ee8cc1Swenshuai.xi
105*53ee8cc1Swenshuai.xi #define _UA_SEARCH_PHASE 1
106*53ee8cc1Swenshuai.xi #define _UA_CLEANUP_PHASE 2
107*53ee8cc1Swenshuai.xi #define _UA_HANDLER_FRAME 4
108*53ee8cc1Swenshuai.xi #define _UA_FORCE_UNWIND 8
109*53ee8cc1Swenshuai.xi #define _UA_END_OF_STACK 16
110*53ee8cc1Swenshuai.xi
111*53ee8cc1Swenshuai.xi /* This is an opaque type used to refer to a system-specific data
112*53ee8cc1Swenshuai.xi structure used by the system unwinder. This context is created and
113*53ee8cc1Swenshuai.xi destroyed by the system, and passed to the personality routine
114*53ee8cc1Swenshuai.xi during unwinding. */
115*53ee8cc1Swenshuai.xi struct _Unwind_Context;
116*53ee8cc1Swenshuai.xi
117*53ee8cc1Swenshuai.xi /* Raise an exception, passing along the given exception object. */
118*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *);
119*53ee8cc1Swenshuai.xi
120*53ee8cc1Swenshuai.xi /* Raise an exception for forced unwinding. */
121*53ee8cc1Swenshuai.xi
122*53ee8cc1Swenshuai.xi typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
123*53ee8cc1Swenshuai.xi (int, _Unwind_Action, _Unwind_Exception_Class,
124*53ee8cc1Swenshuai.xi struct _Unwind_Exception *, struct _Unwind_Context *, void *);
125*53ee8cc1Swenshuai.xi
126*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,
127*53ee8cc1Swenshuai.xi _Unwind_Stop_Fn,
128*53ee8cc1Swenshuai.xi void *);
129*53ee8cc1Swenshuai.xi
130*53ee8cc1Swenshuai.xi /* Helper to invoke the exception_cleanup routine. */
131*53ee8cc1Swenshuai.xi extern void _Unwind_DeleteException (struct _Unwind_Exception *);
132*53ee8cc1Swenshuai.xi
133*53ee8cc1Swenshuai.xi /* Resume propagation of an existing exception. This is used after
134*53ee8cc1Swenshuai.xi e.g. executing cleanup code, and not to implement rethrowing. */
135*53ee8cc1Swenshuai.xi extern void _Unwind_Resume (struct _Unwind_Exception *);
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi /* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow
138*53ee8cc1Swenshuai.xi a normal exception that was handled. */
139*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *);
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi /* @@@ Use unwind data to perform a stack backtrace. The trace callback
142*53ee8cc1Swenshuai.xi is called for every stack frame in the call chain, but no cleanup
143*53ee8cc1Swenshuai.xi actions are performed. */
144*53ee8cc1Swenshuai.xi typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)
145*53ee8cc1Swenshuai.xi (struct _Unwind_Context *, void *);
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *);
148*53ee8cc1Swenshuai.xi
149*53ee8cc1Swenshuai.xi /* These functions are used for communicating information about the unwind
150*53ee8cc1Swenshuai.xi context (i.e. the unwind descriptors and the user register state) between
151*53ee8cc1Swenshuai.xi the unwind library and the personality routine and landing pad. Only
152*53ee8cc1Swenshuai.xi selected registers maybe manipulated. */
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi extern _Unwind_Word _Unwind_GetGR (struct _Unwind_Context *, int);
155*53ee8cc1Swenshuai.xi extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word);
156*53ee8cc1Swenshuai.xi
157*53ee8cc1Swenshuai.xi extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
158*53ee8cc1Swenshuai.xi extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
159*53ee8cc1Swenshuai.xi
160*53ee8cc1Swenshuai.xi /* @@@ Retrieve the CFA of the given context. */
161*53ee8cc1Swenshuai.xi extern _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi extern void *_Unwind_GetLanguageSpecificData (struct _Unwind_Context *);
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi extern _Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *);
166*53ee8cc1Swenshuai.xi
167*53ee8cc1Swenshuai.xi
168*53ee8cc1Swenshuai.xi /* The personality routine is the function in the C++ (or other language)
169*53ee8cc1Swenshuai.xi runtime library which serves as an interface between the system unwind
170*53ee8cc1Swenshuai.xi library and language-specific exception handling semantics. It is
171*53ee8cc1Swenshuai.xi specific to the code fragment described by an unwind info block, and
172*53ee8cc1Swenshuai.xi it is always referenced via the pointer in the unwind info block, and
173*53ee8cc1Swenshuai.xi hence it has no ABI-specified name.
174*53ee8cc1Swenshuai.xi
175*53ee8cc1Swenshuai.xi Note that this implies that two different C++ implementations can
176*53ee8cc1Swenshuai.xi use different names, and have different contents in the language
177*53ee8cc1Swenshuai.xi specific data area. Moreover, that the language specific data
178*53ee8cc1Swenshuai.xi area contains no version info because name of the function invoked
179*53ee8cc1Swenshuai.xi provides more effective versioning by detecting at link time the
180*53ee8cc1Swenshuai.xi lack of code to handle the different data format. */
181*53ee8cc1Swenshuai.xi
182*53ee8cc1Swenshuai.xi typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)
183*53ee8cc1Swenshuai.xi (int, _Unwind_Action, _Unwind_Exception_Class,
184*53ee8cc1Swenshuai.xi struct _Unwind_Exception *, struct _Unwind_Context *);
185*53ee8cc1Swenshuai.xi
186*53ee8cc1Swenshuai.xi /* @@@ The following alternate entry points are for setjmp/longjmp
187*53ee8cc1Swenshuai.xi based unwinding. */
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi struct SjLj_Function_Context;
190*53ee8cc1Swenshuai.xi extern void _Unwind_SjLj_Register (struct SjLj_Function_Context *);
191*53ee8cc1Swenshuai.xi extern void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *);
192*53ee8cc1Swenshuai.xi
193*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException
194*53ee8cc1Swenshuai.xi (struct _Unwind_Exception *);
195*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind
196*53ee8cc1Swenshuai.xi (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *);
197*53ee8cc1Swenshuai.xi extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *);
198*53ee8cc1Swenshuai.xi extern _Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *);
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi /* @@@ The following provide access to the base addresses for text
201*53ee8cc1Swenshuai.xi and data-relative addressing in the LDSA. In order to stay link
202*53ee8cc1Swenshuai.xi compatible with the standard ABI for IA-64, we inline these. */
203*53ee8cc1Swenshuai.xi
204*53ee8cc1Swenshuai.xi #ifdef __ia64__
205*53ee8cc1Swenshuai.xi #include <stdlib.h>
206*53ee8cc1Swenshuai.xi
207*53ee8cc1Swenshuai.xi static inline _Unwind_Ptr
_Unwind_GetDataRelBase(struct _Unwind_Context * _C)208*53ee8cc1Swenshuai.xi _Unwind_GetDataRelBase (struct _Unwind_Context *_C)
209*53ee8cc1Swenshuai.xi {
210*53ee8cc1Swenshuai.xi /* The GP is stored in R1. */
211*53ee8cc1Swenshuai.xi return _Unwind_GetGR (_C, 1);
212*53ee8cc1Swenshuai.xi }
213*53ee8cc1Swenshuai.xi
214*53ee8cc1Swenshuai.xi static inline _Unwind_Ptr
_Unwind_GetTextRelBase(struct _Unwind_Context * _C)215*53ee8cc1Swenshuai.xi _Unwind_GetTextRelBase (struct _Unwind_Context *_C __attribute__ ((__unused__)))
216*53ee8cc1Swenshuai.xi {
217*53ee8cc1Swenshuai.xi abort ();
218*53ee8cc1Swenshuai.xi return 0;
219*53ee8cc1Swenshuai.xi }
220*53ee8cc1Swenshuai.xi
221*53ee8cc1Swenshuai.xi /* @@@ Retrieve the Backing Store Pointer of the given context. */
222*53ee8cc1Swenshuai.xi extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *);
223*53ee8cc1Swenshuai.xi #else
224*53ee8cc1Swenshuai.xi extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *);
225*53ee8cc1Swenshuai.xi extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *);
226*53ee8cc1Swenshuai.xi #endif
227*53ee8cc1Swenshuai.xi
228*53ee8cc1Swenshuai.xi /* @@@ Given an address, return the entry point of the function that
229*53ee8cc1Swenshuai.xi contains it. */
230*53ee8cc1Swenshuai.xi extern void * _Unwind_FindEnclosingFunction (void *pc);
231*53ee8cc1Swenshuai.xi
232*53ee8cc1Swenshuai.xi #ifdef __cplusplus
233*53ee8cc1Swenshuai.xi }
234*53ee8cc1Swenshuai.xi #endif
235*53ee8cc1Swenshuai.xi
236*53ee8cc1Swenshuai.xi #ifndef HIDE_EXPORTS
237*53ee8cc1Swenshuai.xi #pragma GCC visibility pop
238*53ee8cc1Swenshuai.xi #endif
239*53ee8cc1Swenshuai.xi
240*53ee8cc1Swenshuai.xi #endif /* unwind.h */
241