diff options
Diffstat (limited to 'libc/sysdeps/linux/common')
| -rw-r--r-- | libc/sysdeps/linux/common/unwind.h | 220 | 
1 files changed, 220 insertions, 0 deletions
| diff --git a/libc/sysdeps/linux/common/unwind.h b/libc/sysdeps/linux/common/unwind.h new file mode 100644 index 000000000..81fc4db55 --- /dev/null +++ b/libc/sysdeps/linux/common/unwind.h @@ -0,0 +1,220 @@ +/* Exception handling and frame unwind runtime interface routines. +   Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 of the License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +/* This is derived from the C++ ABI for IA-64.  Where we diverge +   for cross-architecture compatibility are noted with "@@@".  */ + +#ifndef _UNWIND_H +#define _UNWIND_H	1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Level 1: Base ABI  */ + +/* @@@ The IA-64 ABI uses uint64 throughout.  Most places this is +   inefficient for 32-bit and smaller machines.  */ +typedef unsigned _Unwind_Word __attribute__((__mode__(__word__))); +typedef signed _Unwind_Sword __attribute__((__mode__(__word__))); +#if defined(__ia64__) && defined(__hpux__) +typedef unsigned _Unwind_Ptr __attribute__((__mode__(__word__))); +#else +typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__))); +#endif +typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__))); + +/* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and +   consumer of an exception.  We'll go along with this for now even on +   32-bit machines.  We'll need to provide some other option for +   16-bit machines and for machines with > 8 bits per byte.  */ +typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__))); + +/* The unwind interface uses reason codes in several contexts to +   identify the reasons for failures or other actions.  */ +typedef enum +{ +  _URC_NO_REASON = 0, +  _URC_FOREIGN_EXCEPTION_CAUGHT = 1, +  _URC_FATAL_PHASE2_ERROR = 2, +  _URC_FATAL_PHASE1_ERROR = 3, +  _URC_NORMAL_STOP = 4, +  _URC_END_OF_STACK = 5, +  _URC_HANDLER_FOUND = 6, +  _URC_INSTALL_CONTEXT = 7, +  _URC_CONTINUE_UNWIND = 8 +} _Unwind_Reason_Code; + + +/* The unwind interface uses a pointer to an exception header object +   as its representation of an exception being thrown. In general, the +   full representation of an exception object is language- and +   implementation-specific, but it will be prefixed by a header +   understood by the unwind interface.  */ + +struct _Unwind_Exception; + +typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, +					      struct _Unwind_Exception *); + +struct _Unwind_Exception +{ +  _Unwind_Exception_Class exception_class; +  _Unwind_Exception_Cleanup_Fn exception_cleanup; +  _Unwind_Word private_1; +  _Unwind_Word private_2; + +  /* @@@ The IA-64 ABI says that this structure must be double-word aligned. +     Taking that literally does not make much sense generically.  Instead we +     provide the maximum alignment required by any type for the machine.  */ +} __attribute__((__aligned__)); + + +/* The ACTIONS argument to the personality routine is a bitwise OR of one +   or more of the following constants.  */ +typedef int _Unwind_Action; + +#define _UA_SEARCH_PHASE	1 +#define _UA_CLEANUP_PHASE	2 +#define _UA_HANDLER_FRAME	4 +#define _UA_FORCE_UNWIND	8 +#define _UA_END_OF_STACK	16 + +/* This is an opaque type used to refer to a system-specific data +   structure used by the system unwinder. This context is created and +   destroyed by the system, and passed to the personality routine +   during unwinding.  */ +struct _Unwind_Context; + +/* Raise an exception, passing along the given exception object.  */ +extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *); + +/* Raise an exception for forced unwinding.  */ + +typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) +     (int, _Unwind_Action, _Unwind_Exception_Class, +      struct _Unwind_Exception *, struct _Unwind_Context *, void *); + +extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *, +						 _Unwind_Stop_Fn, +						 void *); + +/* Helper to invoke the exception_cleanup routine.  */ +extern void _Unwind_DeleteException (struct _Unwind_Exception *); + +/* Resume propagation of an existing exception.  This is used after +   e.g. executing cleanup code, and not to implement rethrowing.  */ +extern void _Unwind_Resume (struct _Unwind_Exception *); + +/* @@@ Use unwind data to perform a stack backtrace.  The trace callback +   is called for every stack frame in the call chain, but no cleanup +   actions are performed.  */ +typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn) +     (struct _Unwind_Context *, void *); + +extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); + +/* These functions are used for communicating information about the unwind +   context (i.e. the unwind descriptors and the user register state) between +   the unwind library and the personality routine and landing pad.  Only +   selected registers maybe manipulated.  */ + +extern _Unwind_Word _Unwind_GetGR (struct _Unwind_Context *, int); +extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word); + +extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *); +extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr); + +/* @@@ Retrieve the CFA of the given context.  */ +extern _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *); + +extern void *_Unwind_GetLanguageSpecificData (struct _Unwind_Context *); + +extern _Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *); + + +/* The personality routine is the function in the C++ (or other language) +   runtime library which serves as an interface between the system unwind +   library and language-specific exception handling semantics.  It is +   specific to the code fragment described by an unwind info block, and +   it is always referenced via the pointer in the unwind info block, and +   hence it has no ABI-specified name. + +   Note that this implies that two different C++ implementations can +   use different names, and have different contents in the language +   specific data area.  Moreover, that the language specific data +   area contains no version info because name of the function invoked +   provides more effective versioning by detecting at link time the +   lack of code to handle the different data format.  */ + +typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn) +     (int, _Unwind_Action, _Unwind_Exception_Class, +      struct _Unwind_Exception *, struct _Unwind_Context *); + +/* @@@ The following alternate entry points are for setjmp/longjmp +   based unwinding.  */ + +struct SjLj_Function_Context; +extern void _Unwind_SjLj_Register (struct SjLj_Function_Context *); +extern void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *); + +extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException +     (struct _Unwind_Exception *); +extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind +     (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); +extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *); + +/* @@@ The following provide access to the base addresses for text +   and data-relative addressing in the LDSA.  In order to stay link +   compatible with the standard ABI for IA-64, we inline these.  */ + +#ifdef __ia64__ +#include <stdlib.h> + +static inline _Unwind_Ptr +_Unwind_GetDataRelBase (struct _Unwind_Context *_C) +{ +  /* The GP is stored in R1.  */ +  return _Unwind_GetGR (_C, 1); +} + +static inline _Unwind_Ptr +_Unwind_GetTextRelBase (struct _Unwind_Context *_C) +{ +  abort (); +  return 0; +} + +/* @@@ Retrieve the Backing Store Pointer of the given context.  */ +extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *); +#else +extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *); +extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *); +#endif + +/* @@@ Given an address, return the entry point of the function that +   contains it.  */ +extern void * _Unwind_FindEnclosingFunction (void *pc); + +#ifdef __cplusplus +} +#endif + +#endif	/* unwind.h */ | 
