/* 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 */
