aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/frame.c35
-rw-r--r--gdb/frame.h65
3 files changed, 110 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 921d5d0..881d092 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@
+2003-06-21 Andrew Cagney <cagney@redhat.com>
+
+ * frame.c (get_frame_register): New function.
+ (frame_unwind_register_signed): New function.
+ (get_frame_register_signed): New function.
+ (frame_unwind_register_unsigned): New function.
+ (get_frame_register_unsigned): New function.
+ * frame.h: Add comments on naming schema.
+ (get_frame_register, frame_unwind_register_signed): Declare.
+ (get_frame_register_signed, get_frame_register_signed): Declare.
+ (frame_unwind_register_unsigned): Declare.
+ (get_frame_register_unsigned): Declare.
+
2003-06-20 Theodore A. Roth <troth@openavr.org>
* avr-tdep.c (avr_gdbarch_init): Don't call set_gdbarch_bfd_vma_bit.
diff --git a/gdb/frame.c b/gdb/frame.c
index 55e9dc5..b873b3a 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -615,6 +615,41 @@ frame_unwind_register (struct frame_info *frame, int regnum, void *buf)
}
void
+get_frame_register (struct frame_info *frame,
+ int regnum, void *buf)
+{
+ frame_unwind_register (frame->next, regnum, buf);
+}
+
+LONGEST
+frame_unwind_register_signed (struct frame_info *frame, int regnum)
+{
+ char buf[MAX_REGISTER_SIZE];
+ frame_unwind_register (frame, regnum, buf);
+ return extract_signed_integer (buf, REGISTER_VIRTUAL_SIZE (regnum));
+}
+
+LONGEST
+get_frame_register_signed (struct frame_info *frame, int regnum)
+{
+ return frame_unwind_register_signed (frame->next, regnum);
+}
+
+ULONGEST
+frame_unwind_register_unsigned (struct frame_info *frame, int regnum)
+{
+ char buf[MAX_REGISTER_SIZE];
+ frame_unwind_register (frame, regnum, buf);
+ return extract_unsigned_integer (buf, REGISTER_VIRTUAL_SIZE (regnum));
+}
+
+ULONGEST
+get_frame_register_unsigned (struct frame_info *frame, int regnum)
+{
+ return frame_unwind_register_unsigned (frame->next, regnum);
+}
+
+void
frame_unwind_signed_register (struct frame_info *frame, int regnum,
LONGEST *val)
{
diff --git a/gdb/frame.h b/gdb/frame.h
index 14da014..be1b4f1 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -23,6 +23,47 @@
#if !defined (FRAME_H)
#define FRAME_H 1
+/* The following is the intended naming schema for frame functions.
+ It isn't 100% consistent, but it is aproaching that. Frame naming
+ schema:
+
+ Prefixes:
+
+ get_frame_WHAT...(): Get WHAT from the THIS frame (functionaly
+ equivalent to THIS->next->unwind->what)
+
+ frame_unwind_WHAT...(): Unwind THIS frame's WHAT from the NEXT
+ frame.
+
+ put_frame_WHAT...(): Put a value into this frame (unsafe, need to
+ invalidate the frame / regcache afterwards) (better name more
+ strongly hinting at its unsafeness)
+
+ safe_....(): Safer version of various functions, doesn't throw an
+ error (leave this for later?). Returns non-zero if the fetch
+ succeeds. Return a freshly allocated error message?
+
+ Suffixes:
+
+ void /frame/_WHAT(): Read WHAT's value into the buffer parameter.
+
+ ULONGEST /frame/_WHAT_unsigned(): Return an unsigned value (the
+ alternative is *frame_unsigned_WHAT).
+
+ LONGEST /frame/_WHAT_signed(): Return WHAT signed value.
+
+ What:
+
+ /frame/_memory* (frame, coreaddr, len [, buf]): Extract/return
+ *memory.
+
+ /frame/_register* (frame, regnum [, buf]): extract/return register.
+
+ CORE_ADDR /frame/_{pc,sp,...} (frame): Resume address, innner most
+ stack *address, ...
+
+ */
+
struct symtab_and_line;
struct frame_unwind;
struct frame_base;
@@ -303,16 +344,31 @@ extern void frame_register_unwind (struct frame_info *frame, int regnum,
CORE_ADDR *addrp, int *realnump,
void *valuep);
-/* More convenient interface to frame_register_unwind(). */
-/* NOTE: cagney/2002-09-13: Return void as one day these functions may
- be changed to return an indication that the read succeeded. */
+/* Fetch a register from this, or unwind a register from the next
+ frame. Note that the get_frame methods are wrappers to
+ frame->next->unwind. They all [potentially] throw an error if the
+ fetch fails. */
extern void frame_unwind_register (struct frame_info *frame,
int regnum, void *buf);
+extern void get_frame_register (struct frame_info *frame,
+ int regnum, void *buf);
+
+extern LONGEST frame_unwind_register_signed (struct frame_info *frame,
+ int regnum);
+extern LONGEST get_frame_register_signed (struct frame_info *frame,
+ int regnum);
+extern ULONGEST frame_unwind_register_unsigned (struct frame_info *frame,
+ int regnum);
+extern ULONGEST get_frame_register_unsigned (struct frame_info *frame,
+ int regnum);
+
+/* Use frame_unwind_register_signed. */
extern void frame_unwind_signed_register (struct frame_info *frame,
int regnum, LONGEST *val);
+/* Use frame_unwind_register_signed. */
extern void frame_unwind_unsigned_register (struct frame_info *frame,
int regnum, ULONGEST *val);
@@ -330,12 +386,15 @@ extern void frame_register (struct frame_info *frame, int regnum,
/* NOTE: cagney/2002-09-13: Return void as one day these functions may
be changed to return an indication that the read succeeded. */
+/* Use get_frame_register. */
extern void frame_read_register (struct frame_info *frame, int regnum,
void *buf);
+/* Use get_frame_register_signed. */
extern void frame_read_signed_register (struct frame_info *frame,
int regnum, LONGEST *val);
+/* Use get_frame_register_unsigned. */
extern void frame_read_unsigned_register (struct frame_info *frame,
int regnum, ULONGEST *val);