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

* alpha-linux-tdep.c: Likewise.
	* alphanbsd-tdep.c: Likewise.
	* alphaobsd-tdep.c: Likewise.
	* avr-tdep.c: Likewise.
	* cris-tdep.c: Likewise.
	* frv-linux-tdep.c: Likewise.
	* frv-tdep.c: Likewise.
	* h8300-tdep.c: Likewise.
	* hppa-linux-tdep.c: Likewise.
	* iq2000-tdep.c: Likewise.
	* m32c-tdep.c: Likewise.
	* m32r-linux-tdep.c: Likewise.
	* m32r-tdep.c: Likewise.
	* m68hc11-tdep.c: Likewise.
	* mep-tdep.c: Likewise.
	* mn10300-tdep.c: Likewise.
	* mt-tdep.c: Likewise.
	* score-tdep.c: Likewise.
	* sh64-tdep.c: Likewise.
	* sh-tdep.c: Likewise.
	* sparc64fbsd-tdep.c: Likewise.
	* sparc64nbsd-tdep.c: Likewise.
	* sparc64obsd-tdep.c: Likewise.
	* v850-tdep.c: Likewise.
	* vaxobsd-tdep.c: Likewise.
	* vax-tdep.c: Likewise.
	* xstormy16-tdep.c: Likewise.
This commit is contained in:
Ulrich Weigand 2008-06-28 17:29:04 +00:00
parent e111d6c920
commit 94afd7a6d3
29 changed files with 936 additions and 1210 deletions

View File

@ -1,3 +1,34 @@
2008-06-28 Ulrich Weigand <uweigand@de.ibm.com>
* alphafbsd-tdep.c: Update for unwinder changes.
* alpha-linux-tdep.c: Likewise.
* alphanbsd-tdep.c: Likewise.
* alphaobsd-tdep.c: Likewise.
* avr-tdep.c: Likewise.
* cris-tdep.c: Likewise.
* frv-linux-tdep.c: Likewise.
* frv-tdep.c: Likewise.
* h8300-tdep.c: Likewise.
* hppa-linux-tdep.c: Likewise.
* iq2000-tdep.c: Likewise.
* m32c-tdep.c: Likewise.
* m32r-linux-tdep.c: Likewise.
* m32r-tdep.c: Likewise.
* m68hc11-tdep.c: Likewise.
* mep-tdep.c: Likewise.
* mn10300-tdep.c: Likewise.
* mt-tdep.c: Likewise.
* score-tdep.c: Likewise.
* sh64-tdep.c: Likewise.
* sh-tdep.c: Likewise.
* sparc64fbsd-tdep.c: Likewise.
* sparc64nbsd-tdep.c: Likewise.
* sparc64obsd-tdep.c: Likewise.
* v850-tdep.c: Likewise.
* vaxobsd-tdep.c: Likewise.
* vax-tdep.c: Likewise.
* xstormy16-tdep.c: Likewise.
2008-06-28 Vladimir Prus <vladimir@codesourcery.com>
* mi/mi-main.c (enum captured_mi_execute_command_actions)

View File

@ -98,14 +98,14 @@ alpha_linux_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
}
static CORE_ADDR
alpha_linux_sigcontext_addr (struct frame_info *next_frame)
alpha_linux_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR pc;
ULONGEST sp;
long off;
pc = frame_pc_unwind (next_frame);
sp = frame_unwind_register_unsigned (next_frame, ALPHA_SP_REGNUM);
pc = get_frame_pc (this_frame);
sp = get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM);
off = alpha_linux_sigtramp_offset (pc);
gdb_assert (off >= 0);

View File

@ -76,13 +76,13 @@ alphafbsd_sigtramp_offset (CORE_ADDR pc)
return pc - alphafbsd_sigtramp_start;
}
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
routine, return the address of the associated sigcontext structure. */
/* Assuming THIS_FRAME is the frame of a BSD sigtramp routine,
return the address of the associated sigcontext structure. */
static CORE_ADDR
alphafbsd_sigcontext_addr (struct frame_info *next_frame)
alphafbsd_sigcontext_addr (struct frame_info *this_frame)
{
return frame_unwind_register_unsigned (next_frame, ALPHA_SP_REGNUM) + 24;
return get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM) + 24;
}
/* FreeBSD 5.0-RELEASE or later. */

View File

@ -253,7 +253,9 @@ alphanbsd_sigcontext_addr (struct frame_info *frame)
/* FIXME: This is not correct for all versions of NetBSD/alpha.
We will probably need to disassemble the trampoline to figure
out which trampoline frame type we have. */
return get_frame_base (frame);
if (!get_next_frame (frame))
return 0;
return get_frame_base (get_next_frame (frame));
}

View File

@ -68,26 +68,26 @@ alphaobsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
}
static CORE_ADDR
alphaobsd_sigcontext_addr (struct frame_info *next_frame)
alphaobsd_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
if (alphaobsd_sigtramp_offset (pc) < 3 * ALPHA_INSN_SIZE)
{
/* On entry, a pointer the `struct sigcontext' is passed in %a2. */
return frame_unwind_register_unsigned (next_frame, ALPHA_A0_REGNUM + 2);
return get_frame_register_unsigned (this_frame, ALPHA_A0_REGNUM + 2);
}
else if (alphaobsd_sigtramp_offset (pc) < 4 * ALPHA_INSN_SIZE)
{
/* It is stored on the stack Before calling the signal handler. */
CORE_ADDR sp;
sp = frame_unwind_register_unsigned (next_frame, ALPHA_SP_REGNUM);
return get_frame_memory_unsigned (next_frame, sp, 8);
sp = get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM);
return get_frame_memory_unsigned (this_frame, sp, 8);
}
else
{
/* It is reloaded into %a0 for the sigreturn(2) call. */
return frame_unwind_register_unsigned (next_frame, ALPHA_A0_REGNUM);
return get_frame_register_unsigned (this_frame, ALPHA_A0_REGNUM);
}
}

View File

@ -872,7 +872,7 @@ avr_return_value (struct gdbarch *gdbarch, struct type *func_type,
for it IS the sp for the next frame. */
struct avr_unwind_cache *
avr_frame_unwind_cache (struct frame_info *next_frame,
avr_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
CORE_ADDR pc;
@ -886,14 +886,14 @@ avr_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct avr_unwind_cache);
(*this_prologue_cache) = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
info->size = 0;
info->prologue_type = AVR_PROLOGUE_NONE;
pc = frame_func_unwind (next_frame, NORMAL_FRAME);
pc = get_frame_func (this_frame);
if ((pc > 0) && (pc < frame_pc_unwind (next_frame)))
if ((pc > 0) && (pc < get_frame_pc (this_frame)))
avr_scan_prologue (pc, info);
if ((info->prologue_type != AVR_PROLOGUE_NONE)
@ -904,8 +904,8 @@ avr_frame_unwind_cache (struct frame_info *next_frame,
/* The SP was moved to the FP. This indicates that a new frame
was created. Get THIS frame's FP value by unwinding it from
the next frame. */
this_base = frame_unwind_register_unsigned (next_frame, AVR_FP_REGNUM);
high_base = frame_unwind_register_unsigned (next_frame, AVR_FP_REGNUM+1);
this_base = get_frame_register_unsigned (this_frame, AVR_FP_REGNUM);
high_base = get_frame_register_unsigned (this_frame, AVR_FP_REGNUM+1);
this_base += (high_base << 8);
/* The FP points at the last saved register. Adjust the FP back
@ -916,7 +916,7 @@ avr_frame_unwind_cache (struct frame_info *next_frame,
{
/* Assume that the FP is this frame's SP but with that pushed
stack space added back. */
this_base = frame_unwind_register_unsigned (next_frame, AVR_SP_REGNUM);
this_base = get_frame_register_unsigned (this_frame, AVR_SP_REGNUM);
prev_sp = this_base + info->size;
}
@ -928,7 +928,7 @@ avr_frame_unwind_cache (struct frame_info *next_frame,
/* Adjust all the saved registers so that they contain addresses and not
offsets. */
for (i = 0; i < gdbarch_num_regs (get_frame_arch (next_frame)) - 1; i++)
for (i = 0; i < gdbarch_num_regs (get_frame_arch (this_frame)) - 1; i++)
if (info->saved_regs[i].addr)
{
info->saved_regs[i].addr = (info->prev_sp - info->saved_regs[i].addr);
@ -973,18 +973,18 @@ avr_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
frame. This will be used to create a new GDB frame struct. */
static void
avr_frame_this_id (struct frame_info *next_frame,
avr_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
struct avr_unwind_cache *info
= avr_frame_unwind_cache (next_frame, this_prologue_cache);
= avr_frame_unwind_cache (this_frame, this_prologue_cache);
CORE_ADDR base;
CORE_ADDR func;
struct frame_id id;
/* The FUNC is easy. */
func = frame_func_unwind (next_frame, NORMAL_FRAME);
func = get_frame_func (this_frame);
/* Hopefully the prologue analysis either correctly determined the
frame's base (which is the SP from the previous frame), or set
@ -997,83 +997,69 @@ avr_frame_this_id (struct frame_info *next_frame,
(*this_id) = id;
}
static void
avr_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
avr_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct avr_unwind_cache *info
= avr_frame_unwind_cache (next_frame, this_prologue_cache);
= avr_frame_unwind_cache (this_frame, this_prologue_cache);
if (regnum == AVR_PC_REGNUM)
{
if (trad_frame_addr_p (info->saved_regs, regnum))
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = info->saved_regs[regnum].addr;
*realnump = -1;
if (bufferp != NULL)
{
/* Reading the return PC from the PC register is slightly
abnormal. register_size(AVR_PC_REGNUM) says it is 4 bytes,
but in reality, only two bytes (3 in upcoming mega256) are
stored on the stack.
/* Reading the return PC from the PC register is slightly
abnormal. register_size(AVR_PC_REGNUM) says it is 4 bytes,
but in reality, only two bytes (3 in upcoming mega256) are
stored on the stack.
Also, note that the value on the stack is an addr to a word
not a byte, so we will need to multiply it by two at some
point.
Also, note that the value on the stack is an addr to a word
not a byte, so we will need to multiply it by two at some
point.
And to confuse matters even more, the return address stored
on the stack is in big endian byte order, even though most
everything else about the avr is little endian. Ick! */
And to confuse matters even more, the return address stored
on the stack is in big endian byte order, even though most
everything else about the avr is little endian. Ick! */
/* FIXME: number of bytes read here will need updated for the
mega256 when it is available. */
/* FIXME: number of bytes read here will need updated for the
mega256 when it is available. */
ULONGEST pc;
unsigned char tmp;
unsigned char buf[2];
ULONGEST pc;
unsigned char tmp;
unsigned char buf[2];
read_memory (info->saved_regs[regnum].addr, buf, 2);
read_memory (info->saved_regs[regnum].addr, buf, 2);
/* Convert the PC read from memory as a big-endian to
little-endian order. */
tmp = buf[0];
buf[0] = buf[1];
buf[1] = tmp;
/* Convert the PC read from memory as a big-endian to
little-endian order. */
tmp = buf[0];
buf[0] = buf[1];
buf[1] = tmp;
pc = (extract_unsigned_integer (buf, 2) * 2);
store_unsigned_integer
(bufferp, register_size (get_frame_arch (next_frame), regnum),
pc);
}
pc = (extract_unsigned_integer (buf, 2) * 2);
return frame_unwind_got_constant (this_frame, regnum, pc);
}
return frame_unwind_got_optimized (this_frame, regnum);
}
else
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
static const struct frame_unwind avr_frame_unwind = {
NORMAL_FRAME,
avr_frame_this_id,
avr_frame_prev_register
avr_frame_prev_register,
NULL,
default_frame_sniffer
};
const struct frame_unwind *
avr_frame_sniffer (struct frame_info *next_frame)
{
return &avr_frame_unwind;
}
static CORE_ADDR
avr_frame_base_address (struct frame_info *next_frame, void **this_cache)
avr_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct avr_unwind_cache *info
= avr_frame_unwind_cache (next_frame, this_cache);
= avr_frame_unwind_cache (this_frame, this_cache);
return info->base;
}
@ -1085,18 +1071,17 @@ static const struct frame_base avr_frame_base = {
avr_frame_base_address
};
/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
dummy frame. The frame ID's base needs to match the TOS value
saved by save_dummy_frame_tos(), and the PC match the dummy frame's
breakpoint. */
/* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
frame. The frame ID's base needs to match the TOS value saved by
save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
static struct frame_id
avr_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
avr_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
ULONGEST base;
base = frame_unwind_register_unsigned (next_frame, AVR_SP_REGNUM);
return frame_id_build (avr_make_saddr (base), frame_pc_unwind (next_frame));
base = get_frame_register_unsigned (this_frame, AVR_SP_REGNUM);
return frame_id_build (avr_make_saddr (base), get_frame_pc (this_frame));
}
/* When arguments must be pushed onto the stack, they go on in reverse
@ -1322,10 +1307,10 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_breakpoint_from_pc (gdbarch, avr_breakpoint_from_pc);
frame_unwind_append_sniffer (gdbarch, avr_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &avr_frame_unwind);
frame_base_set_default (gdbarch, &avr_frame_base);
set_gdbarch_unwind_dummy_id (gdbarch, avr_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, avr_dummy_id);
set_gdbarch_unwind_pc (gdbarch, avr_unwind_pc);
set_gdbarch_unwind_sp (gdbarch, avr_unwind_sp);

View File

@ -215,12 +215,12 @@ static const unsigned short rt_sigtramp_code[] =
the routine. Otherwise, return 0. */
static CORE_ADDR
cris_sigtramp_start (struct frame_info *next_frame)
cris_sigtramp_start (struct frame_info *this_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
gdb_byte buf[SIGTRAMP_LEN];
if (!safe_frame_unwind_memory (next_frame, pc, buf, SIGTRAMP_LEN))
if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
return 0;
if (((buf[1] << 8) + buf[0]) != SIGTRAMP_INSN0)
@ -229,7 +229,7 @@ cris_sigtramp_start (struct frame_info *next_frame)
return 0;
pc -= SIGTRAMP_OFFSET1;
if (!safe_frame_unwind_memory (next_frame, pc, buf, SIGTRAMP_LEN))
if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
return 0;
}
@ -243,12 +243,12 @@ cris_sigtramp_start (struct frame_info *next_frame)
the routine. Otherwise, return 0. */
static CORE_ADDR
cris_rt_sigtramp_start (struct frame_info *next_frame)
cris_rt_sigtramp_start (struct frame_info *this_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
gdb_byte buf[SIGTRAMP_LEN];
if (!safe_frame_unwind_memory (next_frame, pc, buf, SIGTRAMP_LEN))
if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
return 0;
if (((buf[1] << 8) + buf[0]) != SIGTRAMP_INSN0)
@ -257,7 +257,7 @@ cris_rt_sigtramp_start (struct frame_info *next_frame)
return 0;
pc -= SIGTRAMP_OFFSET1;
if (!safe_frame_unwind_memory (next_frame, pc, buf, SIGTRAMP_LEN))
if (!safe_frame_unwind_memory (this_frame, pc, buf, SIGTRAMP_LEN))
return 0;
}
@ -267,22 +267,22 @@ cris_rt_sigtramp_start (struct frame_info *next_frame)
return pc;
}
/* Assuming NEXT_FRAME is a frame following a GNU/Linux sigtramp
routine, return the address of the associated sigcontext structure. */
/* Assuming THIS_FRAME is a frame for a GNU/Linux sigtramp routine,
return the address of the associated sigcontext structure. */
static CORE_ADDR
cris_sigcontext_addr (struct frame_info *next_frame)
cris_sigcontext_addr (struct frame_info *this_frame)
{
CORE_ADDR pc;
CORE_ADDR sp;
char buf[4];
frame_unwind_register (next_frame,
gdbarch_sp_regnum (get_frame_arch (next_frame)), buf);
get_frame_register (this_frame,
gdbarch_sp_regnum (get_frame_arch (this_frame)), buf);
sp = extract_unsigned_integer (buf, 4);
/* Look for normal sigtramp frame first. */
pc = cris_sigtramp_start (next_frame);
pc = cris_sigtramp_start (this_frame);
if (pc)
{
/* struct signal_frame (arch/cris/kernel/signal.c) contains
@ -291,7 +291,7 @@ cris_sigcontext_addr (struct frame_info *next_frame)
return sp;
}
pc = cris_rt_sigtramp_start (next_frame);
pc = cris_rt_sigtramp_start (this_frame);
if (pc)
{
/* struct rt_signal_frame (arch/cris/kernel/signal.c) contains
@ -330,10 +330,10 @@ struct cris_unwind_cache
};
static struct cris_unwind_cache *
cris_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
cris_sigtramp_frame_unwind_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 cris_unwind_cache *info;
CORE_ADDR pc;
@ -347,7 +347,7 @@ cris_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct cris_unwind_cache);
(*this_cache) = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* Zero all fields. */
info->prev_sp = 0;
@ -359,10 +359,10 @@ cris_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
info->return_pc = 0;
info->leaf_function = 0;
frame_unwind_register (next_frame, gdbarch_sp_regnum (gdbarch), buf);
get_frame_register (this_frame, gdbarch_sp_regnum (gdbarch), buf);
info->base = extract_unsigned_integer (buf, 4);
addr = cris_sigcontext_addr (next_frame);
addr = cris_sigcontext_addr (this_frame);
/* Layout of the sigcontext struct:
struct sigcontext {
@ -425,51 +425,48 @@ cris_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
}
static void
cris_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache,
cris_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct cris_unwind_cache *cache =
cris_sigtramp_frame_unwind_cache (next_frame, this_cache);
(*this_id) = frame_id_build (cache->base, frame_pc_unwind (next_frame));
cris_sigtramp_frame_unwind_cache (this_frame, this_cache);
(*this_id) = frame_id_build (cache->base, get_frame_pc (this_frame));
}
/* Forward declaration. */
static void cris_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp);
static void
cris_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 *cris_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum);
static struct value *
cris_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
/* Make sure we've initialized the cache. */
cris_sigtramp_frame_unwind_cache (next_frame, this_cache);
cris_frame_prev_register (next_frame, this_cache, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
cris_sigtramp_frame_unwind_cache (this_frame, this_cache);
return cris_frame_prev_register (this_frame, this_cache, regnum);
}
static int
cris_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
if (cris_sigtramp_start (this_frame)
|| cris_rt_sigtramp_start (this_frame))
return 1;
return 0;
}
static const struct frame_unwind cris_sigtramp_frame_unwind =
{
SIGTRAMP_FRAME,
cris_sigtramp_frame_this_id,
cris_sigtramp_frame_prev_register
cris_sigtramp_frame_prev_register,
NULL,
cris_sigtramp_frame_sniffer
};
static const struct frame_unwind *
cris_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
if (cris_sigtramp_start (next_frame)
|| cris_rt_sigtramp_start (next_frame))
return &cris_sigtramp_frame_unwind;
return NULL;
}
int
crisv32_single_step_through_delay (struct gdbarch *gdbarch,
struct frame_info *this_frame)
@ -717,11 +714,11 @@ static void set_cris_dwarf2_cfi (char *ignore_args, int from_tty,
struct cmd_list_element *c);
static CORE_ADDR cris_scan_prologue (CORE_ADDR pc,
struct frame_info *next_frame,
struct frame_info *this_frame,
struct cris_unwind_cache *info);
static CORE_ADDR crisv32_scan_prologue (CORE_ADDR pc,
struct frame_info *next_frame,
struct frame_info *this_frame,
struct cris_unwind_cache *info);
static CORE_ADDR cris_unwind_pc (struct gdbarch *gdbarch,
@ -770,7 +767,7 @@ pop_stack_item (struct stack_item *si)
for it IS the sp for the next frame. */
struct cris_unwind_cache *
cris_frame_unwind_cache (struct frame_info *next_frame,
cris_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
CORE_ADDR pc;
@ -782,7 +779,7 @@ cris_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct cris_unwind_cache);
(*this_prologue_cache) = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* Zero all fields. */
info->prev_sp = 0;
@ -796,11 +793,9 @@ cris_frame_unwind_cache (struct frame_info *next_frame,
/* Prologue analysis does the rest... */
if (cris_version () == 32)
crisv32_scan_prologue (frame_func_unwind (next_frame, NORMAL_FRAME),
next_frame, info);
crisv32_scan_prologue (get_frame_func (this_frame), this_frame, info);
else
cris_scan_prologue (frame_func_unwind (next_frame, NORMAL_FRAME),
next_frame, info);
cris_scan_prologue (get_frame_func (this_frame), this_frame, info);
return info;
}
@ -809,18 +804,18 @@ cris_frame_unwind_cache (struct frame_info *next_frame,
frame. This will be used to create a new GDB frame struct. */
static void
cris_frame_this_id (struct frame_info *next_frame,
cris_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
struct cris_unwind_cache *info
= cris_frame_unwind_cache (next_frame, this_prologue_cache);
= cris_frame_unwind_cache (this_frame, this_prologue_cache);
CORE_ADDR base;
CORE_ADDR func;
struct frame_id id;
/* The FUNC is easy. */
func = frame_func_unwind (next_frame, NORMAL_FRAME);
func = get_frame_func (this_frame);
/* Hopefully the prologue analysis either correctly determined the
frame's base (which is the SP from the previous frame), or set
@ -834,29 +829,25 @@ cris_frame_this_id (struct frame_info *next_frame,
(*this_id) = id;
}
static void
cris_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
cris_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct cris_unwind_cache *info
= cris_frame_unwind_cache (next_frame, this_prologue_cache);
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
= cris_frame_unwind_cache (this_frame, this_prologue_cache);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
dummy frame. The frame ID's base needs to match the TOS value
saved by save_dummy_frame_tos(), and the PC match the dummy frame's
breakpoint. */
/* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
frame. The frame ID's base needs to match the TOS value saved by
save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
static struct frame_id
cris_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
cris_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (cris_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp;
sp = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch));
return frame_id_build (sp, get_frame_pc (this_frame));
}
static CORE_ADDR
@ -1011,20 +1002,16 @@ static const struct frame_unwind cris_frame_unwind =
{
NORMAL_FRAME,
cris_frame_this_id,
cris_frame_prev_register
cris_frame_prev_register,
NULL,
default_frame_sniffer
};
const struct frame_unwind *
cris_frame_sniffer (struct frame_info *next_frame)
{
return &cris_frame_unwind;
}
static CORE_ADDR
cris_frame_base_address (struct frame_info *next_frame, void **this_cache)
cris_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct cris_unwind_cache *info
= cris_frame_unwind_cache (next_frame, this_cache);
= cris_frame_unwind_cache (this_frame, this_cache);
return info->base;
}
@ -1113,10 +1100,10 @@ static const struct frame_base cris_frame_base =
determine that it is a prologue (1). */
static CORE_ADDR
cris_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
cris_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame,
struct cris_unwind_cache *info)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
/* Present instruction. */
unsigned short insn;
@ -1149,11 +1136,11 @@ cris_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
val = 0;
regsave = -1;
/* If we were called without a next_frame, that means we were called
/* If we were called without a this_frame, that means we were called
from cris_skip_prologue which already tried to find the end of the
prologue through the symbol information. 64 instructions past current
pc is arbitrarily chosen, but at least it means we'll stop eventually. */
limit = next_frame ? frame_pc_unwind (next_frame) : pc + 64;
limit = this_frame ? get_frame_pc (this_frame) : pc + 64;
/* Find the prologue instructions. */
while (pc > 0 && pc < limit)
@ -1322,9 +1309,9 @@ cris_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
}
}
/* We only want to know the end of the prologue when next_frame and info
/* We only want to know the end of the prologue when this_frame and info
are NULL (called from cris_skip_prologue i.e.). */
if (next_frame == NULL && info == NULL)
if (this_frame == NULL && info == NULL)
{
return pc;
}
@ -1339,7 +1326,7 @@ cris_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
/* The SP was moved to the FP. This indicates that a new frame
was created. Get THIS frame's FP value by unwinding it from
the next frame. */
this_base = frame_unwind_register_unsigned (next_frame, CRIS_FP_REGNUM);
this_base = get_frame_register_unsigned (this_frame, CRIS_FP_REGNUM);
info->base = this_base;
info->saved_regs[CRIS_FP_REGNUM].addr = info->base;
@ -1352,8 +1339,8 @@ cris_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
ULONGEST this_base;
/* Assume that the FP is this frame's SP but with that pushed
stack space added back. */
this_base = frame_unwind_register_unsigned (next_frame,
gdbarch_sp_regnum (gdbarch));
this_base = get_frame_register_unsigned (this_frame,
gdbarch_sp_regnum (gdbarch));
info->base = this_base;
info->prev_sp = info->base + info->size;
}
@ -1398,10 +1385,10 @@ cris_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
}
static CORE_ADDR
crisv32_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
crisv32_scan_prologue (CORE_ADDR pc, struct frame_info *this_frame,
struct cris_unwind_cache *info)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
ULONGEST this_base;
/* Unlike the CRISv10 prologue scanner (cris_scan_prologue), this is not
@ -1416,16 +1403,16 @@ crisv32_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
the stack pointer is not adjusted, and (as a consequence) the return
address is not pushed onto the stack. */
/* We only want to know the end of the prologue when next_frame and info
/* We only want to know the end of the prologue when this_frame and info
are NULL (called from cris_skip_prologue i.e.). */
if (next_frame == NULL && info == NULL)
if (this_frame == NULL && info == NULL)
{
return pc;
}
/* The SP is assumed to be unaltered. */
this_base = frame_unwind_register_unsigned (next_frame,
gdbarch_sp_regnum (gdbarch));
this_base = get_frame_register_unsigned (this_frame,
gdbarch_sp_regnum (gdbarch));
info->base = this_base;
info->prev_sp = this_base;
@ -4207,22 +4194,22 @@ cris_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_unwind_pc (gdbarch, cris_unwind_pc);
set_gdbarch_unwind_sp (gdbarch, cris_unwind_sp);
set_gdbarch_unwind_dummy_id (gdbarch, cris_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, cris_dummy_id);
if (tdep->cris_dwarf2_cfi == 1)
{
/* Hook in the Dwarf-2 frame sniffer. */
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, cris_dwarf2_reg_to_regnum);
dwarf2_frame_set_init_reg (gdbarch, cris_dwarf2_frame_init_reg);
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
}
if (tdep->cris_mode != cris_mode_guru)
{
frame_unwind_append_sniffer (gdbarch, cris_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &cris_sigtramp_frame_unwind);
}
frame_unwind_append_sniffer (gdbarch, cris_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &cris_frame_unwind);
frame_base_set_default (gdbarch, &cris_frame_base);
set_solib_svr4_fetch_link_map_offsets

