Skip to content

Commit 1276fbd

Browse files
committed
bundled gcc's unwind-generic.h for BSD because unwind.h is missing at least on FreeBSD. released ngx_openresty 1.0.4.2rc12.
1 parent 5aa4947 commit 1276fbd

File tree

5 files changed

+331
-8
lines changed

5 files changed

+331
-8
lines changed

misc/unwind-generic.h

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
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 */

0 commit comments

Comments
 (0)