This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] alpha frame unwind tweakage


One, missing loop increments tend to create infinite loops.  :-(

Two, I was a bit deluded with the hackery surrounding calling
back into the heuristic unwinder for mdebug frames that were
still in the prologue.  Mainly, if find_proc_desc can find the
PDR for a function, so can get_pc_function_start.  And the 
later works with far more than just mdebug.  This seems to 
work slightly better when dealing with executables that don't
contiain debug info, but do have their symbol table.

Ok?


r~



	* alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues.
	(alpha_mdebug_frame_unwind_cache): Don't call the heuristic unwinder.
	(alpha_mdebug_frame_this_id): Likewise.
	(alpha_mdebug_frame_prev_register): Likewise.
	(alpha_mdebug_frame_base_address): Likewise.
	(alpha_mdebug_frame_locals_address): Likewise.
	(alpha_mdebug_frame_args_address): Likewise.
	(struct alpha_mdebug_unwind_cache): Remove in_prologue_cache.
	* alpha-tdep.c (alpha_heuristic_proc_start): Use get_pc_function_start.
	(alpha_heuristic_frame_unwind_cache): Make static; add missing
	loop increment.
	(alpha_heuristic_frame_this_id): Make static.
	(alpha_heuristic_frame_prev_register): Likewise.
	(alpha_heuristic_frame_base_address): Likewise.
	* alpha-tdep.h: Update.

Index: alpha-mdebug-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/alpha-mdebug-tdep.c,v
retrieving revision 1.1
diff -c -p -d -u -r1.1 alpha-mdebug-tdep.c
--- alpha-mdebug-tdep.c	29 May 2003 23:02:53 -0000	1.1
+++ alpha-mdebug-tdep.c	30 May 2003 05:53:05 -0000
@@ -174,7 +174,6 @@ struct alpha_mdebug_unwind_cache
   alpha_extra_func_info_t proc_desc;
   CORE_ADDR vfp;
   CORE_ADDR *saved_regs;
-  void *in_prologue_cache;
 };
 
 /* Extract all of the information about the frame from PROC_DESC
@@ -205,21 +204,6 @@ alpha_mdebug_frame_unwind_cache (struct 
   info->proc_desc = proc_desc;
   gdb_assert (proc_desc != NULL);
 
-  /* If we're in the prologue, the PDR for this frame is not yet valid.  */
-  /* ??? We could have said "no" in alpha_mdebug_frame_p, and we'd
-     walk down the list of unwinders and try the heuristic unwinder
-     and things would have been fine. However, since we have the PDR,
-     we know how to skip the search for the start of the procedure,
-     and all the uncertainty involved there.  So instead, arrange for
-     us to defer to the heuristic unwinder directly.  */
-  if (alpha_mdebug_in_prologue (pc, proc_desc))
-    {
-      alpha_heuristic_frame_unwind_cache (next_frame,
-      					  &info->in_prologue_cache,
-					  PROC_LOW_ADDR (proc_desc));
-      return info;
-    }
-
   info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS);
 
   /* The VFP of the frame is at FRAME_REG+FRAME_OFFSET.  */
@@ -275,12 +259,7 @@ alpha_mdebug_frame_this_id (struct frame
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  /* If we're in the prologue, defer to the heuristic unwinder.  */
-  if (info->in_prologue_cache)
-    alpha_heuristic_frame_this_id (next_frame, &info->in_prologue_cache,
-    				   this_id);
-  else
-    *this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
+  *this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
 }
 
 /* Retrieve the value of REGNUM in FRAME.  Don't give up!  */
@@ -295,16 +274,6 @@ alpha_mdebug_frame_prev_register (struct
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  /* If we're in the prologue, defer to the heuristic unwinder.  */
-  if (info->in_prologue_cache)
-    {
-      alpha_heuristic_frame_prev_register (next_frame,
-      					   &info->in_prologue_cache,
-					   regnum, optimizedp, lvalp,
-					   addrp, realnump, bufferp);
-      return;
-    }
-
   /* The PC of the previous frame is stored in the link register of
      the current frame.  Frob regnum so that we pull the value from
      the correct place.  */
@@ -359,6 +328,11 @@ alpha_mdebug_frame_p (CORE_ADDR pc)
   if (proc_desc == NULL)
     return NULL;
 
+  /* If we're in the prologue, the PDR for this frame is not yet valid.
+     Say no here and we'll fall back on the heuristic unwinder.  */
+  if (alpha_mdebug_in_prologue (pc, proc_desc))
+    return NULL;
+
   return &alpha_mdebug_frame_unwind;
 }
 
@@ -369,11 +343,7 @@ alpha_mdebug_frame_base_address (struct 
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  if (info->in_prologue_cache)
-    return alpha_heuristic_frame_base_address (next_frame,
-    					       &info->in_prologue_cache);
-  else
-    return info->vfp;
+  return info->vfp;
 }
 
 static CORE_ADDR