View File

@ -165,7 +165,7 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
} __attribute__((aligned(8))); */
static LONGEST
frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno,
frv_linux_sigcontext_reg_addr (struct frame_info *this_frame, int regno,
CORE_ADDR *sc_addr_cache_ptr)
{
CORE_ADDR sc_addr;
@ -180,10 +180,10 @@ frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno,
char buf[4];
int tramp_type;
pc = frame_pc_unwind (next_frame);
pc = get_frame_pc (this_frame);
tramp_type = frv_linux_pc_in_sigtramp (pc, 0);
frame_unwind_register (next_frame, sp_regnum, buf);
get_frame_register (this_frame, sp_regnum, buf);
sp = extract_unsigned_integer (buf, sizeof buf);
if (tramp_type == NORMAL_SIGTRAMP)
@ -253,10 +253,10 @@ frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno,
/* Signal trampolines. */
static struct trad_frame_cache *
frv_linux_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
frv_linux_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct trad_frame_cache *cache;
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
CORE_ADDR addr;
char buf[4];
int regnum;
@ -266,20 +266,20 @@ frv_linux_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);
/* FIXME: cagney/2004-05-01: This is is long standing broken code.
The frame ID's code address should be the start-address of the
signal trampoline and not the current PC within that
trampoline. */
frame_unwind_register (next_frame, sp_regnum, buf);
get_frame_register (this_frame, sp_regnum, buf);
this_id = frame_id_build (extract_unsigned_integer (buf, sizeof buf),
frame_pc_unwind (next_frame));
get_frame_pc (this_frame));
trad_frame_set_id (cache, this_id);
for (regnum = 0; regnum < frv_num_regs; regnum++)
{
LONGEST reg_addr = frv_linux_sigcontext_reg_addr (next_frame, regnum,
LONGEST reg_addr = frv_linux_sigcontext_reg_addr (this_frame, regnum,
&sc_addr_cache_val);
if (reg_addr != -1)
trad_frame_set_reg_addr (cache, regnum, reg_addr);
@ -290,48 +290,47 @@ frv_linux_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache
}
static void
frv_linux_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache,
frv_linux_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct trad_frame_cache *cache =
frv_linux_sigtramp_frame_cache (next_frame, this_cache);
frv_linux_sigtramp_frame_cache (this_frame, this_cache);
trad_frame_get_id (cache, this_id);
}
static void
frv_linux_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 *
frv_linux_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
/* Make sure we've initialized the cache. */
struct trad_frame_cache *cache =
frv_linux_sigtramp_frame_cache (next_frame, this_cache);
trad_frame_get_register (cache, next_frame, regnum, optimizedp, lvalp,
addrp, realnump, valuep);
frv_linux_sigtramp_frame_cache (this_frame, this_cache);
return trad_frame_get_register (cache, this_frame, regnum);
}
static int
frv_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (frv_linux_pc_in_sigtramp (pc, name))
return 1;
return 0;
}
static const struct frame_unwind frv_linux_sigtramp_frame_unwind =
{
SIGTRAMP_FRAME,
frv_linux_sigtramp_frame_this_id,
frv_linux_sigtramp_frame_prev_register
frv_linux_sigtramp_frame_prev_register,
NULL,
frv_linux_sigtramp_frame_sniffer
};
static const struct frame_unwind *
frv_linux_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (frv_linux_pc_in_sigtramp (pc, name))
return &frv_linux_sigtramp_frame_unwind;
return NULL;
}
/* The FRV kernel defines ELF_NGREG as 46. We add 2 in order to include
the loadmap addresses in the register set. (See below for more info.) */
@ -485,7 +484,7 @@ static void
frv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
/* Set the sigtramp frame sniffer. */
frame_unwind_append_sniffer (gdbarch, frv_linux_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &frv_linux_sigtramp_frame_unwind);
set_gdbarch_regset_from_core_section (gdbarch,
frv_linux_regset_from_core_section);
}

View File

