diff options
author | Andrew Cagney <cagney@redhat.com> | 2003-06-03 18:53:37 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2003-06-03 18:53:37 +0000 |
commit | ae1e741769ca494b6d7d6faaa91d6ef2ba5cecfd (patch) | |
tree | e702f6aceab1ea961133f587366bc9011ea67b29 /gdb | |
parent | 5a4e47bd3016472585dd5a178b76422011319b17 (diff) | |
download | gdb-ae1e741769ca494b6d7d6faaa91d6ef2ba5cecfd.zip gdb-ae1e741769ca494b6d7d6faaa91d6ef2ba5cecfd.tar.gz gdb-ae1e741769ca494b6d7d6faaa91d6ef2ba5cecfd.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/d10v-tdep.c | 25 | ||||
-rw-r--r-- | gdb/frame.c | 31 | ||||
-rw-r--r-- | gdb/frame.h | 25 |
4 files changed, 81 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ff36751..5689c72 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/d10v-tdep.c b/gdb/d10v-tdep.c index 6278161..2696c60 100644 --- a/gdb/d10v-tdep.c +++ b/gdb/d10v-tdep.c @@ -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; diff --git a/gdb/frame.c b/gdb/frame.c index 07e0e5b..dd69dde 100644 --- a/gdb/frame.c +++ b/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) { diff --git a/gdb/frame.h b/gdb/frame.h index 0abb08e..bfd9469 100644 --- a/gdb/frame.h +++ b/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 { |