* rs6000-tdep.c: Update for unwinder changes.

* ppcobsd-tdep.c: Likewise.
This commit is contained in:
Ulrich Weigand
2008-05-01 00:40:39 +00:00
parent e4e5049b7b
commit 1af5d7ceb5
3 changed files with 62 additions and 79 deletions

View File

@ -1,3 +1,8 @@
2008-04-30 Ulrich Weigand <uweigand@de.ibm.com>
* rs6000-tdep.c: Update for unwinder changes.
* ppcobsd-tdep.c: Likewise.
2008-04-30 Ulrich Weigand <uweigand@de.ibm.com>
* s390-tdep.c: Update for unwinder changes.

View File

@ -121,9 +121,11 @@ static const int ppcobsd_sigreturn_offset[] = {
};
static int
ppcobsd_sigtramp_p (struct frame_info *next_frame)
ppcobsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
CORE_ADDR start_pc = (pc & ~(ppcobsd_page_size - 1));
const int *offset;
char *name;
@ -137,7 +139,7 @@ ppcobsd_sigtramp_p (struct frame_info *next_frame)
gdb_byte buf[2 * PPC_INSN_SIZE];
unsigned long insn;
if (!safe_frame_unwind_memory (next_frame, start_pc + *offset,
if (!safe_frame_unwind_memory (this_frame, start_pc + *offset,
buf, sizeof buf))
continue;
@ -158,9 +160,9 @@ ppcobsd_sigtramp_p (struct frame_info *next_frame)
}
static struct trad_frame_cache *
ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
ppcobsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
struct trad_frame_cache *cache;
CORE_ADDR addr, base, func;
@ -171,12 +173,12 @@ ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
if (*this_cache)
return *this_cache;
cache = trad_frame_cache_zalloc (next_frame);
cache = trad_frame_cache_zalloc (this_frame);
*this_cache = cache;
func = frame_pc_unwind (next_frame);
func = get_frame_pc (this_frame);
func &= ~(ppcobsd_page_size - 1);
if (!safe_frame_unwind_memory (next_frame, func, buf, sizeof buf))
if (!safe_frame_unwind_memory (this_frame, func, buf, sizeof buf))
return cache;
/* Calculate the offset where we can find `struct sigcontext'. We
@ -185,8 +187,7 @@ ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
insn = extract_unsigned_integer (buf, PPC_INSN_SIZE);
sigcontext_offset = (0x10000 - (insn & 0x0000ffff)) + 8;
base = frame_unwind_register_unsigned (next_frame,
gdbarch_sp_regnum (gdbarch));
base = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch));
addr = base + sigcontext_offset + 2 * tdep->wordsize;
for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize)
{
@ -212,43 +213,32 @@ ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
}
static void
ppcobsd_sigtramp_frame_this_id (struct frame_info *next_frame,
ppcobsd_sigtramp_frame_this_id (struct frame_info *this_frame,
void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
ppcobsd_sigtramp_frame_cache (next_frame, this_cache);
ppcobsd_sigtramp_frame_cache (this_frame, this_cache);
trad_frame_get_id (cache, this_id);
}
static void
ppcobsd_sigtramp_frame_prev_register (struct frame_info *next_frame,
void **this_cache, int regnum,
int *optimizedp, enum lval_type *lvalp,
CORE_ADDR *addrp, int *realnump,
gdb_byte *valuep)
static struct value *
ppcobsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
ppcobsd_sigtramp_frame_cache (next_frame, this_cache);
ppcobsd_sigtramp_frame_cache (this_frame, this_cache);
trad_frame_get_register (cache, next_frame, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_register (cache, this_frame, regnum);
}
static const struct frame_unwind ppcobsd_sigtramp_frame_unwind = {
SIGTRAMP_FRAME,
ppcobsd_sigtramp_frame_this_id,
ppcobsd_sigtramp_frame_prev_register
ppcobsd_sigtramp_frame_prev_register,
NULL,
ppcobsd_sigtramp_frame_sniffer
};
static const struct frame_unwind *
ppcobsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
if (ppcobsd_sigtramp_p (next_frame))
return &ppcobsd_sigtramp_frame_unwind;
return NULL;
}
static void
@ -268,7 +258,7 @@ ppcobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
set_gdbarch_regset_from_core_section
(gdbarch, ppcobsd_regset_from_core_section);
frame_unwind_append_sniffer (gdbarch, ppcobsd_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &ppcobsd_sigtramp_frame_unwind);
}

View File

@ -2943,11 +2943,11 @@ rs6000_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
rs6000_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
rs6000_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (frame_unwind_register_unsigned
(next_frame, gdbarch_sp_regnum (gdbarch)),
frame_pc_unwind (next_frame));
return frame_id_build (get_frame_register_unsigned
(this_frame, gdbarch_sp_regnum (gdbarch)),
get_frame_pc (this_frame));
}
struct rs6000_frame_cache
@ -2958,10 +2958,10 @@ struct rs6000_frame_cache
};
static struct rs6000_frame_cache *
rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
rs6000_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct rs6000_frame_cache *cache;
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
struct rs6000_framedata fdata;
int wordsize = tdep->wordsize;
@ -2971,10 +2971,10 @@ rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
return (*this_cache);
cache = FRAME_OBSTACK_ZALLOC (struct rs6000_frame_cache);
(*this_cache) = cache;
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
func = frame_func_unwind (next_frame, NORMAL_FRAME);
pc = frame_pc_unwind (next_frame);
func = get_frame_func (this_frame);
pc = get_frame_pc (this_frame);
skip_prologue (gdbarch, func, pc, &fdata);
/* Figure out the parent's stack pointer. */
@ -2984,8 +2984,8 @@ rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
->frame pointed to the outer-most address of the frame. In
the mean time, the address of the prev frame is used as the
base address of this frame. */
cache->base = frame_unwind_register_unsigned
(next_frame, gdbarch_sp_regnum (gdbarch));
cache->base = get_frame_register_unsigned
(this_frame, gdbarch_sp_regnum (gdbarch));
/* If the function appears to be frameless, check a couple of likely
indicators that we have simply failed to find the frame setup.
@ -3001,8 +3001,7 @@ rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
CORE_ADDR saved_lr;
int make_frame = 0;
saved_lr = frame_unwind_register_unsigned (next_frame,
tdep->ppc_lr_regnum);
saved_lr = get_frame_register_unsigned (this_frame, tdep->ppc_lr_regnum);
if (func == 0 && saved_lr == pc)
make_frame = 1;
else if (func != 0)
@ -3114,58 +3113,47 @@ rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
if (fdata.alloca_reg < 0)
/* If no alloca register used, then fi->frame is the value of the
%sp for this frame, and it is good enough. */
cache->initial_sp = frame_unwind_register_unsigned
(next_frame, gdbarch_sp_regnum (gdbarch));
cache->initial_sp
= get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch));
else
cache->initial_sp = frame_unwind_register_unsigned (next_frame,
fdata.alloca_reg);
cache->initial_sp
= get_frame_register_unsigned (this_frame, fdata.alloca_reg);
return cache;
}
static void
rs6000_frame_this_id (struct frame_info *next_frame, void **this_cache,
rs6000_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
struct rs6000_frame_cache *info = rs6000_frame_cache (this_frame,
this_cache);
(*this_id) = frame_id_build (info->base,
frame_func_unwind (next_frame, NORMAL_FRAME));
(*this_id) = frame_id_build (info->base, get_frame_func (this_frame));
}
static void
rs6000_frame_prev_register (struct frame_info *next_frame,
void **this_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *valuep)
static struct value *
rs6000_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
struct rs6000_frame_cache *info = rs6000_frame_cache (this_frame,
this_cache);
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
static const struct frame_unwind rs6000_frame_unwind =
{
NORMAL_FRAME,
rs6000_frame_this_id,
rs6000_frame_prev_register
rs6000_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
rs6000_frame_sniffer (struct frame_info *next_frame)
{
return &rs6000_frame_unwind;
}
static CORE_ADDR
rs6000_frame_base_address (struct frame_info *next_frame,
void **this_cache)
rs6000_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
struct rs6000_frame_cache *info = rs6000_frame_cache (this_frame,
this_cache);
return info->initial_sp;
}
@ -3178,7 +3166,7 @@ static const struct frame_base rs6000_frame_base = {
};
static const struct frame_base *
rs6000_frame_base_sniffer (struct frame_info *next_frame)
rs6000_frame_base_sniffer (struct frame_info *this_frame)
{
return &rs6000_frame_base;
}
@ -3785,7 +3773,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_skip_trampoline_code (gdbarch, rs6000_skip_trampoline_code);
/* Hook in the DWARF CFI frame unwinder. */
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
dwarf2_frame_set_adjust_regnum (gdbarch, rs6000_adjust_frame_regnum);
/* Frame handling. */
@ -3801,16 +3789,16 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
case GDB_OSABI_NETBSD_ELF:
case GDB_OSABI_UNKNOWN:
set_gdbarch_unwind_pc (gdbarch, rs6000_unwind_pc);
frame_unwind_append_sniffer (gdbarch, rs6000_frame_sniffer);
set_gdbarch_unwind_dummy_id (gdbarch, rs6000_unwind_dummy_id);
frame_unwind_append_unwinder (gdbarch, &rs6000_frame_unwind);
set_gdbarch_dummy_id (gdbarch, rs6000_dummy_id);
frame_base_append_sniffer (gdbarch, rs6000_frame_base_sniffer);
break;
default:
set_gdbarch_believe_pcc_promotion (gdbarch, 1);
set_gdbarch_unwind_pc (gdbarch, rs6000_unwind_pc);
frame_unwind_append_sniffer (gdbarch, rs6000_frame_sniffer);
set_gdbarch_unwind_dummy_id (gdbarch, rs6000_unwind_dummy_id);
frame_unwind_append_unwinder (gdbarch, &rs6000_frame_unwind);
set_gdbarch_dummy_id (gdbarch, rs6000_dummy_id);
frame_base_append_sniffer (gdbarch, rs6000_frame_base_sniffer);
}