2004-08-01 Andrew Cagney <cagney@gnu.org>
authorAndrew Cagney <cagney@redhat.com>
Mon, 2 Aug 2004 03:36:24 +0000 (03:36 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 2 Aug 2004 03:36:24 +0000 (03:36 +0000)
* frame.h (frame_save_as_regcache): Declare.
* frame.c (frame_save_as_regcache): New function.
(do_frame_read_register): Replace do_frame_unwind_register.
(frame_pop): Use frame_save_as_regcache.
* dummy-frame.c (generic_push_dummy_frame): Use
frame_save_as_regcache.

gdb/ChangeLog
gdb/dummy-frame.c
gdb/frame.c
gdb/frame.h

index 8728ff45beca7d0c20e24fea9482f3062c17646a..6d6ce0e4b8399e94a1f9218eb435bd3e9c43bd66 100644 (file)
@@ -1,3 +1,12 @@
+2004-08-01  Andrew Cagney  <cagney@gnu.org>
+
+       * frame.h (frame_save_as_regcache): Declare.
+       * frame.c (frame_save_as_regcache): New function.
+       (do_frame_read_register): Replace do_frame_unwind_register.
+       (frame_pop): Use frame_save_as_regcache.
+       * dummy-frame.c (generic_push_dummy_frame): Use
+       frame_save_as_regcache.
+
 2004-08-01  Joel Brobecker  <brobecker@gnat.com>
 
        * dwarf2read.c (dwarf_decode_lines): Do not consider the current
index 635c835dc24b2840f3e33d2221befd0ab56d243b..d901214c37c22d3ec1fd78fdb8adf49542a27cf2 100644 (file)
@@ -161,12 +161,11 @@ generic_push_dummy_frame (void)
       dummy_frame = dummy_frame->next;
 
   dummy_frame = xmalloc (sizeof (struct dummy_frame));
-  dummy_frame->regcache = regcache_xmalloc (current_gdbarch);
+  dummy_frame->regcache = frame_save_as_regcache (get_current_frame ());
 
   dummy_frame->pc = read_pc ();
   dummy_frame->top = 0;
   dummy_frame->id = get_frame_id (get_current_frame ());
-  regcache_cpy (dummy_frame->regcache, current_regcache);
   dummy_frame->next = dummy_frame_stack;
   dummy_frame_stack = dummy_frame;
 }
index 6df8b87b4e903b13765b0feeaf223d512a9b5fa7..a723b32111e8c5fa1578ba8c5aefbdd20be2200d 100644 (file)
@@ -456,12 +456,22 @@ get_frame_func (struct frame_info *fi)
 }
 
 static int
-do_frame_unwind_register (void *src, int regnum, void *buf)
+do_frame_register_read (void *src, int regnum, void *buf)
 {
-  frame_unwind_register (src, regnum, buf);
+  frame_register_read (src, regnum, buf);
   return 1;
 }
 
+struct regcache *
+frame_save_as_regcache (struct frame_info *this_frame)
+{
+  struct regcache *regcache = regcache_xmalloc (current_gdbarch);
+  struct cleanup *cleanups = make_cleanup_regcache_xfree (regcache);
+  regcache_save (regcache, do_frame_register_read, this_frame);
+  discard_cleanups (cleanups);
+  return regcache;
+}
+
 void
 frame_pop (struct frame_info *this_frame)
 {
@@ -469,9 +479,9 @@ frame_pop (struct frame_info *this_frame)
      Save them in a scratch buffer so that there isn't a race between
      trying to extract the old values from the current_regcache while
      at the same time writing new values into that same cache.  */
-  struct regcache *scratch = regcache_xmalloc (current_gdbarch);
+  struct regcache *scratch
+    = frame_save_as_regcache (get_prev_frame_1 (this_frame));
   struct cleanup *cleanups = make_cleanup_regcache_xfree (scratch);
-  regcache_save (scratch, do_frame_unwind_register, this_frame);
 
   /* FIXME: cagney/2003-03-16: It should be possible to tell the
      target's register cache that it is about to be hit with a burst
index 347b27a99eed46c3213315eb108568a699005e92..75b0c9e00f3b0f68bbd666b5a9e329f217a1415e 100644 (file)
@@ -518,6 +518,9 @@ extern void *frame_obstack_zalloc (unsigned long size);
 #define FRAME_OBSTACK_ZALLOC(TYPE) ((TYPE *) frame_obstack_zalloc (sizeof (TYPE)))
 #define FRAME_OBSTACK_CALLOC(NUMBER,TYPE) ((TYPE *) frame_obstack_zalloc ((NUMBER) * sizeof (TYPE)))
 
+/* Create a regcache, and copy the frame's registers into it.  */
+struct regcache *frame_save_as_regcache (struct frame_info *this_frame);
+
 extern void generic_save_dummy_frame_tos (CORE_ADDR sp);
 
 extern struct block *get_frame_block (struct frame_info *,