| /* libunwind - a platform-independent unwind library |
| Copyright (C) 2003 Hewlett-Packard Co |
| Contributed by David Mosberger-Tang <davidm@hpl.hp.com> |
| |
| This file is part of libunwind. |
| |
| Permission is hereby granted, free of charge, to any person obtaining |
| a copy of this software and associated documentation files (the |
| "Software"), to deal in the Software without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Software, and to |
| permit persons to whom the Software is furnished to do so, subject to |
| the following conditions: |
| |
| The above copyright notice and this permission notice shall be |
| included in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| |
| #ifndef _UNWIND_H |
| #define _UNWIND_H |
| |
| /* For uint64_t */ |
| #include <stdint.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* Minimal interface as per C++ ABI draft standard: |
| |
| http://www.codesourcery.com/cxx-abi/abi-eh.html */ |
| |
| 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; |
| |
| typedef int _Unwind_Action; |
| |
| #define _UA_SEARCH_PHASE 1 |
| #define _UA_CLEANUP_PHASE 2 |
| #define _UA_HANDLER_FRAME 4 |
| #define _UA_FORCE_UNWIND 8 |
| |
| struct _Unwind_Context; /* opaque data-structure */ |
| struct _Unwind_Exception; /* forward-declaration */ |
| |
| typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, |
| struct _Unwind_Exception *); |
| |
| typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) (int, _Unwind_Action, |
| uint64_t, |
| struct _Unwind_Exception *, |
| struct _Unwind_Context *, |
| void *); |
| |
| /* The C++ ABI requires exception_class, private_1, and private_2 to |
| be of type uint64 and the entire structure to be |
| double-word-aligned. Please note that exception_class stays 64-bit |
| even on 32-bit machines for gcc compatibility. */ |
| struct _Unwind_Exception |
| { |
| uint64_t exception_class; |
| _Unwind_Exception_Cleanup_Fn exception_cleanup; |
| unsigned long private_1; |
| unsigned long private_2; |
| } __attribute__((__aligned__)); |
| |
| extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *); |
| extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *, |
| _Unwind_Stop_Fn, void *); |
| extern void _Unwind_Resume (struct _Unwind_Exception *); |
| extern void _Unwind_DeleteException (struct _Unwind_Exception *); |
| extern unsigned long _Unwind_GetGR (struct _Unwind_Context *, int); |
| extern void _Unwind_SetGR (struct _Unwind_Context *, int, unsigned long); |
| extern unsigned long _Unwind_GetIP (struct _Unwind_Context *); |
| extern unsigned long _Unwind_GetIPInfo (struct _Unwind_Context *, int *); |
| extern void _Unwind_SetIP (struct _Unwind_Context *, unsigned long); |
| extern unsigned long _Unwind_GetLanguageSpecificData (struct _Unwind_Context*); |
| extern unsigned long _Unwind_GetRegionStart (struct _Unwind_Context *); |
| |
| #ifdef _GNU_SOURCE |
| |
| /* Callback for _Unwind_Backtrace(). The backtrace stops immediately |
| if the callback returns any value other than _URC_NO_REASON. */ |
| typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn) (struct _Unwind_Context *, |
| void *); |
| |
| /* See http://gcc.gnu.org/ml/gcc-patches/2001-09/msg00082.html for why |
| _UA_END_OF_STACK exists. */ |
| # define _UA_END_OF_STACK 16 |
| |
| /* If the unwind was initiated due to a forced unwind, resume that |
| operation, else re-raise the exception. This is used by |
| __cxa_rethrow(). */ |
| extern _Unwind_Reason_Code |
| _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *); |
| |
| /* See http://gcc.gnu.org/ml/gcc-patches/2003-09/msg00154.html for why |
| _Unwind_GetBSP() exists. */ |
| extern unsigned long _Unwind_GetBSP (struct _Unwind_Context *); |
| |
| /* Return the "canonical frame address" for the given context. |
| This is used by NPTL... */ |
| extern unsigned long _Unwind_GetCFA (struct _Unwind_Context *); |
| |
| /* Return the base-address for data references. */ |
| extern unsigned long _Unwind_GetDataRelBase (struct _Unwind_Context *); |
| |
| /* Return the base-address for text references. */ |
| extern unsigned long _Unwind_GetTextRelBase (struct _Unwind_Context *); |
| |
| /* Call _Unwind_Trace_Fn once for each stack-frame, without doing any |
| cleanup. The first frame for which the callback is invoked is the |
| one for the caller of _Unwind_Backtrace(). _Unwind_Backtrace() |
| returns _URC_END_OF_STACK when the backtrace stopped due to |
| reaching the end of the call-chain or _URC_FATAL_PHASE1_ERROR if it |
| stops for any other reason. */ |
| extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); |
| |
| /* Find the start-address of the procedure containing the specified IP |
| or NULL if it cannot be found (e.g., because the function has no |
| unwind info). Note: there is not necessarily a one-to-one |
| correspondence between source-level functions and procedures: some |
| functions don't have unwind-info and others are split into multiple |
| procedures. */ |
| extern void *_Unwind_FindEnclosingFunction (void *); |
| |
| /* See also Linux Standard Base Spec: |
| http://www.linuxbase.org/spec/refspecs/LSB_1.3.0/gLSB/gLSB/libgcc-s.html */ |
| |
| #endif /* _GNU_SOURCE */ |
| |
| #ifdef __cplusplus |
| }; |
| #endif |
| |
| #endif /* _UNWIND_H */ |