unwind-ia64.h: Declare unw_word and unw_sword.
2012-03-26 Tristan Gingold <gingold@adacore.com> * config/ia64/unwind-ia64.h: Declare unw_word and unw_sword. (unw_table_entry): Use unw_word instead of unsigned long. (_Unwind_FindTableEntry): Likewise. * config/ia64/fde-glibc.c (_Unwind_FindTableEntry): Likewise. * config/ia64/fde-vms.c (vms_unwtable_entry): Likewise. (_Unwind_FindTableEntry): Likewise. * config/ia64/unwind-ia64.c (unw_reg_info, unw_reg_state) (unw_labeled_state, unw_state_record, unw_stack, _Uwind_Context) (set_reg, alloc_spill_area, finish_prologue, ia64_rse_slot_num) (ia64_rse_is_rnat_slot, ia64_rse_rnat_addr, ia64_rse_num_regs) (ia64_rse_skip_regs, ia64_copy_rbs, unw_access_gr) (uw_frame_state_for, uw_update_reg_address, uw_update_context) (uw_init_context_1, uw_install_context): Likewise. (unw_word): Move to unwind-ia64.h From-SVN: r185852
This commit is contained in:
parent
2283164d2e
commit
9e916de770
6 changed files with 153 additions and 132 deletions
|
@ -1,3 +1,20 @@
|
|||
2012-03-26 Tristan Gingold <gingold@adacore.com>
|
||||
|
||||
* config/ia64/unwind-ia64.h: Declare unw_word and unw_sword.
|
||||
(unw_table_entry): Use unw_word instead of unsigned long.
|
||||
(_Unwind_FindTableEntry): Likewise.
|
||||
* config/ia64/fde-glibc.c (_Unwind_FindTableEntry): Likewise.
|
||||
* config/ia64/fde-vms.c (vms_unwtable_entry): Likewise.
|
||||
(_Unwind_FindTableEntry): Likewise.
|
||||
* config/ia64/unwind-ia64.c (unw_reg_info, unw_reg_state)
|
||||
(unw_labeled_state, unw_state_record, unw_stack, _Uwind_Context)
|
||||
(set_reg, alloc_spill_area, finish_prologue, ia64_rse_slot_num)
|
||||
(ia64_rse_is_rnat_slot, ia64_rse_rnat_addr, ia64_rse_num_regs)
|
||||
(ia64_rse_skip_regs, ia64_copy_rbs, unw_access_gr)
|
||||
(uw_frame_state_for, uw_update_reg_address, uw_update_context)
|
||||
(uw_init_context_1, uw_install_context): Likewise.
|
||||
(unw_word): Move to unwind-ia64.h
|
||||
|
||||
2012-03-26 Tristan Gingold <gingold@adacore.com>
|
||||
|
||||
* config/vms/vms-ucrt0.c: Update copyright years.
|
||||
|
|
|
@ -144,8 +144,7 @@ _Unwind_IteratePhdrCallback (struct dl_phdr_info *info, size_t size, void *ptr)
|
|||
containing PC. */
|
||||
|
||||
struct unw_table_entry *
|
||||
_Unwind_FindTableEntry (void *pc, unsigned long *segment_base,
|
||||
unsigned long *gp,
|
||||
_Unwind_FindTableEntry (void *pc, unw_word *segment_base, unw_word *gp,
|
||||
struct unw_table_entry *ent ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct unw_ia64_callback_data data;
|
||||
|
|
|
@ -35,8 +35,7 @@
|
|||
#include <stdio.h>
|
||||
#include "unwind-ia64.h"
|
||||
|
||||
#define __int64 long
|
||||
#include <vms/ossddef.h>
|
||||
#include <ossddef.h>
|
||||
#ifndef SS$_NORMAL
|
||||
#define SS$_NORMAL 1
|
||||
#endif
|
||||
|
@ -45,10 +44,10 @@
|
|||
|
||||
typedef struct
|
||||
{
|
||||
unsigned long start_offset;
|
||||
unsigned long end_offset;
|
||||
unsigned long info_offset;
|
||||
unsigned long gp_value;
|
||||
unw_word start_offset;
|
||||
unw_word end_offset;
|
||||
unw_word info_offset;
|
||||
unw_word gp_value;
|
||||
} vms_unw_table_entry;
|
||||
|
||||
typedef unsigned long long uqword;
|
||||
|
@ -133,8 +132,8 @@ force_fallback_processing_for (void * pc, vms_unw_table_entry * entry)
|
|||
calls for fallback processing. */
|
||||
|
||||
struct unw_table_entry *
|
||||
_Unwind_FindTableEntry (void *pc, unsigned long *segment_base,
|
||||
unsigned long *gp, struct unw_table_entry *ent)
|
||||
_Unwind_FindTableEntry (void *pc, unw_word *segment_base,
|
||||
unw_word *gp, struct unw_table_entry *ent)
|
||||
{
|
||||
vms_unw_table_entry vueblock;
|
||||
|
||||
|
|
|
@ -114,20 +114,20 @@ enum unw_where
|
|||
|
||||
struct unw_reg_info
|
||||
{
|
||||
unsigned long val; /* save location: register number or offset */
|
||||
unw_word val; /* save location: register number or offset */
|
||||
enum unw_where where; /* where the register gets saved */
|
||||
int when; /* when the register gets saved */
|
||||
};
|
||||
|
||||
struct unw_reg_state {
|
||||
struct unw_reg_state *next; /* next (outer) element on state stack */
|
||||
struct unw_reg_info reg[UNW_NUM_REGS]; /* register save locations */
|
||||
struct unw_reg_state *next; /* next (outer) element on state stack */
|
||||
struct unw_reg_info reg[UNW_NUM_REGS]; /* register save locations */
|
||||
};
|
||||
|
||||
struct unw_labeled_state {
|
||||
struct unw_labeled_state *next; /* next labeled state (or NULL) */
|
||||
unsigned long label; /* label for this state */
|
||||
struct unw_reg_state saved_state;
|
||||
struct unw_labeled_state *next; /* next labeled state (or NULL) */
|
||||
unw_word label; /* label for this state */
|
||||
struct unw_reg_state saved_state;
|
||||
};
|
||||
|
||||
typedef struct unw_state_record
|
||||
|
@ -135,12 +135,12 @@ typedef struct unw_state_record
|
|||
unsigned int first_region : 1; /* is this the first region? */
|
||||
unsigned int done : 1; /* are we done scanning descriptors? */
|
||||
unsigned int any_spills : 1; /* got any register spills? */
|
||||
unsigned int in_body : 1; /* are we inside a body? */
|
||||
unsigned int in_body : 1; /* are we inside a body? */
|
||||
unsigned int no_reg_stack_frame : 1; /* Don't adjust bsp for i&l regs */
|
||||
unsigned char *imask; /* imask of spill_mask record or NULL */
|
||||
unsigned long pr_val; /* predicate values */
|
||||
unsigned long pr_mask; /* predicate mask */
|
||||
long spill_offset; /* psp-relative offset for spill base */
|
||||
unsigned char *imask; /* imask of spill_mask record or NULL */
|
||||
unw_word pr_val; /* predicate values */
|
||||
unw_word pr_mask; /* predicate mask */
|
||||
unw_sword spill_offset; /* psp-relative offset for spill base */
|
||||
int region_start;
|
||||
int region_len;
|
||||
int epilogue_start;
|
||||
|
@ -168,66 +168,64 @@ enum unw_nat_type
|
|||
|
||||
struct unw_stack
|
||||
{
|
||||
unsigned long limit;
|
||||
unsigned long top;
|
||||
unw_word limit;
|
||||
unw_word top;
|
||||
};
|
||||
|
||||
struct _Unwind_Context
|
||||
{
|
||||
/* Initial frame info. */
|
||||
unsigned long rnat; /* rse nat collection */
|
||||
unsigned long regstk_top; /* lowest address of rbs stored register
|
||||
which uses context->rnat collection */
|
||||
unw_word rnat; /* rse nat collection */
|
||||
unw_word regstk_top; /* lowest address of rbs stored register
|
||||
which uses context->rnat collection */
|
||||
|
||||
/* Current frame info. */
|
||||
unsigned long bsp; /* backing store pointer value
|
||||
corresponding to psp. */
|
||||
unsigned long sp; /* stack pointer value */
|
||||
unsigned long psp; /* previous sp value */
|
||||
unsigned long rp; /* return pointer */
|
||||
unsigned long pr; /* predicate collection */
|
||||
unw_word bsp; /* backing store pointer value
|
||||
corresponding to psp. */
|
||||
unw_word sp; /* stack pointer value */
|
||||
unw_word psp; /* previous sp value */
|
||||
unw_word rp; /* return pointer */
|
||||
unw_word pr; /* predicate collection */
|
||||
|
||||
unsigned long region_start; /* start of unwind region */
|
||||
unsigned long gp; /* global pointer value */
|
||||
void *lsda; /* language specific data area */
|
||||
unw_word region_start;/* start of unwind region */
|
||||
unw_word gp; /* global pointer value */
|
||||
void *lsda; /* language specific data area */
|
||||
|
||||
/* Preserved state. */
|
||||
unsigned long *bsp_loc; /* previous bsp save location
|
||||
Appears to be write-only? */
|
||||
unsigned long *bspstore_loc;
|
||||
unsigned long *pfs_loc; /* Save location for pfs in current
|
||||
(corr. to sp) frame. Target
|
||||
contains cfm for caller. */
|
||||
unsigned long *signal_pfs_loc;/* Save location for pfs in current
|
||||
signal frame. Target contains
|
||||
pfs for caller. */
|
||||
unsigned long *pri_unat_loc;
|
||||
unsigned long *unat_loc;
|
||||
unsigned long *lc_loc;
|
||||
unsigned long *fpsr_loc;
|
||||
unw_word *bsp_loc; /* previous bsp save location
|
||||
Appears to be write-only? */
|
||||
unw_word *bspstore_loc;
|
||||
unw_word *pfs_loc; /* Save location for pfs in current
|
||||
(corr. to sp) frame. Target
|
||||
contains cfm for caller. */
|
||||
unw_word *signal_pfs_loc;/* Save location for pfs in current
|
||||
signal frame. Target contains
|
||||
pfs for caller. */
|
||||
unw_word *pri_unat_loc;
|
||||
unw_word *unat_loc;
|
||||
unw_word *lc_loc;
|
||||
unw_word *fpsr_loc;
|
||||
|
||||
unsigned long eh_data[4];
|
||||
unw_word eh_data[4];
|
||||
|
||||
struct unw_ireg
|
||||
{
|
||||
unsigned long *loc;
|
||||
unw_word *loc;
|
||||
struct unw_ireg_nat
|
||||
{
|
||||
enum unw_nat_type type : 3;
|
||||
signed long off : 61; /* NaT word is at loc+nat.off */
|
||||
unw_sword off : 61; /* NaT word is at loc+nat.off */
|
||||
} nat;
|
||||
} ireg[32 - 2]; /* Indexed by <register number> - 2 */
|
||||
|
||||
unsigned long *br_loc[8];
|
||||
unw_word *br_loc[8];
|
||||
void *fr_loc[32 - 2];
|
||||
|
||||
/* ??? We initially point pri_unat_loc here. The entire NAT bit
|
||||
logic needs work. */
|
||||
unsigned long initial_unat;
|
||||
unw_word initial_unat;
|
||||
};
|
||||
|
||||
typedef unsigned long unw_word;
|
||||
|
||||
/* Implicit register save order. See section 11.4.2.3 Rules for Using
|
||||
Unwind Descriptors, rule 3. */
|
||||
|
||||
|
@ -464,7 +462,7 @@ decode_abreg (unsigned char abreg, int memory)
|
|||
|
||||
static void
|
||||
set_reg (struct unw_reg_info *reg, enum unw_where where,
|
||||
int when, unsigned long val)
|
||||
int when, unw_word val)
|
||||
{
|
||||
reg->val = val;
|
||||
reg->where = where;
|
||||
|
@ -473,7 +471,7 @@ set_reg (struct unw_reg_info *reg, enum unw_where where,
|
|||
}
|
||||
|
||||
static void
|
||||
alloc_spill_area (unsigned long *offp, unsigned long regsize,
|
||||
alloc_spill_area (unw_word *offp, unw_word regsize,
|
||||
struct unw_reg_info *lo, struct unw_reg_info *hi)
|
||||
{
|
||||
struct unw_reg_info *reg;
|
||||
|
@ -512,7 +510,7 @@ static void
|
|||
finish_prologue (struct unw_state_record *sr)
|
||||
{
|
||||
struct unw_reg_info *reg;
|
||||
unsigned long off;
|
||||
unw_word off;
|
||||
int i;
|
||||
|
||||
/* First, resolve implicit register save locations
|
||||
|
@ -1449,44 +1447,44 @@ unw_decode (unsigned char *dp, int inside_body, void *arg)
|
|||
|
||||
/* RSE helper functions. */
|
||||
|
||||
static inline unsigned long
|
||||
ia64_rse_slot_num (unsigned long *addr)
|
||||
static inline unw_word
|
||||
ia64_rse_slot_num (unw_word *addr)
|
||||
{
|
||||
return (((unsigned long) addr) >> 3) & 0x3f;
|
||||
return (((unw_word) addr) >> 3) & 0x3f;
|
||||
}
|
||||
|
||||
/* Return TRUE if ADDR is the address of an RNAT slot. */
|
||||
static inline unsigned long
|
||||
ia64_rse_is_rnat_slot (unsigned long *addr)
|
||||
static inline unw_word
|
||||
ia64_rse_is_rnat_slot (unw_word *addr)
|
||||
{
|
||||
return ia64_rse_slot_num (addr) == 0x3f;
|
||||
}
|
||||
|
||||
/* Returns the address of the RNAT slot that covers the slot at
|
||||
address SLOT_ADDR. */
|
||||
static inline unsigned long *
|
||||
ia64_rse_rnat_addr (unsigned long *slot_addr)
|
||||
static inline unw_word *
|
||||
ia64_rse_rnat_addr (unw_word *slot_addr)
|
||||
{
|
||||
return (unsigned long *) ((unsigned long) slot_addr | (0x3f << 3));
|
||||
return (unw_word *) ((unw_word) slot_addr | (0x3f << 3));
|
||||
}
|
||||
|
||||
/* Calculate the number of registers in the dirty partition starting at
|
||||
BSPSTORE with a size of DIRTY bytes. This isn't simply DIRTY
|
||||
divided by eight because the 64th slot is used to store ar.rnat. */
|
||||
static inline unsigned long
|
||||
ia64_rse_num_regs (unsigned long *bspstore, unsigned long *bsp)
|
||||
static inline unw_word
|
||||
ia64_rse_num_regs (unw_word *bspstore, unw_word *bsp)
|
||||
{
|
||||
unsigned long slots = (bsp - bspstore);
|
||||
unw_word slots = (bsp - bspstore);
|
||||
|
||||
return slots - (ia64_rse_slot_num (bspstore) + slots)/0x40;
|
||||
}
|
||||
|
||||
/* The inverse of the above: given bspstore and the number of
|
||||
registers, calculate ar.bsp. */
|
||||
static inline unsigned long *
|
||||
ia64_rse_skip_regs (unsigned long *addr, long num_regs)
|
||||
static inline unw_word *
|
||||
ia64_rse_skip_regs (unw_word *addr, int num_regs)
|
||||
{
|
||||
long delta = ia64_rse_slot_num (addr) + num_regs;
|
||||
int delta = ia64_rse_slot_num (addr) + num_regs;
|
||||
|
||||
if (num_regs < 0)
|
||||
delta -= 0x3e;
|
||||
|
@ -1501,20 +1499,20 @@ ia64_rse_skip_regs (unsigned long *addr, long num_regs)
|
|||
done with a simple memcpy as the nat collections will be
|
||||
at different relative offsets and need to be combined together. */
|
||||
static void
|
||||
ia64_copy_rbs (struct _Unwind_Context *info, unsigned long dst,
|
||||
unsigned long src, long len, unsigned long dst_rnat)
|
||||
ia64_copy_rbs (struct _Unwind_Context *info, unw_word dst,
|
||||
unw_word src, unw_word len, unw_word dst_rnat)
|
||||
{
|
||||
long count;
|
||||
unsigned long src_rnat;
|
||||
unsigned long shift1, shift2;
|
||||
unw_word count;
|
||||
unw_word src_rnat;
|
||||
unw_word shift1, shift2;
|
||||
|
||||
len <<= 3;
|
||||
dst_rnat &= (1UL << ((dst >> 3) & 0x3f)) - 1;
|
||||
dst_rnat &= (1ULL << ((dst >> 3) & 0x3f)) - 1;
|
||||
src_rnat = src >= info->regstk_top
|
||||
? info->rnat : *(unsigned long *) (src | 0x1f8);
|
||||
src_rnat &= ~((1UL << ((src >> 3) & 0x3f)) - 1);
|
||||
? info->rnat : *(unw_word *) (src | 0x1f8);
|
||||
src_rnat &= ~((1ULL << ((src >> 3) & 0x3f)) - 1);
|
||||
/* Just to make sure. */
|
||||
src_rnat &= ~(1UL << 63);
|
||||
src_rnat &= ~(1ULL << 63);
|
||||
shift1 = ((dst - src) >> 3) & 0x3f;
|
||||
if ((dst & 0x1f8) < (src & 0x1f8))
|
||||
shift1--;
|
||||
|
@ -1529,9 +1527,9 @@ ia64_copy_rbs (struct _Unwind_Context *info, unsigned long dst,
|
|||
while (len > 0)
|
||||
{
|
||||
src_rnat = src >= info->regstk_top
|
||||
? info->rnat : *(unsigned long *) (src | 0x1f8);
|
||||
? info->rnat : *(unw_word *) (src | 0x1f8);
|
||||
/* Just to make sure. */
|
||||
src_rnat &= ~(1UL << 63);
|
||||
src_rnat &= ~(1ULL << 63);
|
||||
count = shift2 << 3;
|
||||
first:
|
||||
if (count > len)
|
||||
|
@ -1540,10 +1538,10 @@ first:
|
|||
dst += count;
|
||||
src += count;
|
||||
len -= count;
|
||||
dst_rnat |= (src_rnat << shift1) & ~(1UL << 63);
|
||||
dst_rnat |= (src_rnat << shift1) & ~(1ULL << 63);
|
||||
if (len <= 0)
|
||||
break;
|
||||
*(long *) dst = dst_rnat;
|
||||
*(unw_word *) dst = dst_rnat;
|
||||
dst += 8;
|
||||
dst_rnat = 0;
|
||||
count = shift1 << 3;
|
||||
|
@ -1558,13 +1556,13 @@ second:
|
|||
}
|
||||
if ((dst & 0x1f8) == 0x1f8)
|
||||
{
|
||||
*(long *) dst = dst_rnat;
|
||||
*(unw_word *) dst = dst_rnat;
|
||||
dst += 8;
|
||||
dst_rnat = 0;
|
||||
}
|
||||
/* Set info->regstk_top to lowest rbs address which will use
|
||||
info->rnat collection. */
|
||||
info->regstk_top = dst & ~0x1ffUL;
|
||||
info->regstk_top = dst & ~0x1ffULL;
|
||||
info->rnat = dst_rnat;
|
||||
}
|
||||
|
||||
|
@ -1572,9 +1570,9 @@ second:
|
|||
|
||||
static void
|
||||
unw_access_gr (struct _Unwind_Context *info, int regnum,
|
||||
unsigned long *val, char *nat, int write)
|
||||
unw_word *val, char *nat, int write)
|
||||
{
|
||||
unsigned long *addr, *nat_addr = 0, nat_mask = 0, dummy_nat;
|
||||
unw_word *addr, *nat_addr = 0, nat_mask = 0, dummy_nat;
|
||||
struct unw_ireg *ireg;
|
||||
|
||||
if ((unsigned) regnum - 1 >= 127)
|
||||
|
@ -1623,15 +1621,15 @@ unw_access_gr (struct _Unwind_Context *info, int regnum,
|
|||
break;
|
||||
|
||||
case UNW_NAT_MEMSTK:
|
||||
nat_mask = 1UL << ((long) addr & 0x1f8)/8;
|
||||
nat_mask = 1UL << ((unw_word) addr & 0x1f8)/8;
|
||||
break;
|
||||
|
||||
case UNW_NAT_REGSTK:
|
||||
if ((unsigned long) addr >= info->regstk_top)
|
||||
if ((unw_word) addr >= info->regstk_top)
|
||||
nat_addr = &info->rnat;
|
||||
else
|
||||
nat_addr = ia64_rse_rnat_addr (addr);
|
||||
nat_mask = 1UL << ia64_rse_slot_num (addr);
|
||||
nat_mask = 1ULL << ia64_rse_slot_num (addr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1639,8 +1637,8 @@ unw_access_gr (struct _Unwind_Context *info, int regnum,
|
|||
else
|
||||
{
|
||||
/* Access a stacked register. */
|
||||
addr = ia64_rse_skip_regs ((unsigned long *) info->bsp, regnum - 32);
|
||||
if ((unsigned long) addr >= info->regstk_top)
|
||||
addr = ia64_rse_skip_regs ((unw_word *) info->bsp, regnum - 32);
|
||||
if ((unw_word) addr >= info->regstk_top)
|
||||
nat_addr = &info->rnat;
|
||||
else
|
||||
nat_addr = ia64_rse_rnat_addr (addr);
|
||||
|
@ -1734,7 +1732,7 @@ void *
|
|||
_Unwind_FindEnclosingFunction (void *pc)
|
||||
{
|
||||
struct unw_table_entry *entp, ent;
|
||||
unsigned long segment_base, gp;
|
||||
unw_word segment_base, gp;
|
||||
|
||||
entp = _Unwind_FindTableEntry (pc, &segment_base, &gp, &ent);
|
||||
if (entp == NULL)
|
||||
|
@ -1774,9 +1772,9 @@ static _Unwind_Reason_Code
|
|||
uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
||||
{
|
||||
struct unw_table_entry *entp, ent;
|
||||
unsigned long *unw, header, length;
|
||||
unw_word *unw, header, length;
|
||||
unsigned char *insn, *insn_end;
|
||||
unsigned long segment_base;
|
||||
unw_word segment_base;
|
||||
struct unw_reg_info *r;
|
||||
|
||||
memset (fs, 0, sizeof (*fs));
|
||||
|
@ -1815,7 +1813,7 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
|||
fs->when_target = ((context->rp & -16) - context->region_start) / 16 * 3
|
||||
+ (context->rp & 15);
|
||||
|
||||
unw = (unsigned long *) (entp->info_offset + segment_base);
|
||||
unw = (unw_word *) (entp->info_offset + segment_base);
|
||||
header = *unw;
|
||||
length = UNW_LENGTH (header);
|
||||
|
||||
|
@ -1912,7 +1910,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
{
|
||||
struct unw_reg_info *r = fs->curr.reg + regno;
|
||||
void *addr;
|
||||
unsigned long rval;
|
||||
unw_word rval;
|
||||
|
||||
if (r->where == UNW_WHERE_NONE || r->when >= fs->when_target)
|
||||
return;
|
||||
|
@ -1922,12 +1920,12 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
{
|
||||
case UNW_WHERE_GR:
|
||||
if (rval >= 32)
|
||||
addr = ia64_rse_skip_regs ((unsigned long *) context->bsp, rval - 32);
|
||||
addr = ia64_rse_skip_regs ((unw_word *) context->bsp, rval - 32);
|
||||
else if (rval >= 2)
|
||||
addr = context->ireg[rval - 2].loc;
|
||||
else if (rval == 0)
|
||||
{
|
||||
static const unsigned long dummy;
|
||||
static const unw_word dummy;
|
||||
addr = (void *) &dummy;
|
||||
}
|
||||
else
|
||||
|
@ -1974,7 +1972,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
{
|
||||
context->ireg[regno - UNW_REG_R2].nat.type = UNW_NAT_MEMSTK;
|
||||
context->ireg[regno - UNW_REG_R2].nat.off
|
||||
= context->pri_unat_loc - (unsigned long *) addr;
|
||||
= context->pri_unat_loc - (unw_word *) addr;
|
||||
}
|
||||
else if (rval >= 2)
|
||||
{
|
||||
|
@ -2004,7 +2002,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
case UNW_WHERE_SPREL:
|
||||
context->ireg[regno - UNW_REG_R2].nat.type = UNW_NAT_MEMSTK;
|
||||
context->ireg[regno - UNW_REG_R2].nat.off
|
||||
= context->pri_unat_loc - (unsigned long *) addr;
|
||||
= context->pri_unat_loc - (unw_word *) addr;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2030,13 +2028,13 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
context->pfs_loc = addr;
|
||||
break;
|
||||
case UNW_REG_RP:
|
||||
context->rp = *(unsigned long *)addr;
|
||||
context->rp = *(unw_word *)addr;
|
||||
break;
|
||||
case UNW_REG_UNAT:
|
||||
context->unat_loc = addr;
|
||||
break;
|
||||
case UNW_REG_PR:
|
||||
context->pr = *(unsigned long *) addr;
|
||||
context->pr = *(unw_word *) addr;
|
||||
break;
|
||||
case UNW_REG_LC:
|
||||
context->lc_loc = addr;
|
||||
|
@ -2046,7 +2044,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
break;
|
||||
|
||||
case UNW_REG_PSP:
|
||||
context->psp = *(unsigned long *)addr;
|
||||
context->psp = *(unw_word *)addr;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2057,7 +2055,7 @@ uw_update_reg_address (struct _Unwind_Context *context,
|
|||
static void
|
||||
uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
||||
{
|
||||
long i;
|
||||
int i;
|
||||
|
||||
#ifdef MD_HANDLE_UNWABI
|
||||
MD_HANDLE_UNWABI (context, fs);
|
||||
|
@ -2100,10 +2098,10 @@ uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
|||
pfs_loc is valid. */
|
||||
if (!(fs -> no_reg_stack_frame))
|
||||
{
|
||||
unsigned long pfs = *context->pfs_loc;
|
||||
unsigned long sol = (pfs >> 7) & 0x7f;
|
||||
context->bsp = (unsigned long)
|
||||
ia64_rse_skip_regs ((unsigned long *) context->bsp, -sol);
|
||||
unw_word pfs = *context->pfs_loc;
|
||||
unw_word sol = (pfs >> 7) & 0x7f;
|
||||
context->bsp = (unw_word)
|
||||
ia64_rse_skip_regs ((unw_word *) context->bsp, -sol);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2132,7 +2130,7 @@ uw_init_context_1 (struct _Unwind_Context *context, void *bsp)
|
|||
/* Set psp to the caller's stack pointer. */
|
||||
void *psp = __builtin_dwarf_cfa () - 16;
|
||||
_Unwind_FrameState fs;
|
||||
unsigned long rnat, tmp1, tmp2;
|
||||
unw_word rnat, tmp1, tmp2;
|
||||
|
||||
/* Flush the register stack to memory so that we can access it.
|
||||
Get rse nat collection for the last incomplete rbs chunk of
|
||||
|
@ -2147,13 +2145,13 @@ uw_init_context_1 (struct _Unwind_Context *context, void *bsp)
|
|||
: "=r" (rnat), "=r" (tmp1), "=r" (tmp2));
|
||||
|
||||
memset (context, 0, sizeof (struct _Unwind_Context));
|
||||
context->bsp = (unsigned long) bsp;
|
||||
context->bsp = (unw_word) bsp;
|
||||
/* Set context->regstk_top to lowest rbs address which will use
|
||||
context->rnat collection. */
|
||||
context->regstk_top = context->bsp & ~0x1ffULL;
|
||||
context->rnat = rnat;
|
||||
context->psp = (unsigned long) psp;
|
||||
context->rp = (unsigned long) rp;
|
||||
context->psp = (unw_word) psp;
|
||||
context->rp = (unw_word) rp;
|
||||
asm ("mov %0 = sp" : "=r" (context->sp));
|
||||
asm ("mov %0 = pr" : "=r" (context->pr));
|
||||
context->pri_unat_loc = &context->initial_unat; /* ??? */
|
||||
|
@ -2170,8 +2168,8 @@ static void __attribute__((noreturn))
|
|||
uw_install_context (struct _Unwind_Context *current __attribute__((unused)),
|
||||
struct _Unwind_Context *target)
|
||||
{
|
||||
unsigned long ireg_buf[4], ireg_nat = 0, ireg_pr = 0;
|
||||
long i;
|
||||
unw_word ireg_buf[4], ireg_nat = 0, ireg_pr = 0;
|
||||
int i;
|
||||
|
||||
/* Copy integer register data from the target context to a
|
||||
temporary buffer. Do this so that we can frob AR.UNAT
|
||||
|
@ -2183,7 +2181,7 @@ uw_install_context (struct _Unwind_Context *current __attribute__((unused)),
|
|||
if (t)
|
||||
{
|
||||
unw_access_gr (target, i, &ireg_buf[i - 4], &nat, 0);
|
||||
ireg_nat |= (long)nat << (((size_t)&ireg_buf[i - 4] >> 3) & 0x3f);
|
||||
ireg_nat |= (unw_word)nat << (((size_t)&ireg_buf[i - 4] >> 3) & 0x3f);
|
||||
/* Set p6 - p9. */
|
||||
ireg_pr |= 4L << i;
|
||||
}
|
||||
|
@ -2193,12 +2191,12 @@ uw_install_context (struct _Unwind_Context *current __attribute__((unused)),
|
|||
target function. The value that we install below will be
|
||||
adjusted by the BR.RET instruction based on the contents
|
||||
of AR.PFS. So we must unadjust that here. */
|
||||
target->bsp = (unsigned long)
|
||||
ia64_rse_skip_regs ((unsigned long *)target->bsp,
|
||||
target->bsp = (unw_word)
|
||||
ia64_rse_skip_regs ((unw_word *)target->bsp,
|
||||
(*target->pfs_loc >> 7) & 0x7f);
|
||||
|
||||
if (target->bsp < target->regstk_top)
|
||||
target->rnat = *ia64_rse_rnat_addr ((unsigned long *) target->bsp);
|
||||
target->rnat = *ia64_rse_rnat_addr ((unw_word *) target->bsp);
|
||||
|
||||
/* Provide assembly with the offsets into the _Unwind_Context. */
|
||||
asm volatile ("uc_rnat = %0"
|
||||
|
|
|
@ -18,11 +18,20 @@
|
|||
along with GCC; see the file COPYING3. If not see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifdef __VMS__
|
||||
/* On VMS, long is a 32 bit type. */
|
||||
typedef unsigned long long unw_word;
|
||||
typedef long long unw_sword;
|
||||
#else
|
||||
typedef unsigned long unw_word;
|
||||
typedef long unw_sword;
|
||||
#endif
|
||||
|
||||
struct unw_table_entry
|
||||
{
|
||||
unsigned long start_offset;
|
||||
unsigned long end_offset;
|
||||
unsigned long info_offset;
|
||||
unw_word start_offset;
|
||||
unw_word end_offset;
|
||||
unw_word info_offset;
|
||||
};
|
||||
|
||||
/* Accessors to fields of an unwind info block header. In this common file to
|
||||
|
@ -38,6 +47,6 @@ struct unw_table_entry
|
|||
#endif
|
||||
|
||||
extern struct unw_table_entry *
|
||||
_Unwind_FindTableEntry (void *pc, unsigned long *segment_base,
|
||||
unsigned long *gp, struct unw_table_entry *ent)
|
||||
_Unwind_FindTableEntry (void *pc, unw_word *segment_base,
|
||||
unw_word *gp, struct unw_table_entry *ent)
|
||||
__attribute__ ((__visibility__ ("hidden")));
|
||||
|
|
|
@ -22,12 +22,11 @@
|
|||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <vms/libicb.h>
|
||||
#include <vms/chfdef.h>
|
||||
#include <vms/chfctxdef.h>
|
||||
|
||||
#define __int64 long long
|
||||
#include <vms/intstkdef.h>
|
||||
#define __NEW_STARLET
|
||||
#include <libicb.h>
|
||||
#include <chfdef.h>
|
||||
#include <lib_c/chfctxdef.h>
|
||||
#include <lib_c/intstkdef.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
Loading…
Add table
Reference in a new issue