2003-01-16 Andrew Cagney <ac131313@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Thu, 16 Jan 2003 16:54:57 +0000 (16:54 +0000)
committerAndrew Cagney <cagney@redhat.com>
Thu, 16 Jan 2003 16:54:57 +0000 (16:54 +0000)
* frame.h (frame_id_unwind_ftype): Change type so that the frame's
ID back using a parameter.
* frame.c (frame_id_unwind): Update call.
(frame_saved_regs_id_unwind): Update.
* dummy-frame.c (dummy_frame_id_unwind): Update function.
* dummy-frame.h (struct frame_id): Add opaque declaration.
(dummy_frame_id_unwind): Update declaration.

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

index b16899b3c2300038faf8c0c3506d661f6a05791b..769ca4cab688dceea79a8d65be5e9fea0d898c53 100644 (file)
@@ -1,3 +1,13 @@
+2003-01-16  Andrew Cagney  <ac131313@redhat.com>
+
+       * frame.h (frame_id_unwind_ftype): Change type so that the frame's
+       ID back using a parameter.
+       * frame.c (frame_id_unwind): Update call.
+       (frame_saved_regs_id_unwind): Update.
+       * dummy-frame.c (dummy_frame_id_unwind): Update function.
+       * dummy-frame.h (struct frame_id): Add opaque declaration.
+       (dummy_frame_id_unwind): Update declaration.
+
 2003-01-15  Andrew Cagney  <ac131313@redhat.com>
 
        * sparc-tdep.c: Delete reference to PRINT_REGISTER_HOOK.
index fab10c08e021f04f004350a0e0004fafd6043cea..99d388df92a911b335908d9dac471907ffb38031 100644 (file)
@@ -345,16 +345,17 @@ dummy_frame_pc_unwind (struct frame_info *frame,
 }
 
 
-struct frame_id
-dummy_frame_id_unwind (struct frame_info *frame,
-                      void **cache)
+void
+dummy_frame_id_unwind (struct frame_info *frame, void **cache,
+                      struct frame_id *id)
 {
   struct dummy_frame *dummy = cached_find_dummy_frame (frame, cache);
   /* Oops!  In a dummy-frame but can't find the stack dummy.  Pretend
      that the frame doesn't unwind.  Should this function instead
      return a has-no-caller indication?  */
   if (dummy == NULL)
-    return null_frame_id;
-  return dummy->id;
+    (*id) = null_frame_id;
+  else
+    (*id) = dummy->id;
 }
 
index cfa2709142e14125878ddfe88748f252a9ff8613..746e663ee0f2f2e42d776edf9fea4e4c05742f31 100644 (file)
@@ -24,6 +24,7 @@
 
 struct frame_info;
 struct regcache;
+struct frame_id;
 
 /* GENERIC DUMMY FRAMES
   
@@ -63,8 +64,9 @@ extern CORE_ADDR dummy_frame_pc_unwind (struct frame_info *frame,
 /* Assuming that FRAME is a dummy, return the ID of the calling frame
    (the frame that the dummy has the saved state of).  */
 
-extern struct frame_id dummy_frame_id_unwind (struct frame_info *frame,
-                                             void **unwind_cache);
+extern void dummy_frame_id_unwind (struct frame_info *frame,
+                                  void **unwind_cache,
+                                  struct frame_id *id);
 
 /* Does the PC fall in a dummy frame?
 
index 503cfa7b359a43d75ddfc0836ddc276524a592ba..78811e4b9590b94f1deaaccf7eed8cbd161dad80 100644 (file)
@@ -138,8 +138,7 @@ frame_id_unwind (struct frame_info *frame)
 {
   if (!frame->id_unwind_cache_p)
     {
-      frame->id_unwind_cache =
-       frame->id_unwind (frame, &frame->unwind_cache);
+      frame->id_unwind (frame, &frame->unwind_cache, &frame->id_unwind_cache);
       frame->id_unwind_cache_p = 1;
     }
   return frame->id_unwind_cache;
@@ -655,11 +654,16 @@ frame_saved_regs_pc_unwind (struct frame_info *frame, void **cache)
   return FRAME_SAVED_PC (frame);
 }
        
-static struct frame_id
-frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache)
+static void
+frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache,
+                           struct frame_id *id)
 {
   int fromleaf;
-  struct frame_id id;
+  CORE_ADDR base;
+  CORE_ADDR pc;
+
+  /* Start out by assuming it's NULL.  */
+  (*id) = null_frame_id;
 
   if (next_frame->next == NULL)
     /* FIXME: 2002-11-09: Frameless functions can occure anywhere in
@@ -677,7 +681,7 @@ frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache)
     /* FIXME: 2002-11-09: There isn't any reason to special case this
        edge condition.  Instead the per-architecture code should hande
        it locally.  */
-    id.base = get_frame_base (next_frame);
+    base = get_frame_base (next_frame);
   else
     {
       /* Two macros defined in tm.h specify the machine-dependent
@@ -695,18 +699,19 @@ frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache)
          this to after the ffi test; I'd rather have backtraces from
          start go curfluy than have an abort called from main not show
          main.  */
-      id.base = FRAME_CHAIN (next_frame);
+      base = FRAME_CHAIN (next_frame);
 
-      if (!frame_chain_valid (id.base, next_frame))
-       return null_frame_id;
+      if (!frame_chain_valid (base, next_frame))
+       return;
     }
-  if (id.base == 0)
-    return null_frame_id;
+  if (base == 0)
+    return;
 
   /* FIXME: cagney/2002-06-08: This should probably return the frame's
      function and not the PC (a.k.a. resume address).  */
-  id.pc = frame_pc_unwind (next_frame);
-  return id;
+  pc = frame_pc_unwind (next_frame);
+  id->pc = pc;
+  id->base = base;
 }
        
 /* Function: get_saved_register
index 04dee94e680ceeef8b771a09d546c08362ba8b98..09df2b8109bcef784be112bba9fc544c3b9419f3 100644 (file)
@@ -335,8 +335,9 @@ typedef CORE_ADDR (frame_pc_unwind_ftype) (struct frame_info *frame,
 /* Same as for registers above, but return the ID of the frame that
    called this one.  */
 
-typedef struct frame_id (frame_id_unwind_ftype) (struct frame_info *frame,
-                                                void **unwind_cache);
+typedef void (frame_id_unwind_ftype) (struct frame_info *frame,
+                                     void **unwind_cache,
+                                     struct frame_id *id);
 
 /* Describe the saved registers of a frame.  */