mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-26 09:07:38 +01:00
Remove include of "mempool.h".
Move debug macros to internal.h. (Logical change 1.32)
This commit is contained in:
parent
8c52e5fec1
commit
481e35c2ca
1 changed files with 23 additions and 162 deletions
|
@ -33,7 +33,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "mempool.h"
|
|
||||||
|
|
||||||
#define struct_offset(str,fld) ((char *)&((str *)NULL)->fld - (char *) 0)
|
#define struct_offset(str,fld) ((char *)&((str *)NULL)->fld - (char *) 0)
|
||||||
|
|
||||||
|
@ -46,78 +45,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
|
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
# define IA64_UNW_DEBUG 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IA64_UNW_STATS 0
|
|
||||||
|
|
||||||
#if IA64_UNW_DEBUG
|
|
||||||
# include <stdio.h>
|
|
||||||
# define debug(level,format...) \
|
|
||||||
do { if (unw.debug_level > level) printf (format); } while (0)
|
|
||||||
# define dprintf(format...) \
|
|
||||||
printf (format)
|
|
||||||
# define inline __attribute__ ((unused))
|
|
||||||
#else
|
|
||||||
# define debug(level,format...)
|
|
||||||
# define dprintf(format...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if IA64_UNW_STATS
|
|
||||||
# define STAT(x...) x
|
|
||||||
#else
|
|
||||||
# define STAT(x...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tdep.h"
|
#include "tdep.h"
|
||||||
|
|
||||||
struct ia64_cursor
|
|
||||||
{
|
|
||||||
void *as_arg; /* argument to address-space callbacks */
|
|
||||||
unw_addr_space_t as; /* reference to per-address-space info */
|
|
||||||
|
|
||||||
/* IP and predicate cache (these are always equal to the values
|
|
||||||
stored in ip_loc and pr_loc, respectively). */
|
|
||||||
unw_word_t ip; /* instruction pointer value */
|
|
||||||
unw_word_t pr; /* current predicate values */
|
|
||||||
|
|
||||||
/* current frame info: */
|
|
||||||
unw_word_t bsp; /* backing store pointer value */
|
|
||||||
unw_word_t sp; /* stack pointer value */
|
|
||||||
unw_word_t psp; /* previous sp value */
|
|
||||||
unw_word_t cfm_loc; /* cfm save location (or NULL) */
|
|
||||||
unw_word_t rbs_top; /* address of end of register backing store */
|
|
||||||
unw_word_t top_rnat_loc; /* location of final (topmost) RNaT word */
|
|
||||||
|
|
||||||
/* preserved state: */
|
|
||||||
unw_word_t bsp_loc; /* previous bsp save location */
|
|
||||||
unw_word_t bspstore_loc;
|
|
||||||
unw_word_t pfs_loc;
|
|
||||||
unw_word_t rnat_loc;
|
|
||||||
unw_word_t ip_loc;
|
|
||||||
unw_word_t pri_unat_loc;
|
|
||||||
unw_word_t unat_loc;
|
|
||||||
unw_word_t pr_loc;
|
|
||||||
unw_word_t lc_loc;
|
|
||||||
unw_word_t fpsr_loc;
|
|
||||||
unw_word_t r4_loc, r5_loc, r6_loc, r7_loc;
|
|
||||||
unw_word_t nat4_loc, nat5_loc, nat6_loc, nat7_loc;
|
|
||||||
unw_word_t b1_loc, b2_loc, b3_loc, b4_loc, b5_loc;
|
|
||||||
unw_word_t f2_loc, f3_loc, f4_loc, f5_loc, fr_loc[16];
|
|
||||||
|
|
||||||
unw_word_t eh_args[4]; /* exception handler arguments */
|
|
||||||
unw_word_t sigcontext_loc; /* location of sigcontext or NULL */
|
|
||||||
unw_word_t is_signal_frame; /* is this a signal trampoline frame? */
|
|
||||||
|
|
||||||
short hint;
|
|
||||||
short prev_script;
|
|
||||||
|
|
||||||
int pi_valid : 1; /* is proc_info valid? */
|
|
||||||
int pi_is_dynamic : 1; /* proc_info found via dynamic proc info? */
|
|
||||||
unw_proc_info_t pi; /* info about current procedure */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Bits 0 to 2 of an location are used to encode its type:
|
/* Bits 0 to 2 of an location are used to encode its type:
|
||||||
|
|
||||||
bit 0: set if location uses floating-point format.
|
bit 0: set if location uses floating-point format.
|
||||||
|
@ -137,23 +66,21 @@ struct ia64_cursor
|
||||||
|
|
||||||
#ifdef UNW_LOCAL_ONLY
|
#ifdef UNW_LOCAL_ONLY
|
||||||
|
|
||||||
extern void *_Uia64_uc_addr (ucontext_t *uc, unw_regnum_t regnum);
|
#define IA64_REG_LOC(c,r) ((unw_word_t) tdep_uc_addr((c)->as_arg, (r)))
|
||||||
|
#define IA64_FPREG_LOC(c,r) \
|
||||||
|
((unw_word_t) tdep_uc_addr((c)->as_arg, (r)) | IA64_LOC_TYPE_FP)
|
||||||
|
|
||||||
#define IA64_REG_LOC(c,r) ((unw_word_t) _Uia64_uc_addr((c)->as_arg, (r)))
|
# define ia64_find_proc_info(c,ip,n) \
|
||||||
#define IA64_FPREG_LOC(c,r) \
|
tdep_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n), \
|
||||||
((unw_word_t) _Uia64_uc_addr((c)->as_arg, (r)) | IA64_LOC_TYPE_FP)
|
(c)->as_arg)
|
||||||
|
|
||||||
# define ia64_find_proc_info(c,ip,n) \
|
|
||||||
_Uia64_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n), \
|
|
||||||
(c)->as_arg)
|
|
||||||
# define ia64_put_unwind_info(c, pi) do { ; } while (0)
|
# define ia64_put_unwind_info(c, pi) do { ; } while (0)
|
||||||
|
|
||||||
/* Note: the register accessors (ia64_{get,set}{,fp}()) must check for
|
/* Note: the register accessors (ia64_{get,set}{,fp}()) must check for
|
||||||
NULL locations because _Uia64_uc_addr() returns NULL for unsaved
|
NULL locations because tdep_uc_addr() returns NULL for unsaved
|
||||||
registers. */
|
registers. */
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_getfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
ia64_getfp (struct cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
||||||
{
|
{
|
||||||
if (!loc)
|
if (!loc)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -162,7 +89,7 @@ ia64_getfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_putfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t val)
|
ia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
|
||||||
{
|
{
|
||||||
if (!loc)
|
if (!loc)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -171,7 +98,7 @@ ia64_putfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t val)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_get (struct ia64_cursor *c, unw_word_t loc, unw_word_t *val)
|
ia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
|
||||||
{
|
{
|
||||||
if (!loc)
|
if (!loc)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -180,7 +107,7 @@ ia64_get (struct ia64_cursor *c, unw_word_t loc, unw_word_t *val)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_put (struct ia64_cursor *c, unw_word_t loc, unw_word_t val)
|
ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
|
||||||
{
|
{
|
||||||
if (!loc)
|
if (!loc)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -202,7 +129,7 @@ ia64_put (struct ia64_cursor *c, unw_word_t loc, unw_word_t val)
|
||||||
(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
|
(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_getfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
ia64_getfp (struct cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -221,7 +148,7 @@ ia64_getfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_putfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t val)
|
ia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -245,7 +172,7 @@ ia64_putfp (struct ia64_cursor *c, unw_word_t loc, unw_fpreg_t val)
|
||||||
the significand bits. */
|
the significand bits. */
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_get (struct ia64_cursor *c, unw_word_t loc, unw_word_t *val)
|
ia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_FP_LOC (loc))
|
if (IA64_IS_FP_LOC (loc))
|
||||||
{
|
{
|
||||||
|
@ -271,7 +198,7 @@ ia64_get (struct ia64_cursor *c, unw_word_t loc, unw_word_t *val)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_put (struct ia64_cursor *c, unw_word_t loc, unw_word_t val)
|
ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_FP_LOC (loc))
|
if (IA64_IS_FP_LOC (loc))
|
||||||
{
|
{
|
||||||
|
@ -369,94 +296,32 @@ struct ia64_labeled_state
|
||||||
struct ia64_reg_state saved_state;
|
struct ia64_reg_state saved_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ia64_global_unwind_state
|
|
||||||
{
|
|
||||||
int first_time;
|
|
||||||
|
|
||||||
/* Table of registers that prologues can save (and order in which
|
|
||||||
they're saved). */
|
|
||||||
const unsigned char save_order[8];
|
|
||||||
|
|
||||||
/* Maps a preserved register index (preg_index) to corresponding
|
|
||||||
ucontext_t offset. */
|
|
||||||
unsigned short uc_off[sizeof(unw_cursor_t) / 8];
|
|
||||||
|
|
||||||
/* Index into unw_cursor_t for preserved register i */
|
|
||||||
unsigned short preg_index[IA64_NUM_PREGS];
|
|
||||||
|
|
||||||
unw_fpreg_t f0, f1_le, f1_be, nat_val_le;
|
|
||||||
unw_fpreg_t nat_val_be, int_val_le, int_val_be;
|
|
||||||
|
|
||||||
struct mempool state_record_pool;
|
|
||||||
struct mempool labeled_state_pool;
|
|
||||||
|
|
||||||
# if IA64_UNW_DEBUG
|
|
||||||
long debug_level;
|
|
||||||
const char *preg_name[IA64_NUM_PREGS];
|
|
||||||
# endif
|
|
||||||
# if IA64_UNW_STATS
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int lookups;
|
|
||||||
int hinted_hits;
|
|
||||||
int normal_hits;
|
|
||||||
int collision_chain_traversals;
|
|
||||||
}
|
|
||||||
cache;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned long build_time;
|
|
||||||
unsigned long run_time;
|
|
||||||
unsigned long parse_time;
|
|
||||||
int builds;
|
|
||||||
int news;
|
|
||||||
int collisions;
|
|
||||||
int runs;
|
|
||||||
}
|
|
||||||
script;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned long init_time;
|
|
||||||
unsigned long unwind_time;
|
|
||||||
int inits;
|
|
||||||
int unwinds;
|
|
||||||
}
|
|
||||||
api;
|
|
||||||
}
|
|
||||||
stat;
|
|
||||||
# endif /* IA64_UNW_STATS */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Convenience macros: */
|
/* Convenience macros: */
|
||||||
#define unw UNW_OBJ(data)
|
|
||||||
#define ia64_make_proc_info UNW_OBJ(make_proc_info)
|
#define ia64_make_proc_info UNW_OBJ(make_proc_info)
|
||||||
#define ia64_create_state_record UNW_OBJ(create_state_record)
|
#define ia64_create_state_record UNW_OBJ(create_state_record)
|
||||||
#define ia64_free_state_record UNW_OBJ(free_state_record)
|
#define ia64_free_state_record UNW_OBJ(free_state_record)
|
||||||
#define ia64_find_save_locs UNW_OBJ(find_save_locs)
|
#define ia64_find_save_locs UNW_OBJ(find_save_locs)
|
||||||
#define ia64_per_thread_cache UNW_OBJ(per_thread_cache)
|
#define ia64_per_thread_cache UNW_OBJ(per_thread_cache)
|
||||||
#define ia64_script_cache_init UNW_OBJ(script_cache_init)
|
#define ia64_script_cache_init UNW_OBJ(script_cache_init)
|
||||||
#define ia64_init UNW_OBJ(init)
|
|
||||||
#define ia64_access_reg UNW_OBJ(access_reg)
|
#define ia64_access_reg UNW_OBJ(access_reg)
|
||||||
#define ia64_access_fpreg UNW_OBJ(access_fpreg)
|
#define ia64_access_fpreg UNW_OBJ(access_fpreg)
|
||||||
#define ia64_scratch_loc UNW_OBJ(scratch_loc)
|
#define ia64_scratch_loc UNW_OBJ(scratch_loc)
|
||||||
#define ia64_local_resume UNW_OBJ(local_resume)
|
#define ia64_local_resume UNW_OBJ(local_resume)
|
||||||
|
#define ia64_local_addr_space_init UNW_OBJ(local_addr_space_init)
|
||||||
|
#define ia64_init UNW_ARCH_OBJ(init)
|
||||||
|
|
||||||
extern struct ia64_global_unwind_state unw;
|
extern int ia64_make_proc_info (struct cursor *c);
|
||||||
|
extern int ia64_create_state_record (struct cursor *c,
|
||||||
extern int ia64_make_proc_info (struct ia64_cursor *c);
|
|
||||||
extern int ia64_create_state_record (struct ia64_cursor *c,
|
|
||||||
struct ia64_state_record *sr);
|
struct ia64_state_record *sr);
|
||||||
extern int ia64_free_state_record (struct ia64_state_record *sr);
|
extern int ia64_free_state_record (struct ia64_state_record *sr);
|
||||||
extern int ia64_find_save_locs (struct ia64_cursor *c);
|
extern int ia64_find_save_locs (struct cursor *c);
|
||||||
extern void ia64_script_cache_init (struct ia64_script_cache *cache);
|
extern void ia64_script_cache_init (struct ia64_script_cache *cache);
|
||||||
extern void ia64_init (void);
|
extern void ia64_init (void);
|
||||||
extern int ia64_access_reg (struct ia64_cursor *c, unw_regnum_t reg,
|
extern int ia64_access_reg (struct cursor *c, unw_regnum_t reg,
|
||||||
unw_word_t *valp, int write);
|
unw_word_t *valp, int write);
|
||||||
extern int ia64_access_fpreg (struct ia64_cursor *c, unw_regnum_t reg,
|
extern int ia64_access_fpreg (struct cursor *c, unw_regnum_t reg,
|
||||||
unw_fpreg_t *valp, int write);
|
unw_fpreg_t *valp, int write);
|
||||||
extern unw_word_t ia64_scratch_loc (struct ia64_cursor *c, unw_regnum_t reg);
|
extern unw_word_t ia64_scratch_loc (struct cursor *c, unw_regnum_t reg);
|
||||||
|
|
||||||
extern void __ia64_install_context (const ucontext_t *ucp, long r15, long r16,
|
extern void __ia64_install_context (const ucontext_t *ucp, long r15, long r16,
|
||||||
long r17, long r18)
|
long r17, long r18)
|
||||||
|
@ -464,10 +329,6 @@ extern void __ia64_install_context (const ucontext_t *ucp, long r15, long r16,
|
||||||
extern int ia64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
|
extern int ia64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
|
||||||
void *arg);
|
void *arg);
|
||||||
|
|
||||||
extern int _Uia64_find_proc_info (unw_addr_space_t as, unw_word_t ip,
|
|
||||||
unw_proc_info_t *pi, int need_unwind_info,
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
/* XXX should be in glibc: */
|
/* XXX should be in glibc: */
|
||||||
#ifndef IA64_SC_FLAG_ONSTACK
|
#ifndef IA64_SC_FLAG_ONSTACK
|
||||||
# define IA64_SC_FLAG_ONSTACK_BIT 0 /* running on signal stack? */
|
# define IA64_SC_FLAG_ONSTACK_BIT 0 /* running on signal stack? */
|
||||||
|
|
Loading…
Reference in a new issue