2003-06-03 Andrew Cagney <cagney@redhat.com>
* frame.c (get_frame_memory_signed): New function. (get_frame_memory, get_frame_memory_unsigned): New function. (get_frame_arch): New function. * frame.h (get_frame_signed_memory, get_frame_arch): Declare. (get_frame_memory, get_frame_unsigned_memory): Declare. * d10v-tdep.c (d10v_frame_unwind_cache): Use get_frame_memory_unsigned and get_frame_arch. (d10v_frame_unwind_cache, saved_regs_unwinder): Ditto.
This commit is contained in:
parent
5a4e47bd30
commit
ae1e741769
4 changed files with 81 additions and 11 deletions
|
@ -1,3 +1,14 @@
|
|||
2003-06-03 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* frame.c (get_frame_memory_signed): New function.
|
||||
(get_frame_memory, get_frame_memory_unsigned): New function.
|
||||
(get_frame_arch): New function.
|
||||
* frame.h (get_frame_signed_memory, get_frame_arch): Declare.
|
||||
(get_frame_memory, get_frame_unsigned_memory): Declare.
|
||||
* d10v-tdep.c (d10v_frame_unwind_cache): Use
|
||||
get_frame_memory_unsigned and get_frame_arch.
|
||||
(d10v_frame_unwind_cache, saved_regs_unwinder): Ditto.
|
||||
|
||||
2003-06-03 Raoul Gough <RaoulGough@yahoo.co.uk>
|
||||
|
||||
* MAINTAINERS (write after approval): Add myself.
|
||||
|
|
|
@ -665,6 +665,7 @@ struct d10v_unwind_cache *
|
|||
d10v_frame_unwind_cache (struct frame_info *next_frame,
|
||||
void **this_prologue_cache)
|
||||
{
|
||||
struct gdbarch *gdbarch = get_frame_arch (next_frame);
|
||||
CORE_ADDR pc;
|
||||
ULONGEST prev_sp;
|
||||
ULONGEST this_base;
|
||||
|
@ -689,7 +690,7 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
|
|||
pc > 0 && pc < frame_pc_unwind (next_frame);
|
||||
pc += 4)
|
||||
{
|
||||
op = (unsigned long) read_memory_integer (pc, 4);
|
||||
op = get_frame_memory_unsigned (next_frame, pc, 4);
|
||||
if ((op & 0xC0000000) == 0xC0000000)
|
||||
{
|
||||
/* long instruction */
|
||||
|
@ -753,9 +754,10 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
|
|||
{
|
||||
/* The SP was saved (which is very unusual), the frame base is
|
||||
just the PREV's frame's TOP-OF-STACK. */
|
||||
this_base = read_memory_unsigned_integer (info->saved_regs[D10V_SP_REGNUM],
|
||||
register_size (current_gdbarch,
|
||||
D10V_SP_REGNUM));
|
||||
this_base
|
||||
= get_frame_memory_unsigned (next_frame,
|
||||
info->saved_regs[D10V_SP_REGNUM],
|
||||
register_size (gdbarch, D10V_SP_REGNUM));
|
||||
prev_sp = this_base;
|
||||
}
|
||||
else
|
||||
|
@ -779,9 +781,9 @@ d10v_frame_unwind_cache (struct frame_info *next_frame,
|
|||
|
||||
if (info->saved_regs[LR_REGNUM])
|
||||
{
|
||||
CORE_ADDR return_pc
|
||||
= read_memory_unsigned_integer (info->saved_regs[LR_REGNUM],
|
||||
register_size (current_gdbarch, LR_REGNUM));
|
||||
CORE_ADDR return_pc
|
||||
= get_frame_memory_unsigned (next_frame, info->saved_regs[LR_REGNUM],
|
||||
register_size (gdbarch, LR_REGNUM));
|
||||
info->return_pc = d10v_make_iaddr (return_pc);
|
||||
}
|
||||
else
|
||||
|
@ -873,7 +875,7 @@ d10v_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
|
|||
int i;
|
||||
fprintf_filtered (file, " ");
|
||||
frame_read_register (frame, a, num);
|
||||
for (i = 0; i < register_size (current_gdbarch, a); i++)
|
||||
for (i = 0; i < register_size (gdbarch, a); i++)
|
||||
{
|
||||
fprintf_filtered (file, "%02x", (num[i] & 0xff));
|
||||
}
|
||||
|
@ -1450,6 +1452,7 @@ saved_regs_unwinder (struct frame_info *next_frame,
|
|||
enum lval_type *lvalp, CORE_ADDR *addrp,
|
||||
int *realnump, void *bufferp)
|
||||
{
|
||||
struct gdbarch *gdbarch = get_frame_arch (next_frame);
|
||||
if (this_saved_regs[regnum] != 0)
|
||||
{
|
||||
if (regnum == D10V_SP_REGNUM)
|
||||
|
@ -1461,7 +1464,7 @@ saved_regs_unwinder (struct frame_info *next_frame,
|
|||
*realnump = -1;
|
||||
if (bufferp != NULL)
|
||||
store_unsigned_integer (bufferp,
|
||||
register_size (current_gdbarch, regnum),
|
||||
register_size (gdbarch, regnum),
|
||||
this_saved_regs[regnum]);
|
||||
}
|
||||
else
|
||||
|
@ -1475,8 +1478,8 @@ saved_regs_unwinder (struct frame_info *next_frame,
|
|||
if (bufferp != NULL)
|
||||
{
|
||||
/* Read the value in from memory. */
|
||||
read_memory (this_saved_regs[regnum], bufferp,
|
||||
register_size (current_gdbarch, regnum));
|
||||
get_frame_memory (next_frame, this_saved_regs[regnum], bufferp,
|
||||
register_size (gdbarch, regnum));
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
|
31
gdb/frame.c
31
gdb/frame.c
|
@ -2219,6 +2219,37 @@ deprecated_frame_xmalloc_with_cleanup (long sizeof_saved_regs,
|
|||
return frame;
|
||||
}
|
||||
|
||||
/* Memory access methods. */
|
||||
|
||||
void
|
||||
get_frame_memory (struct frame_info *this_frame, CORE_ADDR addr, void *buf,
|
||||
int len)
|
||||
{
|
||||
read_memory (addr, buf, len);
|
||||
}
|
||||
|
||||
LONGEST
|
||||
get_frame_memory_signed (struct frame_info *this_frame, CORE_ADDR addr,
|
||||
int len)
|
||||
{
|
||||
return read_memory_integer (addr, len);
|
||||
}
|
||||
|
||||
ULONGEST
|
||||
get_frame_memory_unsigned (struct frame_info *this_frame, CORE_ADDR addr,
|
||||
int len)
|
||||
{
|
||||
return read_memory_unsigned_integer (addr, len);
|
||||
}
|
||||
|
||||
/* Architecture method. */
|
||||
|
||||
struct gdbarch *
|
||||
get_frame_arch (struct frame_info *this_frame)
|
||||
{
|
||||
return current_gdbarch;
|
||||
}
|
||||
|
||||
int
|
||||
legacy_frame_p (struct gdbarch *current_gdbarch)
|
||||
{
|
||||
|
|
25
gdb/frame.h
25
gdb/frame.h
|
@ -343,6 +343,31 @@ extern CORE_ADDR frame_pc_unwind (struct frame_info *frame);
|
|||
of the caller. */
|
||||
extern void frame_pop (struct frame_info *frame);
|
||||
|
||||
/* Return memory from the specified frame. A frame knows its thread /
|
||||
LWP and hence can find its way down to a target. The assumption
|
||||
here is that the current and previous frame share a common address
|
||||
space.
|
||||
|
||||
If the memory read fails, these methods throw an error.
|
||||
|
||||
NOTE: cagney/2003-06-03: Should there be unwind versions of these
|
||||
methods? That isn't clear. Can code, for instance, assume that
|
||||
this and the previous frame's memory or architecture are identical?
|
||||
If architecture / memory changes are always separated by special
|
||||
adaptor frames this should be ok. */
|
||||
|
||||
extern void get_frame_memory (struct frame_info *this_frame, CORE_ADDR addr,
|
||||
void *buf, int len);
|
||||
extern LONGEST get_frame_memory_signed (struct frame_info *this_frame,
|
||||
CORE_ADDR memaddr, int len);
|
||||
extern ULONGEST get_frame_memory_unsigned (struct frame_info *this_frame,
|
||||
CORE_ADDR memaddr, int len);
|
||||
|
||||
/* Return this frame's architecture. */
|
||||
|
||||
extern struct gdbarch *get_frame_arch (struct frame_info *this_frame);
|
||||
|
||||
|
||||
/* Values for the source flag to be used in print_frame_info_base(). */
|
||||
enum print_what
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue