2004-07-31 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / trad-frame.c
index f397f5d82417e92eba9bb2a797bda60bfb47e964..58f6c1beb763e36fc94d3e02d125b0d1856e4863 100644 (file)
@@ -1,6 +1,6 @@
 /* Traditional frame unwind support, for GDB the GNU Debugger.
 
-   Copyright 2003 Free Software Foundation, Inc.
+   Copyright 2003, 2004 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "trad-frame.h"
 #include "regcache.h"
 
+struct trad_frame_cache
+{
+  struct frame_info *next_frame;
+  CORE_ADDR this_base;
+  struct trad_frame_saved_reg *prev_regs;
+  struct frame_id this_id;
+};
+
+struct trad_frame_cache *
+trad_frame_cache_zalloc (struct frame_info *next_frame)
+{
+  struct trad_frame_cache *this_trad_cache;
+
+  this_trad_cache = FRAME_OBSTACK_ZALLOC (struct trad_frame_cache);
+  this_trad_cache->prev_regs = trad_frame_alloc_saved_regs (next_frame);
+  this_trad_cache->next_frame = next_frame;
+  return this_trad_cache;
+}
+
 /* A traditional frame is unwound by analysing the function prologue
    and using the information gathered to track registers.  For
    non-optimized frames, the technique is reliable (just need to check
@@ -78,6 +97,13 @@ trad_frame_set_value (struct trad_frame_saved_reg this_saved_regs[],
   this_saved_regs[regnum].addr = val;
 }
 
+void
+trad_frame_set_reg_addr (struct trad_frame_cache *this_trad_cache,
+                        int regnum, CORE_ADDR addr)
+{
+  this_trad_cache->prev_regs[regnum].addr = addr;
+}
+
 void
 trad_frame_set_unknown (struct trad_frame_saved_reg this_saved_regs[],
                        int regnum)
@@ -88,11 +114,11 @@ trad_frame_set_unknown (struct trad_frame_saved_reg this_saved_regs[],
 }
 
 void
-trad_frame_prev_register (struct frame_info *next_frame,
-                         struct trad_frame_saved_reg this_saved_regs[],
-                         int regnum, int *optimizedp,
-                         enum lval_type *lvalp, CORE_ADDR *addrp,
-                         int *realregp, void *bufferp)
+trad_frame_get_prev_register (struct frame_info *next_frame,
+                             struct trad_frame_saved_reg this_saved_regs[],
+                             int regnum, int *optimizedp,
+                             enum lval_type *lvalp, CORE_ADDR *addrp,
+                             int *realregp, void *bufferp)
 {
   struct gdbarch *gdbarch = get_frame_arch (next_frame);
   if (trad_frame_addr_p (this_saved_regs, regnum))
@@ -132,3 +158,29 @@ trad_frame_prev_register (struct frame_info *next_frame,
             gdbarch_register_name (gdbarch, regnum));
     }
 }
+
+void
+trad_frame_get_register (struct trad_frame_cache *this_trad_cache,
+                        struct frame_info *next_frame,
+                        int regnum, int *optimizedp,
+                        enum lval_type *lvalp, CORE_ADDR *addrp,
+                        int *realregp, void *bufferp)
+{
+  trad_frame_get_prev_register (next_frame, this_trad_cache->prev_regs,
+                               regnum, optimizedp, lvalp, addrp, realregp,
+                               bufferp);
+}
+
+void
+trad_frame_set_id (struct trad_frame_cache *this_trad_cache,
+                  struct frame_id this_id)
+{
+  this_trad_cache->this_id = this_id;
+}
+
+void
+trad_frame_get_id (struct trad_frame_cache *this_trad_cache,
+                  struct frame_id *this_id)
+{
+  (*this_id) = this_trad_cache->this_id;
+}
This page took 0.025217 seconds and 4 git commands to generate.