@@ -382,15 +352,8 @@ alpha_mdebug_frame_locals_address (struc
 {
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
-  CORE_ADDR vfp;
 
-  if (info->in_prologue_cache)
-    vfp = alpha_heuristic_frame_base_address (next_frame,
-    					      &info->in_prologue_cache);
-  else
-    vfp = info->vfp;
-
-  return vfp - PROC_LOCALOFF (info->proc_desc);
+  return info->vfp - PROC_LOCALOFF (info->proc_desc);
 }
 
 static CORE_ADDR
@@ -399,15 +362,8 @@ alpha_mdebug_frame_args_address (struct 
 {
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
-  CORE_ADDR vfp;
 
-  if (info->in_prologue_cache)
-    vfp = alpha_heuristic_frame_base_address (next_frame,
-    					      &info->in_prologue_cache);
-  else
-    vfp = info->vfp;
-
-  return vfp - ALPHA_NUM_ARG_REGS * 8;
+  return info->vfp - ALPHA_NUM_ARG_REGS * 8;
 }
 
 static const struct frame_base alpha_mdebug_frame_base = {
Index: alpha-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/alpha-tdep.c,v
retrieving revision 1.86
diff -c -p -d -u -r1.86 alpha-tdep.c
--- alpha-tdep.c	29 May 2003 23:02:53 -0000	1.86
+++ alpha-tdep.c	30 May 2003 05:53:06 -0000
@@ -666,10 +666,18 @@ alpha_heuristic_proc_start (CORE_ADDR pc
   CORE_ADDR last_non_nop = pc;
   CORE_ADDR fence = pc - heuristic_fence_post;
   CORE_ADDR orig_pc = pc;
+  CORE_ADDR func;
 
   if (pc == 0)
     return 0;
 
+  /* First see if we can find the start of the function from minimal
+     symbol information.  This can succeed with a binary that doesn't
+     have debug info, but hasn't been stripped.  */
+  func = get_pc_function_start (pc);
+  if (func)
+    return func;
+
   if (heuristic_fence_post == UINT_MAX
       || fence < tdep->vm_min_address)
     fence = tdep->vm_min_address;
@@ -725,7 +733,7 @@ Otherwise, you told GDB there was a func
   return 0;
 }
 
-struct alpha_heuristic_unwind_cache *
+static struct alpha_heuristic_unwind_cache *
 alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
 				    void **this_prologue_cache,
 				    CORE_ADDR start_pc)
@@ -856,6 +864,8 @@ alpha_heuristic_frame_unwind_cache (stru
 		  return_reg = (word >> 16) & 0x1f;
 		  break;
 		}
+
+	      cur_pc += 4;
 	    }
 	}
     }
@@ -880,7 +890,7 @@ alpha_heuristic_frame_unwind_cache (stru
 /* Given a GDB frame, determine the address of the calling function's
    frame.  This will be used to create a new GDB frame struct.  */
 
-void
+static void
 alpha_heuristic_frame_this_id (struct frame_info *next_frame,
 				 void **this_prologue_cache,
 				 struct frame_id *this_id)
@@ -893,7 +903,7 @@ alpha_heuristic_frame_this_id (struct fr
 
 /* Retrieve the value of REGNUM in FRAME.  Don't give up!  */
 
-void
+static void
 alpha_heuristic_frame_prev_register (struct frame_info *next_frame,
 				     void **this_prologue_cache,
 				     int regnum, int *optimizedp,
@@ -952,7 +962,7 @@ alpha_heuristic_frame_p (CORE_ADDR pc)
   return &alpha_heuristic_frame_unwind;
 }
 
-CORE_ADDR
+static CORE_ADDR
 alpha_heuristic_frame_base_address (struct frame_info *next_frame,
 				    void **this_prologue_cache)
 {
Index: alpha-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/alpha-tdep.h,v
retrieving revision 1.12
diff -c -p -d -u -r1.12 alpha-tdep.h
--- alpha-tdep.h	29 May 2003 23:02:53 -0000	1.12
+++ alpha-tdep.h	30 May 2003 05:53:08 -0000
@@ -99,19 +99,7 @@ struct gdbarch_tdep
 
 extern unsigned int alpha_read_insn (CORE_ADDR pc);
 extern void alpha_software_single_step (enum target_signal, int);
-
-/* Let other files poke at the heuristic unwinder.  */
 extern CORE_ADDR alpha_after_prologue (CORE_ADDR pc);
-extern struct alpha_heuristic_unwind_cache *
-  alpha_heuristic_frame_unwind_cache (struct frame_info *, void **, CORE_ADDR);
-extern void alpha_heuristic_frame_this_id (struct frame_info *, void **,
-					   struct frame_id *);
-extern void alpha_heuristic_frame_prev_register (struct frame_info *,
-						 void **, int, int *,
-						 enum lval_type *,
-						 CORE_ADDR *, int *, void *);
-extern CORE_ADDR alpha_heuristic_frame_base_address (struct frame_info *,
-						     void **);
 
 extern void alpha_mdebug_init_abi (struct gdbarch_info, struct gdbarch *);
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]