@ -510,7 +510,7 @@ is_argument_reg (int reg)
arguments in any frame but the top, you'll need to do this serious
prologue analysis. */
static CORE_ADDR
frv_analyze_prologue (CORE_ADDR pc, struct frame_info *next_frame,
frv_analyze_prologue (CORE_ADDR pc, struct frame_info *this_frame,
struct frv_unwind_cache *info)
{
/* When writing out instruction bitpatterns, we use the following
@ -579,9 +579,9 @@ frv_analyze_prologue (CORE_ADDR pc, struct frame_info *next_frame,
/* If we have a frame, we don't want to scan past the frame's pc. This
will catch those cases where the pc is in the prologue. */
if (next_frame)
if (this_frame)
{
CORE_ADDR frame_pc = frame_pc_unwind (next_frame);
CORE_ADDR frame_pc = get_frame_pc (this_frame);
if (frame_pc < lim_pc)
lim_pc = frame_pc;
}
@ -927,7 +927,7 @@ frv_analyze_prologue (CORE_ADDR pc, struct frame_info *next_frame,
pc = next_pc;
}
if (next_frame && info)
if (this_frame && info)
{
int i;
ULONGEST this_base;
@ -938,9 +938,9 @@ frv_analyze_prologue (CORE_ADDR pc, struct frame_info *next_frame,
because instructions may save relative to the SP, but we need
their addresses relative to the FP. */
if (fp_set)
this_base = frame_unwind_register_unsigned (next_frame, fp_regnum);
this_base = get_frame_register_unsigned (this_frame, fp_regnum);
else
this_base = frame_unwind_register_unsigned (next_frame, sp_regnum);
this_base = get_frame_register_unsigned (this_frame, sp_regnum);
for (i = 0; i < 64; i++)
if (gr_saved[i])
@ -1000,10 +1000,10 @@ frv_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
static struct frv_unwind_cache *
frv_frame_unwind_cache (struct frame_info *next_frame,
frv_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
CORE_ADDR pc;
ULONGEST this_base;
struct frv_unwind_cache *info;
@ -1013,11 +1013,10 @@ frv_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct frv_unwind_cache);
(*this_prologue_cache) = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* Prologue analysis does the rest... */
frv_analyze_prologue (frame_func_unwind (next_frame, NORMAL_FRAME),
next_frame, info);
frv_analyze_prologue (get_frame_func (this_frame), this_frame, info);
return info;
}
@ -1350,18 +1349,18 @@ frv_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
frame. This will be used to create a new GDB frame struct. */
static void
frv_frame_this_id (struct frame_info *next_frame,
frv_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache, struct frame_id *this_id)
{
struct frv_unwind_cache *info
= frv_frame_unwind_cache (next_frame, this_prologue_cache);
= frv_frame_unwind_cache (this_frame, this_prologue_cache);
CORE_ADDR base;
CORE_ADDR func;
struct minimal_symbol *msym_stack;
struct frame_id id;
/* The FUNC is easy. */
func = frame_func_unwind (next_frame, NORMAL_FRAME);
func = get_frame_func (this_frame);
/* Check if the stack is empty. */
msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
@ -1379,36 +1378,28 @@ frv_frame_this_id (struct frame_info *next_frame,
(*this_id) = id;
}
static void
frv_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
frv_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct frv_unwind_cache *info
= frv_frame_unwind_cache (next_frame, this_prologue_cache);
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
= frv_frame_unwind_cache (this_frame, this_prologue_cache);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
static const struct frame_unwind frv_frame_unwind = {
NORMAL_FRAME,
frv_frame_this_id,
frv_frame_prev_register
frv_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
frv_frame_sniffer (struct frame_info *next_frame)
{
return &frv_frame_unwind;
}
static CORE_ADDR
frv_frame_base_address (struct frame_info *next_frame, void **this_cache)
frv_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct frv_unwind_cache *info
= frv_frame_unwind_cache (next_frame, this_cache);
= frv_frame_unwind_cache (this_frame, this_cache);
return info->base;
}
@ -1426,16 +1417,15 @@ frv_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
dummy frame. The frame ID's base needs to match the TOS value
saved by save_dummy_frame_tos(), and the PC match the dummy frame's
breakpoint. */
/* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
frame. The frame ID's base needs to match the TOS value saved by
save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
static struct frame_id
frv_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
frv_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (frv_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, sp_regnum);
return frame_id_build (sp, get_frame_pc (this_frame));
}
static struct gdbarch *
@ -1527,7 +1517,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Settings for calling functions in the inferior. */
set_gdbarch_push_dummy_call (gdbarch, frv_push_dummy_call);
set_gdbarch_unwind_dummy_id (gdbarch, frv_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, frv_dummy_id);
/* Settings that should be unnecessary. */
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
@ -1569,7 +1559,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
gdbarch_init_osabi (info, gdbarch);
/* Set the fallback (prologue based) frame sniffer. */
frame_unwind_append_sniffer (gdbarch, frv_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &frv_frame_unwind);
/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,

View File

@ -107,10 +107,10 @@ h8300_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
h8300_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
h8300_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (h8300_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
return frame_id_build (sp, get_frame_pc (this_frame));
}
/* Normal frames. */
@ -420,9 +420,9 @@ h8300_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc,
}
static struct h8300_frame_cache *
h8300_frame_cache (struct frame_info *next_frame, void **this_cache)
h8300_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 h8300_frame_cache *cache;
char buf[4];
int i;
@ -441,14 +441,14 @@ h8300_frame_cache (struct frame_info *next_frame, void **this_cache)
optional. For these "frameless" functions the frame pointer is
actually the frame pointer of the calling frame. */
cache->base = frame_unwind_register_unsigned (next_frame, E_FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_FP_REGNUM);
if (cache->base == 0)
return cache;
cache->saved_regs[E_PC_REGNUM] = -BINWORD (gdbarch);
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
current_pc = frame_pc_unwind (next_frame);
cache->pc = get_frame_func (this_frame);
current_pc = get_frame_pc (this_frame);
if (cache->pc != 0)
h8300_analyze_prologue (cache->pc, current_pc, cache);
@ -462,7 +462,7 @@ h8300_frame_cache (struct frame_info *next_frame, void **this_cache)
frame by looking at the stack pointer. For truly "frameless"
functions this might work too. */
cache->base = frame_unwind_register_unsigned (next_frame, E_SP_REGNUM)
cache->base = get_frame_register_unsigned (this_frame, E_SP_REGNUM)
+ cache->sp_offset;
cache->saved_sp = cache->base + BINWORD (gdbarch);
cache->saved_regs[E_PC_REGNUM] = 0;
@ -483,11 +483,11 @@ h8300_frame_cache (struct frame_info *next_frame, void **this_cache)
}
static void
h8300_frame_this_id (struct frame_info *next_frame, void **this_cache,
h8300_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct h8300_frame_cache *cache =
h8300_frame_cache (next_frame, this_cache);
h8300_frame_cache (this_frame, this_cache);
/* This marks the outermost frame. */
if (cache->base == 0)
@ -496,65 +496,39 @@ h8300_frame_this_id (struct frame_info *next_frame, void **this_cache,
*this_id = frame_id_build (cache->saved_sp, cache->pc);
}
static void
h8300_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 *
h8300_frame_prev_register (struct frame_info *this_frame, void **this_cache,
int regnum)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
struct h8300_frame_cache *cache =
h8300_frame_cache (next_frame, this_cache);
h8300_frame_cache (this_frame, this_cache);
gdb_assert (regnum >= 0);
if (regnum == E_SP_REGNUM && cache->saved_sp)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (valuep)
store_unsigned_integer (valuep, BINWORD (gdbarch), cache->saved_sp);
return;
}
return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
if (regnum < gdbarch_num_regs (gdbarch)
&& cache->saved_regs[regnum] != -1)
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = cache->saved_regs[regnum];
*realnump = -1;
if (valuep)
read_memory (*addrp, valuep, register_size (gdbarch, regnum));
return;
}
return frame_unwind_got_memory (this_frame, regnum,
cache->saved_regs[regnum]);
*optimizedp = 0;
*lvalp = lval_register;
*addrp = 0;
*realnump = regnum;
if (valuep)
frame_unwind_register (next_frame, *realnump, valuep);
return frame_unwind_got_register (this_frame, regnum, regnum);
}
static const struct frame_unwind h8300_frame_unwind = {
NORMAL_FRAME,
h8300_frame_this_id,
h8300_frame_prev_register
h8300_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
h8300_frame_sniffer (struct frame_info *next_frame)
{
return &h8300_frame_unwind;
}
static CORE_ADDR
h8300_frame_base_address (struct frame_info *next_frame, void **this_cache)
h8300_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct h8300_frame_cache *cache = h8300_frame_cache (next_frame, this_cache);
struct h8300_frame_cache *cache = h8300_frame_cache (this_frame, this_cache);
return cache->base;
}
@ -1337,7 +1311,7 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Frame unwinder. */
set_gdbarch_unwind_pc (gdbarch, h8300_unwind_pc);
set_gdbarch_unwind_sp (gdbarch, h8300_unwind_sp);
set_gdbarch_unwind_dummy_id (gdbarch, h8300_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, h8300_dummy_id);
frame_base_set_default (gdbarch, &h8300_frame_base);
/*
@ -1359,8 +1333,8 @@ h8300_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_believe_pcc_promotion (gdbarch, 1);
/* Hook in the DWARF CFI frame unwinder. */
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, h8300_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &h8300_frame_unwind);
return gdbarch;

View File

@ -196,10 +196,10 @@ struct hppa_linux_sigtramp_unwind_cache
};
static struct hppa_linux_sigtramp_unwind_cache *
hppa_linux_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
hppa_linux_sigtramp_frame_unwind_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 hppa_linux_sigtramp_unwind_cache *info;
CORE_ADDR pc, scptr;
int i;
@ -209,9 +209,9 @@ hppa_linux_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct hppa_linux_sigtramp_unwind_cache);
*this_cache = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
pc = frame_pc_unwind (next_frame);
pc = get_frame_pc (this_frame);
scptr = hppa_linux_sigtramp_find_sigcontext (pc);
/* structure of struct sigcontext:
@ -262,58 +262,59 @@ hppa_linux_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
info->saved_regs[HPPA_PCOQ_TAIL_REGNUM].addr = scptr;
scptr += 4;
info->base = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
info->base = get_frame_register_unsigned (this_frame, HPPA_SP_REGNUM);
return info;
}
static void
hppa_linux_sigtramp_frame_this_id (struct frame_info *next_frame,
hppa_linux_sigtramp_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
struct hppa_linux_sigtramp_unwind_cache *info
= hppa_linux_sigtramp_frame_unwind_cache (next_frame, this_prologue_cache);
*this_id = frame_id_build (info->base, frame_pc_unwind (next_frame));
= hppa_linux_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache);
*this_id = frame_id_build (info->base, get_frame_pc (this_frame));
}
static void
hppa_linux_sigtramp_frame_prev_register (struct frame_info *next_frame,
static struct value *
hppa_linux_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp,
CORE_ADDR *addrp,
int *realnump, gdb_byte *valuep)
int regnum)
{
struct hppa_linux_sigtramp_unwind_cache *info
= hppa_linux_sigtramp_frame_unwind_cache (next_frame, this_prologue_cache);
hppa_frame_prev_register_helper (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
= hppa_linux_sigtramp_frame_unwind_cache (this_frame, this_prologue_cache);
return hppa_frame_prev_register_helper (this_frame,
info->saved_regs, regnum);
}
static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
SIGTRAMP_FRAME,
hppa_linux_sigtramp_frame_this_id,
hppa_linux_sigtramp_frame_prev_register
};
/* hppa-linux always uses "new-style" rt-signals. The signal handler's return
address should point to a signal trampoline on the stack. The signal
trampoline is embedded in a rt_sigframe structure that is aligned on
the stack. We take advantage of the fact that sp must be 64-byte aligned,
and the trampoline is small, so by rounding down the trampoline address
we can find the beginning of the struct rt_sigframe. */
static const struct frame_unwind *
hppa_linux_sigtramp_unwind_sniffer (struct frame_info *next_frame)
static int
hppa_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_prologue_cache)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
if (hppa_linux_sigtramp_find_sigcontext (pc))
return &hppa_linux_sigtramp_frame_unwind;
return 1;
return NULL;
return 0;
}
static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
SIGTRAMP_FRAME,
hppa_linux_sigtramp_frame_this_id,
hppa_linux_sigtramp_frame_prev_register,
NULL,
hppa_linux_sigtramp_frame_sniffer
};
/* Attempt to find (and return) the global pointer for the given
function.
@ -522,7 +523,7 @@ hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
set_gdbarch_write_pc (gdbarch, hppa_linux_target_write_pc);
frame_unwind_append_sniffer (gdbarch, hppa_linux_sigtramp_unwind_sniffer);
frame_unwind_append_unwinder (gdbarch, &hppa_linux_sigtramp_frame_unwind);
/* GNU/Linux uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets

View File

@ -356,7 +356,7 @@ iq2000_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
}
static struct iq2000_frame_cache *
iq2000_frame_cache (struct frame_info *next_frame, void **this_cache)
iq2000_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct iq2000_frame_cache *cache;
CORE_ADDR current_pc;
@ -369,16 +369,16 @@ iq2000_frame_cache (struct frame_info *next_frame, void **this_cache)
iq2000_init_frame_cache (cache);
*this_cache = cache;
cache->base = frame_unwind_register_unsigned (next_frame, E_FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_FP_REGNUM);
//if (cache->base == 0)
//return cache;
current_pc = frame_pc_unwind (next_frame);
current_pc = get_frame_pc (this_frame);
find_pc_partial_function (current_pc, NULL, &cache->pc, NULL);
if (cache->pc != 0)
iq2000_scan_prologue (cache->pc, current_pc, next_frame, cache);
iq2000_scan_prologue (cache->pc, current_pc, this_frame, cache);
if (!cache->using_fp)
cache->base = frame_unwind_register_unsigned (next_frame, E_SP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
cache->saved_sp = cache->base + cache->framesize;
@ -389,52 +389,30 @@ iq2000_frame_cache (struct frame_info *next_frame, void **this_cache)
return cache;
}
static void
iq2000_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 *
iq2000_frame_prev_register (struct frame_info *this_frame, void **this_cache,
int regnum)
{
struct iq2000_frame_cache *cache = iq2000_frame_cache (next_frame, this_cache);
struct iq2000_frame_cache *cache = iq2000_frame_cache (this_frame, this_cache);
if (regnum == E_SP_REGNUM && cache->saved_sp)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (valuep)
store_unsigned_integer (valuep, 4, cache->saved_sp);
return;
}
return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
if (regnum == E_PC_REGNUM)
regnum = E_LR_REGNUM;
if (regnum < E_NUM_REGS && cache->saved_regs[regnum] != -1)
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = cache->saved_regs[regnum];
*realnump = -1;
if (valuep)
read_memory (*addrp, valuep,
register_size (get_frame_arch (next_frame), regnum));
return;
}
return frame_unwind_got_memory (this_frame, regnum,
cache->saved_regs[regnum]);
*optimizedp = 0;
*lvalp = lval_register;
*addrp = 0;
*realnump = regnum;
if (valuep)
frame_unwind_register (next_frame, (*realnump), valuep);
return frame_unwind_got_register (this_frame, regnum, regnum);
}
static void
iq2000_frame_this_id (struct frame_info *next_frame, void **this_cache,
iq2000_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct iq2000_frame_cache *cache = iq2000_frame_cache (next_frame, this_cache);
struct iq2000_frame_cache *cache = iq2000_frame_cache (this_frame, this_cache);
/* This marks the outermost frame. */
if (cache->base == 0)
@ -446,15 +424,11 @@ iq2000_frame_this_id (struct frame_info *next_frame, void **this_cache,
static const struct frame_unwind iq2000_frame_unwind = {
NORMAL_FRAME,
iq2000_frame_this_id,
iq2000_frame_prev_register
iq2000_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
iq2000_frame_sniffer (struct frame_info *next_frame)
{
return &iq2000_frame_unwind;
}
static CORE_ADDR
iq2000_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
{
@ -468,16 +442,16 @@ iq2000_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
iq2000_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
iq2000_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (iq2000_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
return frame_id_build (sp, get_frame_pc (this_frame));
}
static CORE_ADDR
iq2000_frame_base_address (struct frame_info *next_frame, void **this_cache)
iq2000_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct iq2000_frame_cache *cache = iq2000_frame_cache (next_frame, this_cache);
struct iq2000_frame_cache *cache = iq2000_frame_cache (this_frame, this_cache);
return cache->base;
}
@ -851,14 +825,14 @@ iq2000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_frame_align (gdbarch, iq2000_frame_align);
set_gdbarch_unwind_sp (gdbarch, iq2000_unwind_sp);
set_gdbarch_unwind_pc (gdbarch, iq2000_unwind_pc);
set_gdbarch_unwind_dummy_id (gdbarch, iq2000_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, iq2000_dummy_id);
frame_base_set_default (gdbarch, &iq2000_frame_base);
set_gdbarch_push_dummy_call (gdbarch, iq2000_push_dummy_call);
gdbarch_init_osabi (info, gdbarch);
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, iq2000_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &iq2000_frame_unwind);
return gdbarch;
}

View File

