]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues. kettenis_i386newframe-20030419-branch
authorRichard Henderson <rth@redhat.com>
Sat, 31 May 2003 00:31:10 +0000 (00:31 +0000)
committerRichard Henderson <rth@redhat.com>
Sat, 31 May 2003 00:31:10 +0000 (00:31 +0000)
        (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.

gdb/ChangeLog
gdb/alpha-mdebug-tdep.c
gdb/alpha-tdep.c
gdb/alpha-tdep.h

index 9df7396a1bd1ca0377f56b9039210a15f949f25d..e699aaba363c47fe6a0db4d86ec57c2d137d93e5 100644 (file)
@@ -1,3 +1,21 @@
+2003-05-30  Richard Henderson  <rth@redhat.com>
+
+        * 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.
+
 2003-05-29  Richard Henderson  <rth@redhat.com>
 
        * alpha-linux-tdep.c (alpha_linux_sigtramp_offset_1): New.
index 2f84d6d4096d9e65bcf56dd5b82b9469382e70e8..2f49e08260cefc539ef5cedc7fed9ce451e4dd7a 100644 (file)
@@ -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 frame_info *next_frame,
   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_info *next_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 frame_info *next_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_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 frame_info *next_frame,
   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 (struct frame_info *next_frame,
 {
   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 frame_info *next_frame,
 {
   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 2bd3b266cee57e64236d9f12ff7a02c7adb31eb0..cd29c95e4f7642af6e50772091aae41eae64a11f 100644 (file)
@@ -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 function where there isn't one, or\n\
   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)
@@ -882,7 +890,7 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
 /* 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)
@@ -890,12 +898,17 @@ alpha_heuristic_frame_this_id (struct frame_info *next_frame,
   struct alpha_heuristic_unwind_cache *info
     = alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
 
+  /* This is meant to halt the backtrace at "_start".  Make sure we
+     don't halt it at a generic dummy frame. */
+  if (inside_entry_file (info->start_pc))
+    return;
+
   *this_id = frame_id_build (info->vfp, info->start_pc);
 }
 
 /* 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,
@@ -954,7 +967,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 412ec37c5a901e9565a6a4cd9b7ff6f3ee0398ba..5def15a845424db25219563a05f4ef5b1b8f64f5 100644 (file)
@@ -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 *);