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