print_percentage: Use floating point to avoid incorrect results when
[deliverable/binutils-gdb.git] / gdb / alpha-mdebug-tdep.c
index 2f84d6d4096d9e65bcf56dd5b82b9469382e70e8..153ed11ce7d212eaf6e49211c355228e4204dcae 100644 (file)
 #include "frame.h"
 #include "frame-unwind.h"
 #include "frame-base.h"
-#include "inferior.h"
 #include "symtab.h"
-#include "value.h"
-#include "gdbcmd.h"
 #include "gdbcore.h"
-#include "dis-asm.h"
-#include "symfile.h"
-#include "objfiles.h"
-#include "gdb_string.h"
-#include "linespec.h"
-#include "regcache.h"
-#include "doublest.h"
-#include "arch-utils.h"
-#include "osabi.h"
 #include "block.h"
 #include "gdb_assert.h"
 
-#include "elf-bfd.h"
-
 #include "alpha-tdep.h"
 
 /* FIXME: Some of this code should perhaps be merged with mips.  */
@@ -59,7 +45,7 @@
    |  |localoff        |  Copies of 1st .. 6th         |
    |  |  |  |  |  argument if necessary.       |
    |  |  |  v  |                               |
-   |  |  |  ---        |-------------------------------|<-- FRAME_LOCALS_ADDRESS
+   |  |  |  ---        |-------------------------------|<-- LOCALS_ADDRESS
    |  |  |      |                              |
    |  |  |      |  Locals and temporaries.     |
    |  |  |      |                              |
@@ -148,7 +134,7 @@ alpha_mdebug_after_prologue (CORE_ADDR pc, alpha_extra_func_info_t proc_desc)
     {
       /* If function is frameless, then we need to do it the hard way.  I
          strongly suspect that frameless always means prologueless... */
-      if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
+      if (PROC_FRAME_REG (proc_desc) == ALPHA_SP_REGNUM
          && PROC_FRAME_OFFSET (proc_desc) == 0)
        return 0;
     }
@@ -174,7 +160,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 +190,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.  */
@@ -257,7 +227,7 @@ alpha_mdebug_frame_unwind_cache (struct frame_info *next_frame,
   for (ireg = 0; ireg <= 31; ++ireg)
     if (mask & (1 << ireg))
       {
-       info->saved_regs[FP0_REGNUM + ireg] = reg_position;
+       info->saved_regs[ALPHA_FP0_REGNUM + ireg] = reg_position;
        reg_position += 8;
       }
 
@@ -275,12 +245,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,20 +260,10 @@ 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.  */
-  if (regnum == PC_REGNUM)
+  if (regnum == ALPHA_PC_REGNUM)
     regnum = PROC_PC_REG (info->proc_desc);
   
   /* For all registers known to be saved in the current frame, 
@@ -320,13 +275,13 @@ alpha_mdebug_frame_prev_register (struct frame_info *next_frame,
       *addrp = info->saved_regs[regnum];
       *realnump = -1;
       if (bufferp != NULL)
-       read_memory (*addrp, bufferp, ALPHA_REGISTER_SIZE);
+       get_frame_memory (next_frame, *addrp, bufferp, ALPHA_REGISTER_SIZE);
       return;
     }
 
   /* The stack pointer of the previous frame is computed by popping
      the current stack frame.  */
-  if (regnum == SP_REGNUM)
+  if (regnum == ALPHA_SP_REGNUM)
     {
       *optimizedp = 0;
       *lvalp = not_lval;
@@ -349,8 +304,9 @@ static const struct frame_unwind alpha_mdebug_frame_unwind = {
 };
 
 const struct frame_unwind *
-alpha_mdebug_frame_p (CORE_ADDR pc)
+alpha_mdebug_frame_sniffer (struct frame_info *next_frame)
 {
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
   alpha_extra_func_info_t proc_desc;
 
   /* If this PC does not map to a PDR, then clearly this isn't an
@@ -359,6 +315,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 +330,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 +339,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 +349,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 = {
@@ -418,8 +361,9 @@ static const struct frame_base alpha_mdebug_frame_base = {
 };
 
 static const struct frame_base *
-alpha_mdebug_frame_base_p (CORE_ADDR pc)
+alpha_mdebug_frame_base_sniffer (struct frame_info *next_frame)
 {
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
   alpha_extra_func_info_t proc_desc;
 
   /* If this PC does not map to a PDR, then clearly this isn't an
@@ -437,6 +381,6 @@ alpha_mdebug_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  frame_unwind_append_predicate (gdbarch, alpha_mdebug_frame_p);
-  frame_base_append_predicate (gdbarch, alpha_mdebug_frame_base_p);
+  frame_unwind_append_sniffer (gdbarch, alpha_mdebug_frame_sniffer);
+  frame_base_append_sniffer (gdbarch, alpha_mdebug_frame_base_sniffer);
 }
This page took 0.025365 seconds and 4 git commands to generate.