@ -1828,13 +1828,13 @@ m32c_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR ip)
/* Stack unwinding. */
static struct m32c_prologue *
m32c_analyze_frame_prologue (struct frame_info *next_frame,
m32c_analyze_frame_prologue (struct frame_info *this_frame,
void **this_prologue_cache)
{
if (! *this_prologue_cache)
{
CORE_ADDR func_start = frame_func_unwind (next_frame, NORMAL_FRAME);
CORE_ADDR stop_addr = frame_pc_unwind (next_frame);
CORE_ADDR func_start = get_frame_func (this_frame);
CORE_ADDR stop_addr = get_frame_pc (this_frame);
/* If we couldn't find any function containing the PC, then
just initialize the prologue cache, but don't do anything. */
@ -1842,7 +1842,7 @@ m32c_analyze_frame_prologue (struct frame_info *next_frame,
stop_addr = func_start;
*this_prologue_cache = FRAME_OBSTACK_ZALLOC (struct m32c_prologue);
m32c_analyze_prologue (get_frame_arch (next_frame),
m32c_analyze_prologue (get_frame_arch (this_frame),
func_start, stop_addr, *this_prologue_cache);
}
@ -1851,12 +1851,12 @@ m32c_analyze_frame_prologue (struct frame_info *next_frame,
static CORE_ADDR
m32c_frame_base (struct frame_info *next_frame,
m32c_frame_base (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct m32c_prologue *p
= m32c_analyze_frame_prologue (next_frame, this_prologue_cache);
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
= m32c_analyze_frame_prologue (this_frame, this_prologue_cache);
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
/* In functions that use alloca, the distance between the stack
pointer and the frame base varies dynamically, so we can't use
@ -1869,14 +1869,14 @@ m32c_frame_base (struct frame_info *next_frame,
case prologue_with_frame_ptr:
{
CORE_ADDR fb
= frame_unwind_register_unsigned (next_frame, tdep->fb->num);
= get_frame_register_unsigned (this_frame, tdep->fb->num);
return fb - p->frame_ptr_offset;
}
case prologue_sans_frame_ptr:
{
CORE_ADDR sp
= frame_unwind_register_unsigned (next_frame, tdep->sp->num);
= get_frame_register_unsigned (this_frame, tdep->sp->num);
return sp - p->frame_size;
}
@ -1890,82 +1890,52 @@ m32c_frame_base (struct frame_info *next_frame,
static void
m32c_this_id (struct frame_info *next_frame,
m32c_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
CORE_ADDR base = m32c_frame_base (next_frame, this_prologue_cache);
CORE_ADDR base = m32c_frame_base (this_frame, this_prologue_cache);
if (base)
*this_id = frame_id_build (base,
frame_func_unwind (next_frame, NORMAL_FRAME));
*this_id = frame_id_build (base, get_frame_func (this_frame));
/* Otherwise, leave it unset, and that will terminate the backtrace. */
}
static void
m32c_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
m32c_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
struct m32c_prologue *p
= m32c_analyze_frame_prologue (next_frame, this_prologue_cache);
CORE_ADDR frame_base = m32c_frame_base (next_frame, this_prologue_cache);
int reg_size = register_size (get_frame_arch (next_frame), regnum);
= m32c_analyze_frame_prologue (this_frame, this_prologue_cache);
CORE_ADDR frame_base = m32c_frame_base (this_frame, this_prologue_cache);
int reg_size = register_size (get_frame_arch (this_frame), regnum);
if (regnum == tdep->sp->num)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (bufferp)
store_unsigned_integer (bufferp, reg_size, frame_base);
}
return frame_unwind_got_constant (this_frame, regnum, frame_base);
/* If prologue analysis says we saved this register somewhere,
return a description of the stack slot holding it. */
else if (p->reg_offset[regnum] != 1)
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = frame_base + p->reg_offset[regnum];
*realnump = -1;
if (bufferp)
get_frame_memory (next_frame, *addrp, bufferp, reg_size);
}
if (p->reg_offset[regnum] != 1)
return frame_unwind_got_memory (this_frame, regnum,
frame_base + p->reg_offset[regnum]);
/* Otherwise, presume we haven't changed the value of this
register, and get it from the next frame. */
else
{
*optimizedp = 0;
*lvalp = lval_register;
*addrp = 0;
*realnump = regnum;
if (bufferp)
frame_unwind_register (next_frame, *realnump, bufferp);
}
return frame_unwind_got_register (this_frame, regnum, regnum);
}
static const struct frame_unwind m32c_unwind = {
NORMAL_FRAME,
m32c_this_id,
m32c_prev_register
m32c_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
m32c_frame_sniffer (struct frame_info *next_frame)
{
return &m32c_unwind;
}
static CORE_ADDR
m32c_unwind_pc (struct gdbarch *arch, struct frame_info *next_frame)
{
@ -2146,7 +2116,7 @@ m32c_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
static struct frame_id
m32c_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
m32c_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
/* This needs to return a frame ID whose PC is the return address
passed to m32c_push_dummy_call, and whose stack_addr is the SP
@ -2154,8 +2124,9 @@ m32c_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
m32c_unwind_sp gives us the CFA, which is the value the SP had
before the return address was pushed. */
return frame_id_build (m32c_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
CORE_ADDR sp = get_frame_register_unsigned (this_frame, tdep->sp->num);
return frame_id_build (sp, get_frame_pc (this_frame));
}
@ -2611,14 +2582,14 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
know which, but I do know that the prologue analyzer works better.
MVS 04/13/06
*/
frame_unwind_append_sniffer (arch, dwarf2_frame_sniffer);
dwarf2_append_sniffers (arch);
#endif
frame_unwind_append_sniffer (arch, m32c_frame_sniffer);
frame_unwind_append_unwinder (arch, &m32c_unwind);
/* Inferior calls. */
set_gdbarch_push_dummy_call (arch, m32c_push_dummy_call);
set_gdbarch_return_value (arch, m32c_return_value);
set_gdbarch_unwind_dummy_id (arch, m32c_unwind_dummy_id);
set_gdbarch_dummy_id (arch, m32c_dummy_id);
/* Trampolines. */
set_gdbarch_skip_trampoline_code (arch, m32c_skip_trampoline_code);

View File

@ -84,7 +84,7 @@ static const gdb_byte linux_sigtramp_code[] = {
the routine. Otherwise, return 0. */
static CORE_ADDR
m32r_linux_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
m32r_linux_sigtramp_start (CORE_ADDR pc, struct frame_info *this_frame)
{
gdb_byte buf[4];
@ -98,7 +98,7 @@ m32r_linux_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
if (pc % 2 != 0)
{
if (!safe_frame_unwind_memory (next_frame, pc, buf, 2))
if (!safe_frame_unwind_memory (this_frame, pc, buf, 2))
return 0;
if (memcmp (buf, linux_sigtramp_code, 2) == 0)
@ -107,7 +107,7 @@ m32r_linux_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
return 0;
}
if (!safe_frame_unwind_memory (next_frame, pc, buf, 4))
if (!safe_frame_unwind_memory (this_frame, pc, buf, 4))
return 0;
if (memcmp (buf, linux_sigtramp_code, 4) != 0)
@ -132,7 +132,7 @@ static const gdb_byte linux_rt_sigtramp_code[] = {
of the routine. Otherwise, return 0. */
static CORE_ADDR
m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *this_frame)
{
gdb_byte buf[4];
@ -147,12 +147,12 @@ m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
if (pc % 2 != 0)
return 0;
if (!safe_frame_unwind_memory (next_frame, pc, buf, 4))
if (!safe_frame_unwind_memory (this_frame, pc, buf, 4))
return 0;
if (memcmp (buf, linux_rt_sigtramp_code, 4) == 0)
{
if (!safe_frame_unwind_memory (next_frame, pc + 4, buf, 4))
if (!safe_frame_unwind_memory (this_frame, pc + 4, buf, 4))
return 0;
if (memcmp (buf, linux_rt_sigtramp_code + 4, 4) == 0)
@ -160,7 +160,7 @@ m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
}
else if (memcmp (buf, linux_rt_sigtramp_code + 4, 4) == 0)
{
if (!safe_frame_unwind_memory (next_frame, pc - 4, buf, 4))
if (!safe_frame_unwind_memory (this_frame, pc - 4, buf, 4))
return 0;
if (memcmp (buf, linux_rt_sigtramp_code, 4) == 0)
@ -172,7 +172,7 @@ m32r_linux_rt_sigtramp_start (CORE_ADDR pc, struct frame_info *next_frame)
static int
m32r_linux_pc_in_sigtramp (CORE_ADDR pc, char *name,
struct frame_info *next_frame)
struct frame_info *this_frame)
{
/* If we have NAME, we can optimize the search. The trampolines are
named __restore and __restore_rt. However, they aren't dynamically
@ -180,8 +180,8 @@ m32r_linux_pc_in_sigtramp (CORE_ADDR pc, char *name,
be part of the preceding function. This should always be sigaction,
__sigaction, or __libc_sigaction (all aliases to the same function). */
if (name == NULL || strstr (name, "sigaction") != NULL)
return (m32r_linux_sigtramp_start (pc, next_frame) != 0
|| m32r_linux_rt_sigtramp_start (pc, next_frame) != 0);
return (m32r_linux_sigtramp_start (pc, this_frame) != 0
|| m32r_linux_rt_sigtramp_start (pc, this_frame) != 0);
return (strcmp ("__restore", name) == 0
|| strcmp ("__restore_rt", name) == 0);
@ -222,7 +222,7 @@ struct m32r_frame_cache
};
static struct m32r_frame_cache *
m32r_linux_sigtramp_frame_cache (struct frame_info *next_frame,
m32r_linux_sigtramp_frame_cache (struct frame_info *this_frame,
void **this_cache)
{
struct m32r_frame_cache *cache;
@ -233,26 +233,26 @@ m32r_linux_sigtramp_frame_cache (struct frame_info *next_frame,
return (*this_cache);
cache = FRAME_OBSTACK_ZALLOC (struct m32r_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);
cache->base = frame_unwind_register_unsigned (next_frame, M32R_SP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, M32R_SP_REGNUM);
sigcontext_addr = cache->base + 4;
cache->pc = frame_pc_unwind (next_frame);
addr = m32r_linux_sigtramp_start (cache->pc, next_frame);
cache->pc = get_frame_pc (this_frame);
addr = m32r_linux_sigtramp_start (cache->pc, this_frame);
if (addr == 0)
{
/* If this is a RT signal trampoline, adjust SIGCONTEXT_ADDR
accordingly. */
addr = m32r_linux_rt_sigtramp_start (cache->pc, next_frame);
addr = m32r_linux_rt_sigtramp_start (cache->pc, this_frame);
if (addr)
sigcontext_addr += 128;
else
addr = frame_func_unwind (next_frame, NORMAL_FRAME);
addr = get_frame_func (this_frame);
}
cache->pc = addr;
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
for (regnum = 0; regnum < sizeof (m32r_linux_sc_reg_offset) / 4; regnum++)
{
@ -265,50 +265,49 @@ m32r_linux_sigtramp_frame_cache (struct frame_info *next_frame,
}
static void
m32r_linux_sigtramp_frame_this_id (struct frame_info *next_frame,
m32r_linux_sigtramp_frame_this_id (struct frame_info *this_frame,
void **this_cache,
struct frame_id *this_id)
{
struct m32r_frame_cache *cache =
m32r_linux_sigtramp_frame_cache (next_frame, this_cache);
m32r_linux_sigtramp_frame_cache (this_frame, this_cache);
(*this_id) = frame_id_build (cache->base, cache->pc);
}
static void
m32r_linux_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 *
m32r_linux_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct m32r_frame_cache *cache =
m32r_linux_sigtramp_frame_cache (next_frame, this_cache);
m32r_linux_sigtramp_frame_cache (this_frame, this_cache);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static int
m32r_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (m32r_linux_pc_in_sigtramp (pc, name, this_frame))
return 1;
return 0;
}
static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = {
SIGTRAMP_FRAME,
m32r_linux_sigtramp_frame_this_id,
m32r_linux_sigtramp_frame_prev_register
m32r_linux_sigtramp_frame_prev_register,
NULL,
m32r_linux_sigtramp_frame_sniffer
};
static const struct frame_unwind *
m32r_linux_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (m32r_linux_pc_in_sigtramp (pc, name, next_frame))
return &m32r_linux_sigtramp_frame_unwind;
return NULL;
}
/* Mapping between the registers in `struct pt_regs'
format and GDB's register array layout. */
@ -409,7 +408,7 @@ m32r_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
the number of registers. */
set_gdbarch_num_regs (gdbarch, M32R_NUM_REGS - 1);
frame_unwind_append_sniffer (gdbarch, m32r_linux_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &m32r_linux_sigtramp_frame_unwind);
/* GNU/Linux uses SVR4-style shared libraries. */
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);

View File

@ -513,7 +513,7 @@ struct m32r_unwind_cache
for it IS the sp for the next frame. */
static struct m32r_unwind_cache *
m32r_frame_unwind_cache (struct frame_info *next_frame,
m32r_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
CORE_ADDR pc, scan_limit;
@ -529,19 +529,19 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct m32r_unwind_cache);
(*this_prologue_cache) = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
info->size = 0;
info->sp_offset = 0;
info->uses_frame = 0;
scan_limit = frame_pc_unwind (next_frame);
for (pc = frame_func_unwind (next_frame, NORMAL_FRAME);
scan_limit = get_frame_pc (this_frame);
for (pc = get_frame_func (this_frame);
pc > 0 && pc < scan_limit; pc += 2)
{
if ((pc & 2) == 0)
{
op = get_frame_memory_unsigned (next_frame, pc, 4);
op = get_frame_memory_unsigned (this_frame, pc, 4);
if ((op & 0x80000000) == 0x80000000)
{
/* 32-bit instruction */
@ -552,7 +552,7 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
info->sp_offset += n;
}
else if (((op >> 8) == 0xe4)
&& get_frame_memory_unsigned (next_frame, pc + 2,
&& get_frame_memory_unsigned (this_frame, pc + 2,
2) == 0x0f24)
{
/* ld24 r4, xxxxxx; sub sp, r4 */
@ -569,7 +569,7 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
}
/* 16-bit instructions */
op = get_frame_memory_unsigned (next_frame, pc, 2) & 0x7fff;
op = get_frame_memory_unsigned (this_frame, pc, 2) & 0x7fff;
if ((op & 0xf0ff) == 0x207f)
{
/* st rn, @-sp */
@ -606,7 +606,7 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
/* The SP was moved to the FP. This indicates that a new frame
was created. Get THIS frame's FP value by unwinding it from
the next frame. */
this_base = frame_unwind_register_unsigned (next_frame, M32R_FP_REGNUM);
this_base = get_frame_register_unsigned (this_frame, M32R_FP_REGNUM);
/* The FP points at the last saved register. Adjust the FP back
to before the first saved register giving the SP. */
prev_sp = this_base + info->size;
@ -615,7 +615,7 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
{
/* Assume that the FP is this frame's SP but with that pushed
stack space added back. */
this_base = frame_unwind_register_unsigned (next_frame, M32R_SP_REGNUM);
this_base = get_frame_register_unsigned (this_frame, M32R_SP_REGNUM);
prev_sp = this_base + info->size;
}
@ -625,7 +625,7 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
/* Adjust all the saved registers so that they contain addresses and
not offsets. */
for (i = 0; i < gdbarch_num_regs (get_frame_arch (next_frame)) - 1; i++)
for (i = 0; i < gdbarch_num_regs (get_frame_arch (this_frame)) - 1; i++)
if (trad_frame_addr_p (info->saved_regs, i))
info->saved_regs[i].addr = (info->prev_sp + info->saved_regs[i].addr);
@ -814,18 +814,18 @@ m32r_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
frame. This will be used to create a new GDB frame struct. */
static void
m32r_frame_this_id (struct frame_info *next_frame,
m32r_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache, struct frame_id *this_id)
{
struct m32r_unwind_cache *info
= m32r_frame_unwind_cache (next_frame, this_prologue_cache);
= m32r_frame_unwind_cache (this_frame, this_prologue_cache);
CORE_ADDR base;
CORE_ADDR func;
struct minimal_symbol *msym_stack;
struct frame_id id;
/* The FUNC is easy. */
func = frame_func_unwind (next_frame, NORMAL_FRAME);
func = get_frame_func (this_frame);
/* Check if the stack is empty. */
msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
@ -843,36 +843,28 @@ m32r_frame_this_id (struct frame_info *next_frame,
(*this_id) = id;
}
static void
m32r_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
m32r_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct m32r_unwind_cache *info
= m32r_frame_unwind_cache (next_frame, this_prologue_cache);
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
= m32r_frame_unwind_cache (this_frame, this_prologue_cache);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
static const struct frame_unwind m32r_frame_unwind = {
NORMAL_FRAME,
m32r_frame_this_id,
m32r_frame_prev_register
m32r_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
m32r_frame_sniffer (struct frame_info *next_frame)
{
return &m32r_frame_unwind;
}
static CORE_ADDR
m32r_frame_base_address (struct frame_info *next_frame, void **this_cache)
m32r_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct m32r_unwind_cache *info
= m32r_frame_unwind_cache (next_frame, this_cache);
= m32r_frame_unwind_cache (this_frame, this_cache);
return info->base;
}
@ -883,16 +875,15 @@ static const struct frame_base m32r_frame_base = {
m32r_frame_base_address
};
/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
dummy frame. The frame ID's base needs to match the TOS value
saved by save_dummy_frame_tos(), and the PC match the dummy frame's
breakpoint. */
/* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
frame. The frame ID's base needs to match the TOS value saved by
save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
static struct frame_id
m32r_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
m32r_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (m32r_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, M32R_SP_REGNUM);
return frame_id_build (sp, get_frame_pc (this_frame));
}
@ -940,7 +931,7 @@ m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Methods for saving / extracting a dummy frame's ID. The ID's
stack address must match the SP value returned by
PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
set_gdbarch_unwind_dummy_id (gdbarch, m32r_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, m32r_dummy_id);
/* Return the unwound PC value. */
set_gdbarch_unwind_pc (gdbarch, m32r_unwind_pc);
@ -951,7 +942,7 @@ m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
gdbarch_init_osabi (info, gdbarch);
/* Hook in the default unwinders. */
frame_unwind_append_sniffer (gdbarch, m32r_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &m32r_frame_unwind);
/* Support simple overlay manager. */
set_gdbarch_overlay_update (gdbarch, simple_overlay_update);

View File

@ -774,10 +774,10 @@ m68hc11_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
for it IS the sp for the next frame. */
struct m68hc11_unwind_cache *
m68hc11_frame_unwind_cache (struct frame_info *next_frame,
m68hc11_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
ULONGEST prev_sp;
ULONGEST this_base;
struct m68hc11_unwind_cache *info;
@ -789,9 +789,9 @@ m68hc11_frame_unwind_cache (struct frame_info *next_frame,
info = FRAME_OBSTACK_ZALLOC (struct m68hc11_unwind_cache);
(*this_prologue_cache) = info;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
info->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
info->pc = get_frame_func (this_frame);
info->size = 0;
info->return_kind = m68hc11_get_return_insn (info->pc);
@ -799,14 +799,14 @@ m68hc11_frame_unwind_cache (struct frame_info *next_frame,
/* The SP was moved to the FP. This indicates that a new frame
was created. Get THIS frame's FP value by unwinding it from
the next frame. */
this_base = frame_unwind_register_unsigned (next_frame, SOFT_FP_REGNUM);
this_base = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
if (this_base == 0)
{
info->base = 0;
return info;
}
current_pc = frame_pc_unwind (next_frame);
current_pc = get_frame_pc (this_frame);
if (info->pc != 0)
m68hc11_scan_prologue (gdbarch, info->pc, current_pc, info);
@ -815,7 +815,7 @@ m68hc11_frame_unwind_cache (struct frame_info *next_frame,
if (info->sp_offset != (CORE_ADDR) -1)
{
info->saved_regs[HARD_PC_REGNUM].addr = info->sp_offset;
this_base = frame_unwind_register_unsigned (next_frame, HARD_SP_REGNUM);
this_base = get_frame_register_unsigned (this_frame, HARD_SP_REGNUM);
prev_sp = this_base + info->sp_offset + 2;
this_base += STACK_CORRECTION (gdbarch);
}
@ -874,18 +874,18 @@ m68hc11_frame_unwind_cache (struct frame_info *next_frame,
frame. This will be used to create a new GDB frame struct. */
static void
m68hc11_frame_this_id (struct frame_info *next_frame,
m68hc11_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
struct m68hc11_unwind_cache *info
= m68hc11_frame_unwind_cache (next_frame, this_prologue_cache);
= m68hc11_frame_unwind_cache (this_frame, this_prologue_cache);
CORE_ADDR base;
CORE_ADDR func;
struct frame_id id;
/* The FUNC is easy. */
func = frame_func_unwind (next_frame, NORMAL_FRAME);
func = get_frame_func (this_frame);
/* Hopefully the prologue analysis either correctly determined the
frame's base (which is the SP from the previous frame), or set
@ -898,67 +898,69 @@ m68hc11_frame_this_id (struct frame_info *next_frame,
(*this_id) = id;
}
static void
m68hc11_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
m68hc11_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct value *value;
struct m68hc11_unwind_cache *info
= m68hc11_frame_unwind_cache (next_frame, this_prologue_cache);
= m68hc11_frame_unwind_cache (this_frame, this_prologue_cache);
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
value = trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
if (regnum == HARD_PC_REGNUM)
/* Take into account the 68HC12 specific call (PC + page). */
if (regnum == HARD_PC_REGNUM
&& info->return_kind == RETURN_RTC
&& USE_PAGE_REGISTER (get_frame_arch (this_frame)))
{
/* Take into account the 68HC12 specific call (PC + page). */
if (info->return_kind == RETURN_RTC
&& *addrp >= 0x08000 && *addrp < 0x0c000
&& USE_PAGE_REGISTER (get_frame_arch (next_frame)))
CORE_ADDR pc = value_as_long (value);
if (pc >= 0x08000 && pc < 0x0c000)
{
int page_optimized;
CORE_ADDR page;
trad_frame_get_prev_register (next_frame, info->saved_regs,
HARD_PAGE_REGNUM, &page_optimized,
0, &page, 0, 0);
*addrp -= 0x08000;
*addrp += ((page & 0x0ff) << 14);
*addrp += 0x1000000;
release_value (value);
value_free (value);
value = trad_frame_get_prev_register (this_frame, info->saved_regs,
HARD_PAGE_REGNUM);
page = value_as_long (value);
release_value (value);
value_free (value);
pc -= 0x08000;
pc += ((page & 0x0ff) << 14);
pc += 0x1000000;
return frame_unwind_got_constant (this_frame, regnum, pc);
}
}
return value;
}
static const struct frame_unwind m68hc11_frame_unwind = {
NORMAL_FRAME,
m68hc11_frame_this_id,
m68hc11_frame_prev_register
m68hc11_frame_prev_register,
NULL,
default_frame_sniffer
};
const struct frame_unwind *
m68hc11_frame_sniffer (struct frame_info *next_frame)
{
return &m68hc11_frame_unwind;
}
static CORE_ADDR
m68hc11_frame_base_address (struct frame_info *next_frame, void **this_cache)
m68hc11_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct m68hc11_unwind_cache *info
= m68hc11_frame_unwind_cache (next_frame, this_cache);
= m68hc11_frame_unwind_cache (this_frame, this_cache);
return info->base;
}
static CORE_ADDR
m68hc11_frame_args_address (struct frame_info *next_frame, void **this_cache)
m68hc11_frame_args_address (struct frame_info *this_frame, void **this_cache)
{
CORE_ADDR addr;
struct m68hc11_unwind_cache *info
= m68hc11_frame_unwind_cache (next_frame, this_cache);
= m68hc11_frame_unwind_cache (this_frame, this_cache);
addr = info->base + info->size;
if (info->return_kind == RETURN_RTC)
@ -984,18 +986,17 @@ m68hc11_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
return sp;
}
/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
dummy frame. The frame ID's base needs to match the TOS value
saved by save_dummy_frame_tos(), and the PC match the dummy frame's
breakpoint. */
/* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
frame. The frame ID's base needs to match the TOS value saved by
save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
static struct frame_id
m68hc11_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
m68hc11_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
ULONGEST tos;
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
tos = frame_unwind_register_unsigned (next_frame, SOFT_FP_REGNUM);
tos = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
tos += 2;
return frame_id_build (tos, pc);
}
@ -1520,15 +1521,15 @@ m68hc11_gdbarch_init (struct gdbarch_info info,
set_gdbarch_print_registers_info (gdbarch, m68hc11_print_registers_info);
/* Hook in the DWARF CFI frame unwinder. */
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_sniffer (gdbarch, m68hc11_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &m68hc11_frame_unwind);
frame_base_set_default (gdbarch, &m68hc11_frame_base);
/* Methods for saving / extracting a dummy frame's ID. The ID's
stack address must match the SP value returned by
PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
set_gdbarch_unwind_dummy_id (gdbarch, m68hc11_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, m68hc11_dummy_id);
/* Return the unwound PC value. */
set_gdbarch_unwind_pc (gdbarch, m68hc11_unwind_pc);

View File

@ -1926,7 +1926,7 @@ mep_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR * pcptr, int *lenptr)
static struct mep_prologue *
mep_analyze_frame_prologue (struct frame_info *next_frame,
mep_analyze_frame_prologue (struct frame_info *this_frame,
void **this_prologue_cache)
{
if (! *this_prologue_cache)
@ -1936,8 +1936,8 @@ mep_analyze_frame_prologue (struct frame_info *next_frame,
*this_prologue_cache
= FRAME_OBSTACK_ZALLOC (struct mep_prologue);
func_start = frame_func_unwind (next_frame, NORMAL_FRAME);
stop_addr = frame_pc_unwind (next_frame);
func_start = get_frame_func (this_frame);
stop_addr = get_frame_pc (this_frame);
/* If we couldn't find any function containing the PC, then
just initialize the prologue cache, but don't do anything. */
@ -1954,11 +1954,11 @@ mep_analyze_frame_prologue (struct frame_info *next_frame,
/* Given the next frame and a prologue cache, return this frame's
base. */
static CORE_ADDR
mep_frame_base (struct frame_info *next_frame,
mep_frame_base (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct mep_prologue *p
= mep_analyze_frame_prologue (next_frame, this_prologue_cache);
= mep_analyze_frame_prologue (this_frame, this_prologue_cache);
/* In functions that use alloca, the distance between the stack
pointer and the frame base varies dynamically, so we can't use
@ -1969,37 +1969,34 @@ mep_frame_base (struct frame_info *next_frame,
if (p->has_frame_ptr)
{
CORE_ADDR fp
= frame_unwind_register_unsigned (next_frame, MEP_FP_REGNUM);
= get_frame_register_unsigned (this_frame, MEP_FP_REGNUM);
return fp - p->frame_ptr_offset;
}
else
{
CORE_ADDR sp
= frame_unwind_register_unsigned (next_frame, MEP_SP_REGNUM);
= get_frame_register_unsigned (this_frame, MEP_SP_REGNUM);
return sp - p->frame_size;
}
}
static void
mep_frame_this_id (struct frame_info *next_frame,
mep_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
*this_id = frame_id_build (mep_frame_base (next_frame, this_prologue_cache),
frame_func_unwind (next_frame, NORMAL_FRAME));
*this_id = frame_id_build (mep_frame_base (this_frame, this_prologue_cache),
get_frame_func (this_frame));
}
static void
mep_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
mep_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct mep_prologue *p
= mep_analyze_frame_prologue (next_frame, this_prologue_cache);
= mep_analyze_frame_prologue (this_frame, this_prologue_cache);
/* There are a number of complications in unwinding registers on the
MeP, having to do with core functions calling VLIW functions and
@ -2021,68 +2018,59 @@ mep_frame_prev_register (struct frame_info *next_frame,
do this. */
if (regnum == MEP_PC_REGNUM)
{
mep_frame_prev_register (next_frame, this_prologue_cache, MEP_LP_REGNUM,
optimizedp, lvalp, addrp, realnump, bufferp);
store_unsigned_integer (bufferp, MEP_LP_SIZE,
(extract_unsigned_integer (bufferp, MEP_LP_SIZE)
& ~1));
*lvalp = not_lval;
struct value *value;
CORE_ADDR lp;
value = mep_frame_prev_register (this_frame, this_prologue_cache,
MEP_LP_REGNUM);
lp = value_as_long (value);
release_value (value);
value_free (value);
return frame_unwind_got_constant (this_frame, regnum, lp & ~1);
}
else
{
CORE_ADDR frame_base = mep_frame_base (next_frame, this_prologue_cache);
int reg_size = register_size (get_frame_arch (next_frame), regnum);
CORE_ADDR frame_base = mep_frame_base (this_frame, this_prologue_cache);
struct value *value;
/* Our caller's SP is our frame base. */
if (regnum == MEP_SP_REGNUM)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (bufferp)
store_unsigned_integer (bufferp, reg_size, frame_base);
}
return frame_unwind_got_constant (this_frame, regnum, frame_base);
/* If prologue analysis says we saved this register somewhere,
return a description of the stack slot holding it. */
else if (p->reg_offset[regnum] != 1)
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = frame_base + p->reg_offset[regnum];
*realnump = -1;
if (bufferp)
get_frame_memory (next_frame, *addrp, bufferp, reg_size);
}
if (p->reg_offset[regnum] != 1)
value = frame_unwind_got_memory (this_frame, regnum,
frame_base + p->reg_offset[regnum]);
/* Otherwise, presume we haven't changed the value of this
register, and get it from the next frame. */
else
frame_register_unwind (next_frame, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
value = frame_unwind_got_register (this_frame, regnum, regnum);
/* If we need to toggle the operating mode, do so. */
if (regnum == MEP_PSW_REGNUM)
{
int lp_optimized;
enum lval_type lp_lval;
CORE_ADDR lp_addr;
int lp_realnum;
char lp_buffer[MEP_LP_SIZE];
CORE_ADDR psw, lp;
psw = value_as_long (value);
release_value (value);
value_free (value);
/* Get the LP's value, too. */
frame_register_unwind (next_frame, MEP_LP_REGNUM,
&lp_optimized, &lp_lval, &lp_addr,
&lp_realnum, lp_buffer);
value = get_frame_register_value (this_frame, MEP_LP_REGNUM);
lp = value_as_long (value);
release_value (value);
value_free (value);
/* If LP.LTOM is set, then toggle PSW.OM. */
if (extract_unsigned_integer (lp_buffer, MEP_LP_SIZE) & 0x1)
store_unsigned_integer
(bufferp, MEP_PSW_SIZE,
(extract_unsigned_integer (bufferp, MEP_PSW_SIZE) ^ 0x1000));
*lvalp = not_lval;
if (lp & 0x1)
psw ^= 0x1000;
return frame_unwind_got_constant (this_frame, regnum, psw);
}
return value;
}
}
@ -2090,17 +2078,12 @@ mep_frame_prev_register (struct frame_info *next_frame,
static const struct frame_unwind mep_frame_unwind = {
NORMAL_FRAME,
mep_frame_this_id,
mep_frame_prev_register
mep_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
mep_frame_sniffer (struct frame_info *next_frame)
{
return &mep_frame_unwind;
}
/* Our general unwinding function can handle unwinding the PC. */
static CORE_ADDR
mep_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
@ -2379,10 +2362,10 @@ mep_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
static struct frame_id
mep_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
mep_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (mep_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, MEP_SP_REGNUM);
return frame_id_build (sp, get_frame_pc (this_frame));
}
@ -2500,7 +2483,7 @@ mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_skip_prologue (gdbarch, mep_skip_prologue);
/* Frames and frame unwinding. */
frame_unwind_append_sniffer (gdbarch, mep_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &mep_frame_unwind);
set_gdbarch_unwind_pc (gdbarch, mep_unwind_pc);
set_gdbarch_unwind_sp (gdbarch, mep_unwind_sp);
set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
@ -2512,7 +2495,7 @@ mep_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Inferior function calls. */
set_gdbarch_frame_align (gdbarch, mep_frame_align);
set_gdbarch_push_dummy_call (gdbarch, mep_push_dummy_call);
set_gdbarch_unwind_dummy_id (gdbarch, mep_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, mep_dummy_id);
return gdbarch;
}

View File

@ -844,7 +844,7 @@ mn10300_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
/* Simple frame_unwind_cache.
This finds the "extra info" for the frame. */
struct trad_frame_cache *
mn10300_frame_unwind_cache (struct frame_info *next_frame,
mn10300_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct gdbarch *gdbarch;
@ -855,10 +855,10 @@ mn10300_frame_unwind_cache (struct frame_info *next_frame,
if (*this_prologue_cache)
return (*this_prologue_cache);
gdbarch = get_frame_arch (next_frame);
cache_p = trad_frame_cache_zalloc (next_frame);
pc = gdbarch_unwind_pc (gdbarch, next_frame);
mn10300_analyze_prologue (gdbarch, next_frame, &cache_p, pc);
gdbarch = get_frame_arch (this_frame);
cache_p = trad_frame_cache_zalloc (this_frame);
pc = get_frame_register_unsigned (this_frame, E_PC_REGNUM);
mn10300_analyze_prologue (gdbarch, this_frame, &cache_p, pc);
cache = cache_p;
if (find_pc_partial_function (pc, NULL, &start, &end))
@ -867,7 +867,7 @@ mn10300_frame_unwind_cache (struct frame_info *next_frame,
start));
else
{
start = frame_func_unwind (next_frame, NORMAL_FRAME);
start = get_frame_func (this_frame);
trad_frame_set_id (cache,
frame_id_build (trad_frame_get_this_base (cache),
start));
@ -879,65 +879,53 @@ mn10300_frame_unwind_cache (struct frame_info *next_frame,
/* Here is a dummy implementation. */
static struct frame_id
mn10300_unwind_dummy_id (struct gdbarch *gdbarch,
struct frame_info *next_frame)
mn10300_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (frame_sp_unwind (next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
CORE_ADDR pc = get_frame_register_unsigned (this_frame, E_PC_REGNUM);
return frame_id_build (sp, pc);
}
/* Trad frame implementation. */
static void
mn10300_frame_this_id (struct frame_info *next_frame,
mn10300_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache,
struct frame_id *this_id)
{
struct trad_frame_cache *cache =
mn10300_frame_unwind_cache (next_frame, this_prologue_cache);
mn10300_frame_unwind_cache (this_frame, this_prologue_cache);
trad_frame_get_id (cache, this_id);
}
static void
mn10300_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
mn10300_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct trad_frame_cache *cache =
mn10300_frame_unwind_cache (next_frame, this_prologue_cache);
mn10300_frame_unwind_cache (this_frame, this_prologue_cache);
trad_frame_get_register (cache, next_frame, regnum, optimizedp,
lvalp, addrp, realnump, bufferp);
/* Or...
trad_frame_get_prev_register (next_frame, cache->prev_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
*/
return trad_frame_get_register (cache, this_frame, regnum);
}
static const struct frame_unwind mn10300_frame_unwind = {
NORMAL_FRAME,
mn10300_frame_this_id,
mn10300_frame_prev_register
mn10300_frame_prev_register,
NULL,
default_frame_sniffer
};
static CORE_ADDR
mn10300_frame_base_address (struct frame_info *next_frame,
mn10300_frame_base_address (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct trad_frame_cache *cache =
mn10300_frame_unwind_cache (next_frame, this_prologue_cache);
mn10300_frame_unwind_cache (this_frame, this_prologue_cache);
return trad_frame_get_this_base (cache);
}
static const struct frame_unwind *
mn10300_frame_sniffer (struct frame_info *next_frame)
{
return &mn10300_frame_unwind;
}
static const struct frame_base mn10300_frame_base = {
&mn10300_frame_unwind,
mn10300_frame_base_address,
@ -966,10 +954,10 @@ mn10300_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
static void
mn10300_frame_unwind_init (struct gdbarch *gdbarch)
{
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, mn10300_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &mn10300_frame_unwind);
frame_base_set_default (gdbarch, &mn10300_frame_base);
set_gdbarch_unwind_dummy_id (gdbarch, mn10300_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, mn10300_dummy_id);
set_gdbarch_unwind_pc (gdbarch, mn10300_unwind_pc);
set_gdbarch_unwind_sp (gdbarch, mn10300_unwind_sp);
}

View File

@ -872,7 +872,7 @@ struct mt_unwind_cache
the frame. */
static struct mt_unwind_cache *
mt_frame_unwind_cache (struct frame_info *next_frame,
mt_frame_unwind_cache (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct gdbarch *gdbarch;
@ -885,7 +885,7 @@ mt_frame_unwind_cache (struct frame_info *next_frame,
if ((*this_prologue_cache))
return (*this_prologue_cache);
gdbarch = get_frame_arch (next_frame);
gdbarch = get_frame_arch (this_frame);
info = FRAME_OBSTACK_ZALLOC (struct mt_unwind_cache);
(*this_prologue_cache) = info;
@ -893,26 +893,26 @@ mt_frame_unwind_cache (struct frame_info *next_frame,
info->framesize = 0;
info->frame_base = 0;
info->frameless_p = 1;
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* Grab the frame-relative values of SP and FP, needed below.
The frame_saved_register function will find them on the
stack or in the registers as appropriate. */
sp = frame_unwind_register_unsigned (next_frame, MT_SP_REGNUM);
fp = frame_unwind_register_unsigned (next_frame, MT_FP_REGNUM);
sp = get_frame_register_unsigned (this_frame, MT_SP_REGNUM);
fp = get_frame_register_unsigned (this_frame, MT_FP_REGNUM);
start_addr = frame_func_unwind (next_frame, NORMAL_FRAME);
start_addr = get_frame_func (this_frame);
/* Return early if GDB couldn't find the function. */
if (start_addr == 0)
return info;
end_addr = frame_pc_unwind (next_frame);
end_addr = get_frame_pc (this_frame);
prologue_end_addr = skip_prologue_using_sal (start_addr);
if (end_addr == 0)
for (next_addr = start_addr; next_addr < end_addr; next_addr += 4)
{
instr = get_frame_memory_unsigned (next_frame, next_addr, 4);
instr = get_frame_memory_unsigned (this_frame, next_addr, 4);
if (delayed_store) /* previous instr was a push */
{
upper_half = delayed_store >> 16;
@ -1028,55 +1028,49 @@ mt_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
return sp;
}
/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
dummy frame. The frame ID's base needs to match the TOS value
saved by save_dummy_frame_tos(), and the PC match the dummy frame's
breakpoint. */
/* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
frame. The frame ID's base needs to match the TOS value saved by
save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
static struct frame_id
mt_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
mt_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (mt_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, MT_SP_REGNUM);
return frame_id_build (sp, get_frame_pc (this_frame));
}
/* Given a GDB frame, determine the address of the calling function's
frame. This will be used to create a new GDB frame struct. */
static void
mt_frame_this_id (struct frame_info *next_frame,
mt_frame_this_id (struct frame_info *this_frame,
void **this_prologue_cache, struct frame_id *this_id)
{
struct mt_unwind_cache *info =
mt_frame_unwind_cache (next_frame, this_prologue_cache);
mt_frame_unwind_cache (this_frame, this_prologue_cache);
if (!(info == NULL || info->prev_sp == 0))
(*this_id) = frame_id_build (info->prev_sp,
frame_func_unwind (next_frame, NORMAL_FRAME));
(*this_id) = frame_id_build (info->prev_sp, get_frame_func (this_frame));
return;
}
static void
mt_frame_prev_register (struct frame_info *next_frame,
void **this_prologue_cache,
int regnum, int *optimizedp,
enum lval_type *lvalp, CORE_ADDR *addrp,
int *realnump, gdb_byte *bufferp)
static struct value *
mt_frame_prev_register (struct frame_info *this_frame,
void **this_prologue_cache, int regnum)
{
struct mt_unwind_cache *info =
mt_frame_unwind_cache (next_frame, this_prologue_cache);
mt_frame_unwind_cache (this_frame, this_prologue_cache);
trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, bufferp);
return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
}
static CORE_ADDR
mt_frame_base_address (struct frame_info *next_frame,
mt_frame_base_address (struct frame_info *this_frame,
void **this_prologue_cache)
{
struct mt_unwind_cache *info =
mt_frame_unwind_cache (next_frame, this_prologue_cache);
mt_frame_unwind_cache (this_frame, this_prologue_cache);
return info->frame_base;
}
@ -1090,18 +1084,11 @@ mt_frame_base_address (struct frame_info *next_frame,
static const struct frame_unwind mt_frame_unwind = {
NORMAL_FRAME,
mt_frame_this_id,
mt_frame_prev_register
mt_frame_prev_register,
NULL,
default_frame_sniffer
};
/* The sniffer is a registered function that identifies our family of
frame unwind functions (this_id and prev_register). */
static const struct frame_unwind *
mt_frame_sniffer (struct frame_info *next_frame)
{
return &mt_frame_unwind;
}
/* Another shared interface: the 'frame_base' object specifies how to
unwind a frame and secure the base addresses for frame objects
(locals, args). */
@ -1168,8 +1155,8 @@ mt_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Register the DWARF 2 sniffer first, and then the traditional prologue
based sniffer. */
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, mt_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &mt_frame_unwind);
frame_base_set_default (gdbarch, &mt_frame_base);
/* Register the 'unwind_pc' method. */
@ -1179,7 +1166,7 @@ mt_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Methods for saving / extracting a dummy frame's ID.
The ID's stack address must match the SP value returned by
PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
set_gdbarch_unwind_dummy_id (gdbarch, mt_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, mt_dummy_id);
return gdbarch;
}

View File

@ -100,7 +100,7 @@ score_compare_pdr_entries (const void *a, const void *b)
static void
score_analyze_pdr_section (CORE_ADDR startaddr, CORE_ADDR pc,
struct frame_info *next_frame,
struct frame_info *this_frame,
struct score_frame_cache *this_cache)
{
struct symbol *sym;
@ -442,12 +442,11 @@ score_return_value (struct gdbarch *gdbarch, struct type *func_type,
}
static struct frame_id
score_unwind_dummy_id (struct gdbarch *gdbarch,
struct frame_info *next_frame)
score_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (
frame_unwind_register_unsigned (next_frame, SCORE_SP_REGNUM),
frame_pc_unwind (next_frame));
get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM),
get_frame_pc (this_frame));
}
static int
@ -754,10 +753,10 @@ score_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
static void
score_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
struct frame_info *next_frame,
struct frame_info *this_frame,
struct score_frame_cache *this_cache)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
CORE_ADDR sp;
CORE_ADDR fp;
CORE_ADDR cur_pc = startaddr;
@ -777,8 +776,8 @@ score_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
memblock_ptr = memblock =
score_malloc_and_get_memblock (startaddr, pc - startaddr);
sp = frame_unwind_register_unsigned (next_frame, SCORE_SP_REGNUM);
fp = frame_unwind_register_unsigned (next_frame, SCORE_FP_REGNUM);
sp = get_frame_register_unsigned (this_frame, SCORE_SP_REGNUM);
fp = get_frame_register_unsigned (this_frame, SCORE_FP_REGNUM);
for (; cur_pc < pc; prev_pc = cur_pc, cur_pc += inst_len)
{
@ -938,7 +937,7 @@ score_analyze_prologue (CORE_ADDR startaddr, CORE_ADDR pc,
}
static struct score_frame_cache *
score_make_prologue_cache (struct frame_info *next_frame, void **this_cache)
score_make_prologue_cache (struct frame_info *this_frame, void **this_cache)
{
struct score_frame_cache *cache;
@ -947,17 +946,17 @@ score_make_prologue_cache (struct frame_info *next_frame, void **this_cache)
cache = FRAME_OBSTACK_ZALLOC (struct score_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);
/* Analyze the prologue. */
{
const CORE_ADDR pc = frame_pc_unwind (next_frame);
const CORE_ADDR pc = get_frame_pc (this_frame);
CORE_ADDR start_addr;
find_pc_partial_function (pc, NULL, &start_addr, NULL);
if (start_addr == 0)
return cache;
score_analyze_prologue (start_addr, pc, next_frame, *this_cache);
score_analyze_prologue (start_addr, pc, this_frame, *this_cache);
}
/* Save SP. */
@ -967,47 +966,38 @@ score_make_prologue_cache (struct frame_info *next_frame, void **this_cache)
}
static void
score_prologue_this_id (struct frame_info *next_frame, void **this_cache,
score_prologue_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct score_frame_cache *info = score_make_prologue_cache (next_frame,
struct score_frame_cache *info = score_make_prologue_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
score_prologue_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 *
score_prologue_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct score_frame_cache *info = score_make_prologue_cache (next_frame,
struct score_frame_cache *info = score_make_prologue_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 score_prologue_unwind =
{
NORMAL_FRAME,
score_prologue_this_id,
score_prologue_prev_register
score_prologue_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
score_prologue_sniffer (struct frame_info *next_frame)
{
return &score_prologue_unwind;
}
static CORE_ADDR
score_prologue_frame_base_address (struct frame_info *next_frame,
score_prologue_frame_base_address (struct frame_info *this_frame,
void **this_cache)
{
struct score_frame_cache *info =
score_make_prologue_cache (next_frame, this_cache);
score_make_prologue_cache (this_frame, this_cache);
return info->fp;
}
@ -1020,7 +1010,7 @@ static const struct frame_base score_prologue_frame_base =
};
static const struct frame_base *
score_prologue_frame_base_sniffer (struct frame_info *next_frame)
score_prologue_frame_base_sniffer (struct frame_info *this_frame)
{
return &score_prologue_frame_base;
}
@ -1063,13 +1053,13 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Dummy frame hooks. */
set_gdbarch_return_value (gdbarch, score_return_value);
set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
set_gdbarch_unwind_dummy_id (gdbarch, score_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, score_dummy_id);
set_gdbarch_push_dummy_call (gdbarch, score_push_dummy_call);
/* Normal frame hooks. */
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
frame_unwind_append_sniffer (gdbarch, score_prologue_sniffer);
frame_unwind_append_unwinder (gdbarch, &score_prologue_unwind);
frame_base_append_sniffer (gdbarch, score_prologue_frame_base_sniffer);
return gdbarch;

View File

@ -2512,7 +2512,7 @@ sh_alloc_frame_cache (void)
}
static struct sh_frame_cache *
sh_frame_cache (struct frame_info *next_frame, void **this_cache)
sh_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct sh_frame_cache *cache;
CORE_ADDR current_pc;
@ -2529,16 +2529,16 @@ sh_frame_cache (struct frame_info *next_frame, void **this_cache)
However, for functions that don't need it, the frame pointer is
optional. For these "frameless" functions the frame pointer is
actually the frame pointer of the calling frame. */
cache->base = frame_unwind_register_unsigned (next_frame, FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, FP_REGNUM);
if (cache->base == 0)
return cache;
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
current_pc = frame_pc_unwind (next_frame);
cache->pc = get_frame_func (this_frame);
current_pc = get_frame_pc (this_frame);
if (cache->pc != 0)
{
ULONGEST fpscr;
fpscr = frame_unwind_register_unsigned (next_frame, FPSCR_REGNUM);
fpscr = get_frame_register_unsigned (this_frame, FPSCR_REGNUM);
sh_analyze_prologue (cache->pc, current_pc, cache, fpscr);
}
@ -2551,9 +2551,9 @@ sh_frame_cache (struct frame_info *next_frame, void **this_cache)
setup yet. Try to reconstruct the base address for the stack
frame by looking at the stack pointer. For truly "frameless"
functions this might work too. */
cache->base = frame_unwind_register_unsigned
(next_frame,
gdbarch_sp_regnum (get_frame_arch (next_frame)));
cache->base = get_frame_register_unsigned
(this_frame,
gdbarch_sp_regnum (get_frame_arch (this_frame)));
}
/* Now that we have the base address for the stack frame we can
@ -2569,30 +2569,17 @@ sh_frame_cache (struct frame_info *next_frame, void **this_cache)
return cache;
}
static void
sh_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 *
sh_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct sh_frame_cache *cache = sh_frame_cache (next_frame, this_cache);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
struct sh_frame_cache *cache = sh_frame_cache (this_frame, this_cache);
gdb_assert (regnum >= 0);
if (regnum == gdbarch_sp_regnum (gdbarch) && cache->saved_sp)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (valuep)
{
/* Store the value. */
store_unsigned_integer (valuep, 4, cache->saved_sp);
}
return;
}
return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
/* The PC of the previous frame is stored in the PR register of
the current frame. Frob regnum so that we pull the value from
@ -2601,33 +2588,17 @@ sh_frame_prev_register (struct frame_info *next_frame, void **this_cache,
regnum = PR_REGNUM;
if (regnum < SH_NUM_REGS && cache->saved_regs[regnum] != -1)
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = cache->saved_regs[regnum];
*realnump = -1;
if (valuep)
{
/* Read the value in from memory. */
read_memory (*addrp, valuep,
register_size (gdbarch, regnum));
}
return;
}
return frame_unwind_got_memory (this_frame, regnum,
cache->saved_regs[regnum]);
*optimizedp = 0;
*lvalp = lval_register;
*addrp = 0;
*realnump = regnum;
if (valuep)
frame_unwind_register (next_frame, (*realnump), valuep);
return frame_unwind_got_register (this_frame, regnum, regnum);
}
static void
sh_frame_this_id (struct frame_info *next_frame, void **this_cache,
sh_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct sh_frame_cache *cache = sh_frame_cache (next_frame, this_cache);
struct sh_frame_cache *cache = sh_frame_cache (this_frame, this_cache);
/* This marks the outermost frame. */
if (cache->base == 0)
@ -2639,15 +2610,11 @@ sh_frame_this_id (struct frame_info *next_frame, void **this_cache,
static const struct frame_unwind sh_frame_unwind = {
NORMAL_FRAME,
sh_frame_this_id,
sh_frame_prev_register
sh_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
sh_frame_sniffer (struct frame_info *next_frame)
{
return &sh_frame_unwind;
}
static CORE_ADDR
sh_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
{
@ -2663,16 +2630,17 @@ sh_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
sh_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
sh_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (sh_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame,
gdbarch_sp_regnum (gdbarch));
return frame_id_build (sp, get_frame_pc (this_frame));
}
static CORE_ADDR
sh_frame_base_address (struct frame_info *next_frame, void **this_cache)
sh_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct sh_frame_cache *cache = sh_frame_cache (next_frame, this_cache);
struct sh_frame_cache *cache = sh_frame_cache (this_frame, this_cache);
return cache->base;
}
@ -2862,7 +2830,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_frame_align (gdbarch, sh_frame_align);
set_gdbarch_unwind_sp (gdbarch, sh_unwind_sp);
set_gdbarch_unwind_pc (gdbarch, sh_unwind_pc);
set_gdbarch_unwind_dummy_id (gdbarch, sh_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, sh_dummy_id);
frame_base_set_default (gdbarch, &sh_frame_base);
set_gdbarch_in_function_epilogue_p (gdbarch, sh_in_function_epilogue_p);
@ -2973,8 +2941,8 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, sh_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &sh_frame_unwind);
return gdbarch;
}

View File

@ -2263,7 +2263,7 @@ sh64_alloc_frame_cache (void)
}
static struct sh64_frame_cache *
sh64_frame_cache (struct frame_info *next_frame, void **this_cache)
sh64_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct gdbarch *gdbarch;
struct sh64_frame_cache *cache;
@ -2273,11 +2273,11 @@ sh64_frame_cache (struct frame_info *next_frame, void **this_cache)
if (*this_cache)
return *this_cache;
gdbarch = get_frame_arch (next_frame);
gdbarch = get_frame_arch (this_frame);
cache = sh64_alloc_frame_cache ();
*this_cache = cache;
current_pc = frame_pc_unwind (next_frame);
current_pc = get_frame_pc (this_frame);
cache->media_mode = pc_is_isa32 (current_pc);
/* In principle, for normal frames, fp holds the frame pointer,
@ -2285,11 +2285,11 @@ sh64_frame_cache (struct frame_info *next_frame, void **this_cache)
However, for functions that don't need it, the frame pointer is
optional. For these "frameless" functions the frame pointer is
actually the frame pointer of the calling frame. */
cache->base = frame_unwind_register_unsigned (next_frame, MEDIA_FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, MEDIA_FP_REGNUM);
if (cache->base == 0)
return cache;
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
cache->pc = get_frame_func (this_frame);
if (cache->pc != 0)
sh64_analyze_prologue (gdbarch, cache, cache->pc, current_pc);
@ -2302,8 +2302,8 @@ sh64_frame_cache (struct frame_info *next_frame, void **this_cache)
setup yet. Try to reconstruct the base address for the stack
frame by looking at the stack pointer. For truly "frameless"
functions this might work too. */
cache->base = frame_unwind_register_unsigned
(next_frame, gdbarch_sp_regnum (gdbarch));
cache->base = get_frame_register_unsigned
(this_frame, gdbarch_sp_regnum (gdbarch));
}
/* Now that we have the base address for the stack frame we can
@ -2319,33 +2319,17 @@ sh64_frame_cache (struct frame_info *next_frame, void **this_cache)
return cache;
}
static void
sh64_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 *
sh64_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct sh64_frame_cache *cache = sh64_frame_cache (next_frame, this_cache);
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
struct gdbarch *gdbarch = get_frame_arch (this_frame);
gdb_assert (regnum >= 0);
if (regnum == gdbarch_sp_regnum (gdbarch) && cache->saved_sp)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (valuep)
{
/* Store the value. */
store_unsigned_integer (valuep,
register_size (gdbarch,
gdbarch_sp_regnum (gdbarch)),
cache->saved_sp);
}
return;
}
frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
/* The PC of the previous frame is stored in the PR register of
the current frame. Frob regnum so that we pull the value from
@ -2355,42 +2339,26 @@ sh64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
if (regnum < SIM_SH64_NR_REGS && cache->saved_regs[regnum] != -1)
{
int reg_size = register_size (gdbarch, regnum);
int size;
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = cache->saved_regs[regnum];
*realnump = -1;
if (gdbarch_tdep (gdbarch)->sh_abi == SH_ABI_32
&& (regnum == MEDIA_FP_REGNUM || regnum == PR_REGNUM))
size = 4;
else
size = reg_size;
if (valuep)
{
memset (valuep, 0, reg_size);
if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE)
read_memory (*addrp, valuep, size);
else
read_memory (*addrp, (char *) valuep + reg_size - size, size);
CORE_ADDR val;
val = read_memory_unsigned_integer (cache->saved_regs[regnum], 4);
return frame_unwind_got_constant (this_frame, regnum, val);
}
return;
return frame_unwind_got_memory (this_frame, regnum,
cache->saved_regs[regnum]);
}
*optimizedp = 0;
*lvalp = lval_register;
*addrp = 0;
*realnump = regnum;
if (valuep)
frame_unwind_register (next_frame, (*realnump), valuep);
return frame_unwind_got_register (this_frame, regnum, regnum);
}
static void
sh64_frame_this_id (struct frame_info *next_frame, void **this_cache,
sh64_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct sh64_frame_cache *cache = sh64_frame_cache (next_frame, this_cache);
struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
/* This marks the outermost frame. */
if (cache->base == 0)
@ -2402,15 +2370,11 @@ sh64_frame_this_id (struct frame_info *next_frame, void **this_cache,
static const struct frame_unwind sh64_frame_unwind = {
NORMAL_FRAME,
sh64_frame_this_id,
sh64_frame_prev_register
sh64_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
sh64_frame_sniffer (struct frame_info *next_frame)
{
return &sh64_frame_unwind;
}
static CORE_ADDR
sh64_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
{
@ -2426,16 +2390,17 @@ sh64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
sh64_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
sh64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (sh64_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame,
gdbarch_sp_regnum (gdbarch));
return frame_id_build (sp, get_frame_pc (this_frame));
}
static CORE_ADDR
sh64_frame_base_address (struct frame_info *next_frame, void **this_cache)
sh64_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct sh64_frame_cache *cache = sh64_frame_cache (next_frame, this_cache);
struct sh64_frame_cache *cache = sh64_frame_cache (this_frame, this_cache);
return cache->base;
}
@ -2521,7 +2486,7 @@ sh64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_frame_align (gdbarch, sh64_frame_align);
set_gdbarch_unwind_sp (gdbarch, sh64_unwind_sp);
set_gdbarch_unwind_pc (gdbarch, sh64_unwind_pc);
set_gdbarch_unwind_dummy_id (gdbarch, sh64_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, sh64_dummy_id);
frame_base_set_default (gdbarch, &sh64_frame_base);
set_gdbarch_print_registers_info (gdbarch, sh64_print_registers_info);
@ -2532,8 +2497,8 @@ sh64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, sh64_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &sh64_frame_unwind);
return gdbarch;
}

View File

@ -90,7 +90,7 @@ sparc64fbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
}
static struct sparc_frame_cache *
sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
sparc64fbsd_sigtramp_frame_cache (struct frame_info *this_frame,
void **this_cache)
{
struct sparc_frame_cache *cache;
@ -101,15 +101,15 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
if (*this_cache)
return *this_cache;
cache = sparc_frame_cache (next_frame, this_cache);
cache = sparc_frame_cache (this_frame, this_cache);
gdb_assert (cache == *this_cache);
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* The third argument is a pointer to an instance of `ucontext_t',
which has a member `uc_mcontext' that contains the saved
registers. */
addr = frame_unwind_register_unsigned (next_frame, SPARC_O2_REGNUM);
addr = get_frame_register_unsigned (this_frame, SPARC_O2_REGNUM);
mcontext_addr = addr + 64;
/* The following registers travel in the `mc_local' slots of
@ -136,7 +136,7 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
/* The `local' and `in' registers have been saved in the register
save area. */
addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
sp = get_frame_memory_unsigned (next_frame, addr, 8);
sp = get_frame_memory_unsigned (this_frame, addr, 8);
for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
cache->saved_regs[regnum].addr = addr;
@ -147,7 +147,7 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
#define FPRS_FEF (1 << 2)
addr = cache->saved_regs[SPARC64_FPRS_REGNUM].addr;
fprs = get_frame_memory_unsigned (next_frame, addr, 8);
fprs = get_frame_memory_unsigned (this_frame, addr, 8);
if (fprs & FPRS_FEF)
{
for (regnum = SPARC_F0_REGNUM, addr = mcontext_addr + 32 * 8;
@ -163,50 +163,49 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
}
static void
sparc64fbsd_sigtramp_frame_this_id (struct frame_info *next_frame,
sparc64fbsd_sigtramp_frame_this_id (struct frame_info *this_frame,
void **this_cache,
struct frame_id *this_id)
{
struct sparc_frame_cache *cache =
sparc64fbsd_sigtramp_frame_cache (next_frame, this_cache);
sparc64fbsd_sigtramp_frame_cache (this_frame, this_cache);
(*this_id) = frame_id_build (cache->base, cache->pc);
}
static void
sparc64fbsd_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 *
sparc64fbsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct sparc_frame_cache *cache =
sparc64fbsd_sigtramp_frame_cache (next_frame, this_cache);
sparc64fbsd_sigtramp_frame_cache (this_frame, this_cache);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static int
sparc64fbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (sparc64fbsd_pc_in_sigtramp (pc, name))
return 1;
return 0;
}
static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind =
{
SIGTRAMP_FRAME,
sparc64fbsd_sigtramp_frame_this_id,
sparc64fbsd_sigtramp_frame_prev_register
sparc64fbsd_sigtramp_frame_prev_register,
NULL,
sparc64fbsd_sigtramp_frame_sniffer
};
static const struct frame_unwind *
sparc64fbsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (sparc64fbsd_pc_in_sigtramp (pc, name))
return &sparc64fbsd_sigtramp_frame_unwind;
return NULL;
}
static void
@ -222,7 +221,7 @@ sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
sparc64fbsd_collect_fpregset);
tdep->sizeof_fpregset = 272;
frame_unwind_append_sniffer (gdbarch, sparc64fbsd_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &sparc64fbsd_sigtramp_frame_unwind);
sparc64_init_abi (info, gdbarch);

View File

@ -90,13 +90,13 @@ sparc64nbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
struct trad_frame_saved_reg *
sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
struct frame_info *next_frame)
struct frame_info *this_frame)
{
struct trad_frame_saved_reg *saved_regs;
CORE_ADDR addr, sp;
int regnum, delta;
saved_regs = trad_frame_alloc_saved_regs (next_frame);
saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* The registers are saved in bits and pieces scattered all over the
place. The code below records their location on the assumption
@ -127,7 +127,7 @@ sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
/* The `local' and `in' registers have been saved in the register
save area. */
addr = saved_regs[SPARC_SP_REGNUM].addr;
sp = get_frame_memory_unsigned (next_frame, addr, 8);
sp = get_frame_memory_unsigned (this_frame, addr, 8);
for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
saved_regs[regnum].addr = addr;
@ -141,7 +141,7 @@ sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
ULONGEST i7;
addr = saved_regs[SPARC_I7_REGNUM].addr;
i7 = get_frame_memory_unsigned (next_frame, addr, 8);
i7 = get_frame_memory_unsigned (this_frame, addr, 8);
trad_frame_set_value (saved_regs, SPARC_I7_REGNUM, i7 ^ wcookie);
}
}
@ -152,7 +152,7 @@ sparc64nbsd_sigcontext_saved_regs (CORE_ADDR sigcontext_addr,
}
static struct sparc_frame_cache *
sparc64nbsd_sigcontext_frame_cache (struct frame_info *next_frame,
sparc64nbsd_sigcontext_frame_cache (struct frame_info *this_frame,
void **this_cache)
{
struct sparc_frame_cache *cache;
@ -161,7 +161,7 @@ sparc64nbsd_sigcontext_frame_cache (struct frame_info *next_frame,
if (*this_cache)
return *this_cache;
cache = sparc_frame_cache (next_frame, this_cache);
cache = sparc_frame_cache (this_frame, this_cache);
gdb_assert (cache == *this_cache);
/* If we couldn't find the frame's function, we're probably dealing
@ -173,7 +173,7 @@ sparc64nbsd_sigcontext_frame_cache (struct frame_info *next_frame,
/* Since we couldn't find the frame's function, the cache was
initialized under the assumption that we're frameless. */
cache->frameless_p = 0;
addr = frame_unwind_register_unsigned (next_frame, SPARC_FP_REGNUM);
addr = get_frame_register_unsigned (this_frame, SPARC_FP_REGNUM);
if (addr & 1)
addr += BIAS;
cache->base = addr;
@ -182,59 +182,58 @@ sparc64nbsd_sigcontext_frame_cache (struct frame_info *next_frame,
/* We find the appropriate instance of `struct sigcontext' at a
fixed offset in the signal frame. */
addr = cache->base + 128 + 8;
cache->saved_regs = sparc64nbsd_sigcontext_saved_regs (addr, next_frame);
cache->saved_regs = sparc64nbsd_sigcontext_saved_regs (addr, this_frame);
return cache;
}
static void
sparc64nbsd_sigcontext_frame_this_id (struct frame_info *next_frame,
sparc64nbsd_sigcontext_frame_this_id (struct frame_info *this_frame,
void **this_cache,
struct frame_id *this_id)
{
struct sparc_frame_cache *cache =
sparc64nbsd_sigcontext_frame_cache (next_frame, this_cache);
sparc64nbsd_sigcontext_frame_cache (this_frame, this_cache);
(*this_id) = frame_id_build (cache->base, cache->pc);
}
static void
sparc64nbsd_sigcontext_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 *
sparc64nbsd_sigcontext_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct sparc_frame_cache *cache =
sparc64nbsd_sigcontext_frame_cache (next_frame, this_cache);
sparc64nbsd_sigcontext_frame_cache (this_frame, this_cache);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind =
static int
sparc64nbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
SIGTRAMP_FRAME,
sparc64nbsd_sigcontext_frame_this_id,
sparc64nbsd_sigcontext_frame_prev_register
};
static const struct frame_unwind *
sparc64nbsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (sparc64nbsd_pc_in_sigtramp (pc, name))
{
if (name == NULL || strncmp (name, "__sigtramp_sigcontext", 21))
return &sparc64nbsd_sigcontext_frame_unwind;
return 1;
}
return NULL;
return 0;
}
static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind =
{
SIGTRAMP_FRAME,
sparc64nbsd_sigcontext_frame_this_id,
sparc64nbsd_sigcontext_frame_prev_register,
NULL,
sparc64nbsd_sigtramp_frame_sniffer
};
static void
@ -251,7 +250,7 @@ sparc64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Make sure we can single-step "new" syscalls. */
tdep->step_trap = sparcnbsd_step_trap;
frame_unwind_append_sniffer (gdbarch, sparc64nbsd_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &sparc64nbsd_sigcontext_frame_unwind);
sparc64_init_abi (info, gdbarch);

View File

@ -121,7 +121,7 @@ sparc64obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
}
static struct sparc_frame_cache *
sparc64obsd_frame_cache (struct frame_info *next_frame, void **this_cache)
sparc64obsd_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct sparc_frame_cache *cache;
CORE_ADDR addr;
@ -129,20 +129,20 @@ sparc64obsd_frame_cache (struct frame_info *next_frame, void **this_cache)
if (*this_cache)
return *this_cache;
cache = sparc_frame_cache (next_frame, this_cache);
cache = sparc_frame_cache (this_frame, this_cache);
gdb_assert (cache == *this_cache);
/* If we couldn't find the frame's function, we're probably dealing
with an on-stack signal trampoline. */
if (cache->pc == 0)
{
cache->pc = frame_pc_unwind (next_frame);
cache->pc = get_frame_pc (this_frame);
cache->pc &= ~(sparc64obsd_page_size - 1);
/* Since we couldn't find the frame's function, the cache was
initialized under the assumption that we're frameless. */
cache->frameless_p = 0;
addr = frame_unwind_register_unsigned (next_frame, SPARC_FP_REGNUM);
addr = get_frame_register_unsigned (this_frame, SPARC_FP_REGNUM);
if (addr & 1)
addr += BIAS;
cache->base = addr;
@ -151,59 +151,59 @@ sparc64obsd_frame_cache (struct frame_info *next_frame, void **this_cache)
/* We find the appropriate instance of `struct sigcontext' at a
fixed offset in the signal frame. */
addr = cache->base + 128 + 16;
cache->saved_regs = sparc64nbsd_sigcontext_saved_regs (addr, next_frame);
cache->saved_regs = sparc64nbsd_sigcontext_saved_regs (addr, this_frame);
return cache;
}
static void
sparc64obsd_frame_this_id (struct frame_info *next_frame, void **this_cache,
sparc64obsd_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct sparc_frame_cache *cache =
sparc64obsd_frame_cache (next_frame, this_cache);
sparc64obsd_frame_cache (this_frame, this_cache);
(*this_id) = frame_id_build (cache->base, cache->pc);
}
static void
sparc64obsd_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 *
sparc64obsd_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct sparc_frame_cache *cache =
sparc64obsd_frame_cache (next_frame, this_cache);
sparc64obsd_frame_cache (this_frame, this_cache);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static int
sparc64obsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc = get_frame_pc (this_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (sparc64obsd_pc_in_sigtramp (pc, name))
return 1;
return 0;
}
static const struct frame_unwind sparc64obsd_frame_unwind =
{
SIGTRAMP_FRAME,
sparc64obsd_frame_this_id,
sparc64obsd_frame_prev_register
sparc64obsd_frame_prev_register,
NULL,
sparc64obsd_sigtramp_frame_sniffer
};
static const struct frame_unwind *
sparc64obsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
CORE_ADDR pc = frame_pc_unwind (next_frame);
char *name;
find_pc_partial_function (pc, &name, NULL, NULL);
if (sparc64obsd_pc_in_sigtramp (pc, name))
return &sparc64obsd_frame_unwind;
return NULL;
}
/* Kernel debugging support. */
static struct sparc_frame_cache *
sparc64obsd_trapframe_cache (struct frame_info *next_frame, void **this_cache)
sparc64obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache)
{
struct sparc_frame_cache *cache;
CORE_ADDR sp, trapframe_addr;
@ -212,13 +212,13 @@ sparc64obsd_trapframe_cache (struct frame_info *next_frame, void **this_cache)
if (*this_cache)
return *this_cache;
cache = sparc_frame_cache (next_frame, this_cache);
cache = sparc_frame_cache (this_frame, this_cache);
gdb_assert (cache == *this_cache);
sp = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
sp = get_frame_register_unsigned (this_frame, SPARC_SP_REGNUM);
trapframe_addr = sp + BIAS + 176;
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
cache->saved_regs[SPARC64_STATE_REGNUM].addr = trapframe_addr;
cache->saved_regs[SPARC64_PC_REGNUM].addr = trapframe_addr + 8;
@ -232,55 +232,55 @@ sparc64obsd_trapframe_cache (struct frame_info *next_frame, void **this_cache)
}
static void
sparc64obsd_trapframe_this_id (struct frame_info *next_frame,
sparc64obsd_trapframe_this_id (struct frame_info *this_frame,
void **this_cache, struct frame_id *this_id)
{
struct sparc_frame_cache *cache =
sparc64obsd_trapframe_cache (next_frame, this_cache);
sparc64obsd_trapframe_cache (this_frame, this_cache);
(*this_id) = frame_id_build (cache->base, cache->pc);
}
static void
sparc64obsd_trapframe_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 *
sparc64obsd_trapframe_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct sparc_frame_cache *cache =
sparc64obsd_trapframe_cache (next_frame, this_cache);
sparc64obsd_trapframe_cache (this_frame, this_cache);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static const struct frame_unwind sparc64obsd_trapframe_unwind =
{
NORMAL_FRAME,
sparc64obsd_trapframe_this_id,
sparc64obsd_trapframe_prev_register
};
static const struct frame_unwind *
sparc64obsd_trapframe_sniffer (struct frame_info *next_frame)
static int
sparc64obsd_trapframe_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
CORE_ADDR pc;
ULONGEST pstate;
char *name;
/* Check whether we are in privileged mode, and bail out if we're not. */
pstate = frame_unwind_register_unsigned (next_frame, SPARC64_PSTATE_REGNUM);
pstate = get_frame_register_unsigned (this_frame, SPARC64_PSTATE_REGNUM);
if ((pstate & SPARC64_PSTATE_PRIV) == 0)
return NULL;
return 0;
pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
pc = get_frame_address_in_block (this_frame);
find_pc_partial_function (pc, &name, NULL, NULL);
if (name && strcmp (name, "Lslowtrap_reenter") == 0)
return &sparc64obsd_trapframe_unwind;
return 1;
return NULL;
return 0;
}
static const struct frame_unwind sparc64obsd_trapframe_unwind =
{
NORMAL_FRAME,
sparc64obsd_trapframe_this_id,
sparc64obsd_trapframe_prev_register,
NULL,
sparc64obsd_trapframe_sniffer
};
/* Threads support. */
@ -378,8 +378,8 @@ sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Make sure we can single-step "new" syscalls. */
tdep->step_trap = sparcnbsd_step_trap;
frame_unwind_append_sniffer (gdbarch, sparc64obsd_sigtramp_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, sparc64obsd_trapframe_sniffer);
frame_unwind_append_unwinder (gdbarch, &sparc64obsd_frame_unwind);
frame_unwind_append_unwinder (gdbarch, &sparc64obsd_trapframe_unwind);
sparc64_init_abi (info, gdbarch);

View File

@ -812,13 +812,13 @@ v850_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
}
static struct v850_frame_cache *
v850_alloc_frame_cache (struct frame_info *next_frame)
v850_alloc_frame_cache (struct frame_info *this_frame)
{
struct v850_frame_cache *cache;
int i;
cache = FRAME_OBSTACK_ZALLOC (struct v850_frame_cache);
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* Base address. */
cache->base = 0;
@ -832,7 +832,7 @@ v850_alloc_frame_cache (struct frame_info *next_frame)
}
static struct v850_frame_cache *
v850_frame_cache (struct frame_info *next_frame, void **this_cache)
v850_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct v850_frame_cache *cache;
CORE_ADDR current_pc;
@ -841,7 +841,7 @@ v850_frame_cache (struct frame_info *next_frame, void **this_cache)
if (*this_cache)
return *this_cache;
cache = v850_alloc_frame_cache (next_frame);
cache = v850_alloc_frame_cache (this_frame);
*this_cache = cache;
/* In principle, for normal frames, fp holds the frame pointer,
@ -849,16 +849,16 @@ v850_frame_cache (struct frame_info *next_frame, void **this_cache)
However, for functions that don't need it, the frame pointer is
optional. For these "frameless" functions the frame pointer is
actually the frame pointer of the calling frame. */
cache->base = frame_unwind_register_unsigned (next_frame, E_FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_FP_REGNUM);
if (cache->base == 0)
return cache;
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
current_pc = frame_pc_unwind (next_frame);
cache->pc = get_frame_func (this_frame);
current_pc = get_frame_pc (this_frame);
if (cache->pc != 0)
{
ULONGEST ctbp;
ctbp = frame_unwind_register_unsigned (next_frame, E_CTBP_REGNUM);
ctbp = get_frame_register_unsigned (this_frame, E_CTBP_REGNUM);
v850_analyze_prologue (cache->pc, current_pc, cache, ctbp);
}
@ -871,7 +871,7 @@ v850_frame_cache (struct frame_info *next_frame, void **this_cache)
setup yet. Try to reconstruct the base address for the stack
frame by looking at the stack pointer. For truly "frameless"
functions this might work too. */
cache->base = frame_unwind_register_unsigned (next_frame, E_SP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
}
/* Now that we have the base address for the stack frame we can
@ -896,25 +896,22 @@ v850_frame_cache (struct frame_info *next_frame, void **this_cache)
}
static void
v850_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 *
v850_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct v850_frame_cache *cache = v850_frame_cache (next_frame, this_cache);
struct v850_frame_cache *cache = v850_frame_cache (this_frame, this_cache);
gdb_assert (regnum >= 0);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static void
v850_frame_this_id (struct frame_info *next_frame, void **this_cache,
v850_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct v850_frame_cache *cache = v850_frame_cache (next_frame, this_cache);
struct v850_frame_cache *cache = v850_frame_cache (this_frame, this_cache);
/* This marks the outermost frame. */
if (cache->base == 0)
@ -926,14 +923,10 @@ v850_frame_this_id (struct frame_info *next_frame, void **this_cache,
static const struct frame_unwind v850_frame_unwind = {
NORMAL_FRAME,
v850_frame_this_id,
v850_frame_prev_register
v850_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
v850_frame_sniffer (struct frame_info *next_frame)
{
return &v850_frame_unwind;
}
static CORE_ADDR
v850_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
@ -950,16 +943,17 @@ v850_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
v850_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
v850_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (v850_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame,
gdbarch_sp_regnum (gdbarch));
return frame_id_build (sp, get_frame_pc (this_frame));
}
static CORE_ADDR
v850_frame_base_address (struct frame_info *next_frame, void **this_cache)
v850_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct v850_frame_cache *cache = v850_frame_cache (next_frame, this_cache);
struct v850_frame_cache *cache = v850_frame_cache (this_frame, this_cache);
return cache->base;
}
@ -1026,14 +1020,14 @@ v850_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_frame_align (gdbarch, v850_frame_align);
set_gdbarch_unwind_sp (gdbarch, v850_unwind_sp);
set_gdbarch_unwind_pc (gdbarch, v850_unwind_pc);
set_gdbarch_unwind_dummy_id (gdbarch, v850_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, v850_dummy_id);
frame_base_set_default (gdbarch, &v850_frame_base);
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, v850_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &v850_frame_unwind);
return gdbarch;
}

View File

@ -191,12 +191,12 @@ vax_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
}
static struct frame_id
vax_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
vax_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
CORE_ADDR fp;
fp = frame_unwind_register_unsigned (next_frame, VAX_FP_REGNUM);
return frame_id_build (fp, frame_pc_unwind (next_frame));
fp = get_frame_register_unsigned (this_frame, VAX_FP_REGNUM);
return frame_id_build (fp, get_frame_pc (this_frame));
}
@ -311,7 +311,7 @@ struct vax_frame_cache
};
struct vax_frame_cache *
vax_frame_cache (struct frame_info *next_frame, void **this_cache)
vax_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct vax_frame_cache *cache;
CORE_ADDR addr;
@ -323,16 +323,16 @@ vax_frame_cache (struct frame_info *next_frame, void **this_cache)
/* Allocate a new cache. */
cache = FRAME_OBSTACK_ZALLOC (struct vax_frame_cache);
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
/* The frame pointer is used as the base for the frame. */
cache->base = frame_unwind_register_unsigned (next_frame, VAX_FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, VAX_FP_REGNUM);
if (cache->base == 0)
return cache;
/* The register save mask and control bits determine the layout of
the stack frame. */
mask = get_frame_memory_unsigned (next_frame, cache->base + 4, 4) >> 16;
mask = get_frame_memory_unsigned (this_frame, cache->base + 4, 4) >> 16;
/* These are always saved. */
cache->saved_regs[VAX_PC_REGNUM].addr = cache->base + 16;
@ -362,7 +362,7 @@ vax_frame_cache (struct frame_info *next_frame, void **this_cache)
stack address for the arguments that were pushed onto the
stack. The return instruction will automatically pop the
arguments from the stack. */
numarg = get_frame_memory_unsigned (next_frame, addr, 1);
numarg = get_frame_memory_unsigned (this_frame, addr, 1);
addr += 4 + numarg * 4;
}
@ -373,57 +373,49 @@ vax_frame_cache (struct frame_info *next_frame, void **this_cache)
}
static void
vax_frame_this_id (struct frame_info *next_frame, void **this_cache,
vax_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct vax_frame_cache *cache = vax_frame_cache (next_frame, this_cache);
struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
/* This marks the outermost frame. */
if (cache->base == 0)
return;
(*this_id) = frame_id_build (cache->base,
frame_func_unwind (next_frame, NORMAL_FRAME));
(*this_id) = frame_id_build (cache->base, get_frame_func (this_frame));
}
static void
vax_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 *
vax_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct vax_frame_cache *cache = vax_frame_cache (next_frame, this_cache);
struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
optimizedp, lvalp, addrp, realnump, valuep);
return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
}
static const struct frame_unwind vax_frame_unwind =
{
NORMAL_FRAME,
vax_frame_this_id,
vax_frame_prev_register
vax_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_unwind *
vax_frame_sniffer (struct frame_info *next_frame)
{
return &vax_frame_unwind;
}
static CORE_ADDR
vax_frame_base_address (struct frame_info *next_frame, void **this_cache)
vax_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct vax_frame_cache *cache = vax_frame_cache (next_frame, this_cache);
struct vax_frame_cache *cache = vax_frame_cache (this_frame, this_cache);
return cache->base;
}
static CORE_ADDR
vax_frame_args_address (struct frame_info *next_frame, void **this_cache)
vax_frame_args_address (struct frame_info *this_frame, void **this_cache)
{
return frame_unwind_register_unsigned (next_frame, VAX_AP_REGNUM);
return get_frame_register_unsigned (this_frame, VAX_AP_REGNUM);
}
static const struct frame_base vax_frame_base =
@ -505,7 +497,7 @@ vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Call dummy code. */
set_gdbarch_push_dummy_call (gdbarch, vax_push_dummy_call);
set_gdbarch_unwind_dummy_id (gdbarch, vax_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, vax_dummy_id);
/* Breakpoint info */
set_gdbarch_breakpoint_from_pc (gdbarch, vax_breakpoint_from_pc);
@ -523,7 +515,7 @@ vax_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
frame_unwind_append_sniffer (gdbarch, vax_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &vax_frame_unwind);
return (gdbarch);
}

View File

@ -57,9 +57,11 @@ static const gdb_byte vaxobsd_sigreturn[] = {
};
static int
vaxobsd_sigtramp_p (struct frame_info *next_frame)
vaxobsd_sigtramp_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 & ~(vaxobsd_page_size - 1));
CORE_ADDR sigreturn_addr = start_pc + vaxobsd_sigreturn_offset;
gdb_byte *buf;
@ -70,7 +72,7 @@ vaxobsd_sigtramp_p (struct frame_info *next_frame)
return 0;
buf = alloca(sizeof vaxobsd_sigreturn);
if (!safe_frame_unwind_memory (next_frame, sigreturn_addr,
if (!safe_frame_unwind_memory (this_frame, sigreturn_addr,
buf, sizeof vaxobsd_sigreturn))
return 0;
@ -81,7 +83,7 @@ vaxobsd_sigtramp_p (struct frame_info *next_frame)
}
static struct trad_frame_cache *
vaxobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
vaxobsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct trad_frame_cache *cache;
CORE_ADDR addr, base, func;
@ -89,14 +91,14 @@ vaxobsd_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 &= ~(vaxobsd_page_size - 1);
base = frame_unwind_register_unsigned (next_frame, VAX_SP_REGNUM);
addr = get_frame_memory_unsigned (next_frame, base - 4, 4);
base = get_frame_register_unsigned (this_frame, VAX_SP_REGNUM);
addr = get_frame_memory_unsigned (this_frame, base - 4, 4);
trad_frame_set_reg_addr (cache, VAX_SP_REGNUM, addr + 8);
trad_frame_set_reg_addr (cache, VAX_FP_REGNUM, addr + 12);
@ -111,43 +113,32 @@ vaxobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache)
}
static void
vaxobsd_sigtramp_frame_this_id (struct frame_info *next_frame,
vaxobsd_sigtramp_frame_this_id (struct frame_info *this_frame,
void **this_cache, struct frame_id *this_id)
{
struct trad_frame_cache *cache =
vaxobsd_sigtramp_frame_cache (next_frame, this_cache);
vaxobsd_sigtramp_frame_cache (this_frame, this_cache);
trad_frame_get_id (cache, this_id);
}
static void
vaxobsd_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 *
vaxobsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct trad_frame_cache *cache =
vaxobsd_sigtramp_frame_cache (next_frame, this_cache);
vaxobsd_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 vaxobsd_sigtramp_frame_unwind = {
SIGTRAMP_FRAME,
vaxobsd_sigtramp_frame_this_id,
vaxobsd_sigtramp_frame_prev_register
vaxobsd_sigtramp_frame_prev_register,
NULL,
vaxobsd_sigtramp_sniffer
};
static const struct frame_unwind *
vaxobsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
{
if (vaxobsd_sigtramp_p (next_frame))
return &vaxobsd_sigtramp_frame_unwind;
return NULL;
}
/* OpenBSD a.out. */
@ -155,7 +146,7 @@ vaxobsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
static void
vaxobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
frame_unwind_append_sniffer (gdbarch, vaxobsd_sigtramp_frame_sniffer);
frame_unwind_append_unwinder (gdbarch, &vaxobsd_sigtramp_frame_unwind);
}
/* FIXME: kettenis/20050821: Since OpenBSD/vax binaries are

View File

@ -311,7 +311,7 @@ xstormy16_push_dummy_call (struct gdbarch *gdbarch,
static CORE_ADDR
xstormy16_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
struct xstormy16_frame_cache *cache,
struct frame_info *next_frame)
struct frame_info *this_frame)
{
CORE_ADDR next_addr;
ULONGEST inst, inst2;
@ -638,7 +638,7 @@ xstormy16_alloc_frame_cache (void)
}
static struct xstormy16_frame_cache *
xstormy16_frame_cache (struct frame_info *next_frame, void **this_cache)
xstormy16_frame_cache (struct frame_info *this_frame, void **this_cache)
{
struct xstormy16_frame_cache *cache;
CORE_ADDR current_pc;
@ -650,17 +650,17 @@ xstormy16_frame_cache (struct frame_info *next_frame, void **this_cache)
cache = xstormy16_alloc_frame_cache ();
*this_cache = cache;
cache->base = frame_unwind_register_unsigned (next_frame, E_FP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_FP_REGNUM);
if (cache->base == 0)
return cache;
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
current_pc = frame_pc_unwind (next_frame);
cache->pc = get_frame_func (this_frame);
current_pc = get_frame_pc (this_frame);
if (cache->pc)
xstormy16_analyze_prologue (cache->pc, current_pc, cache, next_frame);
xstormy16_analyze_prologue (cache->pc, current_pc, cache, this_frame);
if (!cache->uses_fp)
cache->base = frame_unwind_register_unsigned (next_frame, E_SP_REGNUM);
cache->base = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
cache->saved_sp = cache->base - cache->framesize;
@ -671,59 +671,29 @@ xstormy16_frame_cache (struct frame_info *next_frame, void **this_cache)
return cache;
}
static void
xstormy16_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 *
xstormy16_frame_prev_register (struct frame_info *this_frame,
void **this_cache, int regnum)
{
struct xstormy16_frame_cache *cache = xstormy16_frame_cache (next_frame,
struct xstormy16_frame_cache *cache = xstormy16_frame_cache (this_frame,
this_cache);
gdb_assert (regnum >= 0);
if (regnum == E_SP_REGNUM && cache->saved_sp)
{
*optimizedp = 0;
*lvalp = not_lval;
*addrp = 0;
*realnump = -1;
if (valuep)
{
/* Store the value. */
store_unsigned_integer (valuep, xstormy16_reg_size, cache->saved_sp);
}
return;
}
return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
if (regnum < E_NUM_REGS && cache->saved_regs[regnum] != REG_UNAVAIL)
{
*optimizedp = 0;
*lvalp = lval_memory;
*addrp = cache->saved_regs[regnum];
*realnump = -1;
if (valuep)
{
/* Read the value in from memory. */
read_memory (*addrp, valuep,
register_size (get_frame_arch (next_frame), regnum));
}
return;
}
return frame_unwind_got_memory (this_frame, regnum,
cache->saved_regs[regnum]);
*optimizedp = 0;
*lvalp = lval_register;
*addrp = 0;
*realnump = regnum;
if (valuep)
frame_unwind_register (next_frame, (*realnump), valuep);
return frame_unwind_got_register (this_frame, regnum, regnum);
}
static void
xstormy16_frame_this_id (struct frame_info *next_frame, void **this_cache,
xstormy16_frame_this_id (struct frame_info *this_frame, void **this_cache,
struct frame_id *this_id)
{
struct xstormy16_frame_cache *cache = xstormy16_frame_cache (next_frame,
struct xstormy16_frame_cache *cache = xstormy16_frame_cache (this_frame,
this_cache);
/* This marks the outermost frame. */
@ -734,9 +704,9 @@ xstormy16_frame_this_id (struct frame_info *next_frame, void **this_cache,
}
static CORE_ADDR
xstormy16_frame_base_address (struct frame_info *next_frame, void **this_cache)
xstormy16_frame_base_address (struct frame_info *this_frame, void **this_cache)
{
struct xstormy16_frame_cache *cache = xstormy16_frame_cache (next_frame,
struct xstormy16_frame_cache *cache = xstormy16_frame_cache (this_frame,
this_cache);
return cache->base;
}
@ -744,7 +714,9 @@ xstormy16_frame_base_address (struct frame_info *next_frame, void **this_cache)
static const struct frame_unwind xstormy16_frame_unwind = {
NORMAL_FRAME,
xstormy16_frame_this_id,
xstormy16_frame_prev_register
xstormy16_frame_prev_register,
NULL,
default_frame_sniffer
};
static const struct frame_base xstormy16_frame_base = {
@ -754,12 +726,6 @@ static const struct frame_base xstormy16_frame_base = {
xstormy16_frame_base_address
};
static const struct frame_unwind *
xstormy16_frame_sniffer (struct frame_info *next_frame)
{
return &xstormy16_frame_unwind;
}
static CORE_ADDR
xstormy16_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
{
@ -773,11 +739,10 @@ xstormy16_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
}
static struct frame_id
xstormy16_unwind_dummy_id (struct gdbarch *gdbarch,
struct frame_info *next_frame)
xstormy16_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
{
return frame_id_build (xstormy16_unwind_sp (gdbarch, next_frame),
frame_pc_unwind (next_frame));
CORE_ADDR sp = get_frame_register_unsigned (this_frame, E_SP_REGNUM);
return frame_id_build (sp, get_frame_pc (this_frame));
}
@ -832,7 +797,7 @@ xstormy16_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
*/
set_gdbarch_unwind_sp (gdbarch, xstormy16_unwind_sp);
set_gdbarch_unwind_pc (gdbarch, xstormy16_unwind_pc);
set_gdbarch_unwind_dummy_id (gdbarch, xstormy16_unwind_dummy_id);
set_gdbarch_dummy_id (gdbarch, xstormy16_dummy_id);
set_gdbarch_frame_align (gdbarch, xstormy16_frame_align);
frame_base_set_default (gdbarch, &xstormy16_frame_base);
@ -851,8 +816,8 @@ xstormy16_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
gdbarch_init_osabi (info, gdbarch);
frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
frame_unwind_append_sniffer (gdbarch, xstormy16_frame_sniffer);
dwarf2_append_unwinders (gdbarch);
frame_unwind_append_unwinder (gdbarch, &xstormy16_frame_unwind);
return gdbarch;
}