147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* libunwind - a platform-independent unwind library
247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   Copyright (C) 2001-2004 Hewlett-Packard Co
347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmThis file is part of libunwind.
647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining
847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidma copy of this software and associated documentation files (the
947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm"Software"), to deal in the Software without restriction, including
1047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish,
1147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to
1247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to
1347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmthe following conditions:
1447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
1547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmThe above copyright notice and this permission notice shall be
1647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmincluded in all copies or substantial portions of the Software.
1747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
1847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
2247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
2547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
2647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_VERSION_MAJOR	@PKG_MAJOR@
2747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_VERSION_MINOR	@PKG_MINOR@
2847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_VERSION_EXTRA	@PKG_EXTRA@
2947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
3047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_VERSION_CODE(maj,min)	(((maj) << 16) | (min))
3147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_VERSION	UNW_VERSION_CODE(UNW_VERSION_MAJOR, UNW_VERSION_MINOR)
3247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
3347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_PASTE2(x,y)	x##y
3447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_PASTE(x,y)	UNW_PASTE2(x,y)
3547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_OBJ(fn)	UNW_PASTE(UNW_PREFIX, fn)
3647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_ARCH_OBJ(fn) UNW_PASTE(UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_), fn)
3747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
3847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#ifdef UNW_LOCAL_ONLY
3947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm# define UNW_PREFIX	UNW_PASTE(UNW_PASTE(_UL,UNW_TARGET),_)
4047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#else /* !UNW_LOCAL_ONLY */
4147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm# define UNW_PREFIX	UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_)
4247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#endif /* !UNW_LOCAL_ONLY */
4347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
4447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* Error codes.  The unwind routines return the *negated* values of
4547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   these error codes on error and a non-negative value on success.  */
4647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef enum
4747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
4847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_ESUCCESS = 0,		/* no error */
4947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EUNSPEC,		/* unspecified (general) error */
5047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_ENOMEM,			/* out of memory */
5147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EBADREG,		/* bad register number */
5247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EREADONLYREG,		/* attempt to write read-only register */
5347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_ESTOPUNWIND,		/* stop unwinding */
5447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EINVALIDIP,		/* invalid IP */
5547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EBADFRAME,		/* bad frame */
5647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EINVAL,			/* unsupported operation or bad value */
5747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_EBADVERSION,		/* unwind info has unsupported version */
5847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_ENOINFO			/* no unwind info found */
5947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
6047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_error_t;
6147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
6247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* The following enum defines the indices for a couple of
6347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   (pseudo-)registers which have the same meaning across all
6447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   platforms.  (RO) means read-only.  (RW) means read-write.  General
6547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   registers (aka "integer registers") are expected to start with
6647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   index 0.  The number of such registers is architecture-dependent.
6747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   The remaining indices can be used as an architecture sees fit.  The
6847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   last valid register index is given by UNW_REG_LAST.  */
6947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef enum
7047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
7147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_REG_IP = UNW_TDEP_IP,		/* (rw) instruction pointer (pc) */
7247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_REG_SP = UNW_TDEP_SP,		/* (ro) stack pointer */
7347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_REG_EH = UNW_TDEP_EH,		/* (rw) exception-handling reg base */
7447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_REG_LAST = UNW_TDEP_LAST_REG
7547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
7647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_frame_regnum_t;
7747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
7847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* Number of exception-handler argument registers: */
7947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_NUM_EH_REGS		UNW_TDEP_NUM_EH_REGS
8047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
8147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef enum
8247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
8347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_CACHE_NONE,			/* no caching */
8447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_CACHE_GLOBAL,			/* shared global cache */
8547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_CACHE_PER_THREAD		/* per-thread caching */
8647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
8747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_caching_policy_t;
8847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
8947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef int unw_regnum_t;
9047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
9147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* The unwind cursor starts at the youngest (most deeply nested) frame
9247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   and is used to track the frame state as the unwinder steps from
9347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   frame to frame.  It is safe to make (shallow) copies of variables
9447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   of this type.  */
9547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef struct unw_cursor
9647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
9747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t opaque[UNW_TDEP_CURSOR_LEN];
9847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
9947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_cursor_t;
10047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
10147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* This type encapsulates the entire (preserved) machine-state.  */
10247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef unw_tdep_context_t unw_context_t;
10347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
10447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* unw_getcontext() fills the unw_context_t pointed to by UC with the
10547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   machine state as it exists at the call-site.  For implementation
10647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   reasons, this needs to be a target-dependent macro.  It's easiest
10747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   to think of unw_getcontext() as being identical to getcontext(). */
10847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_getcontext(uc)		unw_tdep_getcontext(uc)
10947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
11047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* Return 1 if register number R is a floating-point register, zero
11147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   otherwise.
11247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   This routine is signal-safe.  */
11347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_is_fpreg(r)			unw_tdep_is_fpreg(r)
11447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
11547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef unw_tdep_fpreg_t unw_fpreg_t;
11647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
11747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef struct unw_addr_space *unw_addr_space_t;
11847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
11947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* Each target may define it's own set of flags, but bits 0-15 are
12047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   reserved for general libunwind-use.  */
12147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define UNW_PI_FLAG_FIRST_TDEP_BIT	16
12246e10c5abeeb93345367a70db2af3aba4440a49eArun Sharma/* The information comes from a .debug_frame section.  */
12346e10c5abeeb93345367a70db2af3aba4440a49eArun Sharma#define UNW_PI_FLAG_DEBUG_FRAME	32
12447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
12547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef struct unw_proc_info
12647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
12747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t start_ip;	/* first IP covered by this procedure */
12847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t end_ip;		/* first IP NOT covered by this procedure */
12947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t lsda;		/* address of lang.-spec. data area (if any) */
13047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t handler;		/* optional personality routine */
13147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t gp;		/* global-pointer value for this procedure */
13247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_word_t flags;		/* misc. flags */
13347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
13447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int format;			/* unwind-info format (arch-specific) */
13547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int unwind_info_size;	/* size of the information (if applicable) */
13647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    void *unwind_info;		/* unwind-info (arch-specific) */
13747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_tdep_proc_info_t extra;	/* target-dependent auxiliary proc-info */
13847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
13947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_proc_info_t;
14047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
14147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* These are backend callback routines that provide access to the
14247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   state of a "remote" process.  This can be used, for example, to
14347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm   unwind another process through the ptrace() interface.  */
14447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef struct unw_accessors
14547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
14647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Look up the unwind info associated with instruction-pointer IP.
14747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       On success, the routine fills in the PROC_INFO structure.  */
14847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*find_proc_info) (unw_addr_space_t, unw_word_t, unw_proc_info_t *,
14947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm			   int, void *);
15047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
15147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Release any resources (e.g., memory) that were allocated for
15247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       the unwind info returned in by a previous call to
15347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       find_proc_info() with NEED_UNWIND_INFO set to 1.  */
15447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    void (*put_unwind_info) (unw_addr_space_t, unw_proc_info_t *, void *);
15547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
15647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Return the list-head of the dynamically registered unwind
15747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       info.  */
15847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*get_dyn_info_list_addr) (unw_addr_space_t, unw_word_t *, void *);
15947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
16047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Access aligned word at address ADDR.  The value is returned
16147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       according to the endianness of the host (e.g., if the host is
16247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       little-endian and the target is big-endian, access_mem() needs
16347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       to byte-swap the value before returning it).  */
16447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*access_mem) (unw_addr_space_t, unw_word_t, unw_word_t *, int,
16547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm		       void *);
16647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
16747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Access register number REG at address ADDR.  */
16847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *, int,
16947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm		       void *);
17047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
17147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Access register number REG at address ADDR.  */
17247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*access_fpreg) (unw_addr_space_t, unw_regnum_t,
17347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm			 unw_fpreg_t *, int, void *);
17447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
17547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*resume) (unw_addr_space_t, unw_cursor_t *, void *);
17647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
17747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    /* Optional call back to obtain the name of a (static) procedure.
17847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       Dynamically generated procedures are handled automatically by
17947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       libunwind.  This callback is optional and may be set to
18047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm       NULL.  */
18147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    int (*get_proc_name) (unw_addr_space_t, unw_word_t, char *, size_t,
18247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm			  unw_word_t *, void *);
18347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
18447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_accessors_t;
18547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
18647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef enum unw_save_loc_type
18747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
18847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_SLT_NONE,	/* register is not saved ("not an l-value") */
18947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_SLT_MEMORY,	/* register has been saved in memory */
19047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    UNW_SLT_REG		/* register has been saved in (another) register */
19147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
19247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_save_loc_type_t;
19347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
19447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmtypedef struct unw_save_loc
19547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  {
19647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_save_loc_type_t type;
19747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    union
19847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm      {
19947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm	unw_word_t addr;	/* valid if type==UNW_SLT_MEMORY */
20047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm	unw_regnum_t regnum;	/* valid if type==UNW_SLT_REG */
20147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm      }
20247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    u;
20347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm    unw_tdep_save_loc_t extra;	/* target-dependent additional information */
20447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm  }
20547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmunw_save_loc_t;
20647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
20747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm/* These routines work both for local and remote unwinding.  */
20847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
20947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_local_addr_space	UNW_OBJ(local_addr_space)
21047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_create_addr_space	UNW_OBJ(create_addr_space)
21147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_destroy_addr_space	UNW_OBJ(destroy_addr_space)
21247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_accessors	UNW_ARCH_OBJ(get_accessors)
21347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_init_local		UNW_OBJ(init_local)
21447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_init_remote		UNW_OBJ(init_remote)
21547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_step		UNW_OBJ(step)
21647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_resume		UNW_OBJ(resume)
21747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_proc_info	UNW_OBJ(get_proc_info)
21847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_proc_info_by_ip	UNW_OBJ(get_proc_info_by_ip)
21947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_reg		UNW_OBJ(get_reg)
22047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_set_reg		UNW_OBJ(set_reg)
22147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_fpreg		UNW_OBJ(get_fpreg)
22247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_set_fpreg		UNW_OBJ(set_fpreg)
22347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_save_loc	UNW_OBJ(get_save_loc)
22447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_is_signal_frame	UNW_OBJ(is_signal_frame)
2258e53e62db913470952b8eb541834b876f7a6882cArun Sharma#define unw_handle_signal_frame	UNW_OBJ(handle_signal_frame)
22647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_get_proc_name	UNW_OBJ(get_proc_name)
22747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_set_caching_policy	UNW_OBJ(set_caching_policy)
22847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_regname		UNW_ARCH_OBJ(regname)
22947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_flush_cache		UNW_ARCH_OBJ(flush_cache)
23047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm#define unw_strerror		UNW_ARCH_OBJ(strerror)
23147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
23247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern unw_addr_space_t unw_create_addr_space (unw_accessors_t *, int);
23347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern void unw_destroy_addr_space (unw_addr_space_t);
23447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern unw_accessors_t *unw_get_accessors (unw_addr_space_t);
23547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern void unw_flush_cache (unw_addr_space_t, unw_word_t, unw_word_t);
23647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_set_caching_policy (unw_addr_space_t, unw_caching_policy_t);
23747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern const char *unw_regname (unw_regnum_t);
23847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
23947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_init_local (unw_cursor_t *, unw_context_t *);
24047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_init_remote (unw_cursor_t *, unw_addr_space_t, void *);
24147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_step (unw_cursor_t *);
24247bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_resume (unw_cursor_t *);
24347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_get_proc_info (unw_cursor_t *, unw_proc_info_t *);
24447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_get_proc_info_by_ip (unw_addr_space_t, unw_word_t,
24547bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm				    unw_proc_info_t *, void *);
24647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_get_reg (unw_cursor_t *, int, unw_word_t *);
24747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_set_reg (unw_cursor_t *, int, unw_word_t);
24847bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_get_fpreg (unw_cursor_t *, int, unw_fpreg_t *);
24947bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_set_fpreg (unw_cursor_t *, int, unw_fpreg_t);
25047bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_get_save_loc (unw_cursor_t *, int, unw_save_loc_t *);
25147bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_is_signal_frame (unw_cursor_t *);
2528e53e62db913470952b8eb541834b876f7a6882cArun Sharmaextern int unw_handle_signal_frame (unw_cursor_t *);
25347bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern int unw_get_proc_name (unw_cursor_t *, char *, size_t, unw_word_t *);
25447bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern const char *unw_strerror (int);
25550bc12afba900c478d5d760966ef5b6f32229c99Lassi Tuuraextern int unw_backtrace (void **, int);
25647bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidm
25747bf99c6774e9422872068ef866722a8ba7ddefcmostang.com!davidmextern unw_addr_space_t unw_local_addr_space;
258