OSDN Git Service

* sparc-tdep.c, sparc-tdep.h, sparc-sol2-tdep.c, sparc64-tdep.c,
authorbrobecke <brobecke>
Wed, 7 May 2008 19:30:04 +0000 (19:30 +0000)
committerbrobecke <brobecke>
Wed, 7 May 2008 19:30:04 +0000 (19:30 +0000)
        sparc64-sol2-tdep.c: Update for unwinder changes.

gdb/ChangeLog
gdb/sparc-sol2-tdep.c
gdb/sparc-tdep.c
gdb/sparc-tdep.h
gdb/sparc64-sol2-tdep.c
gdb/sparc64-tdep.c

index 0819a3c..d3f6848 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-07  Joel Brobecker  <brobecker@adacore.com>
+
+       * sparc-tdep.c, sparc-tdep.h, sparc-sol2-tdep.c, sparc64-tdep.c,
+       sparc64-sol2-tdep.c: Update for unwinder changes.
+
 2008-05-07  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * cp-support.c (mangled_name_to_comp): Initialize storage.
index bf0bada..bac1642 100644 (file)
@@ -74,7 +74,7 @@ sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name)
 }
 
 static struct sparc_frame_cache *
-sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
+sparc32_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
                                   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -84,16 +84,16 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
   if (*this_cache)
     return *this_cache;
 
-  cache = sparc_frame_cache (next_frame, this_cache);
+  cache = sparc_frame_cache (this_frame, this_cache);
   gdb_assert (cache == *this_cache);
 
-  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+  cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
 
   /* The third argument is a pointer to an instance of `ucontext_t',
      which has a member `uc_mcontext' that contains the saved
      registers.  */
   regnum = (cache->frameless_p ? SPARC_O2_REGNUM : SPARC_I2_REGNUM);
-  mcontext_addr = frame_unwind_register_unsigned (next_frame, regnum) + 40;
+  mcontext_addr = get_frame_register_unsigned (this_frame, regnum) + 40;
 
   cache->saved_regs[SPARC32_PSR_REGNUM].addr = mcontext_addr + 0 * 4;
   cache->saved_regs[SPARC32_PC_REGNUM].addr = mcontext_addr + 1 * 4;
@@ -105,7 +105,7 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
        regnum <= SPARC_O7_REGNUM; regnum++, addr += 4)
     cache->saved_regs[regnum].addr = addr;
 
-  if (get_frame_memory_unsigned (next_frame, mcontext_addr + 19 * 4, 4))
+  if (get_frame_memory_unsigned (this_frame, mcontext_addr + 19 * 4, 4))
     {
       /* The register windows haven't been flushed.  */
       for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
@@ -114,7 +114,7 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
   else
     {
       addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
-      addr = get_frame_memory_unsigned (next_frame, addr, 4);
+      addr = get_frame_memory_unsigned (this_frame, addr, 4);
       for (regnum = SPARC_L0_REGNUM;
           regnum <= SPARC_I7_REGNUM; regnum++, addr += 4)
        cache->saved_regs[regnum].addr = addr;
@@ -124,51 +124,51 @@ sparc32_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
 }
 
 static void
-sparc32_sol2_sigtramp_frame_this_id (struct frame_info *next_frame,
+sparc32_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
                                     void **this_cache,
                                     struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
-    sparc32_sol2_sigtramp_frame_cache (next_frame, this_cache);
+    sparc32_sol2_sigtramp_frame_cache (this_frame, this_cache);
 
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
-static void
-sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *next_frame,
+static struct value *
+sparc32_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
                                           void **this_cache,
-                                          int regnum, int *optimizedp,
-                                          enum lval_type *lvalp,
-                                          CORE_ADDR *addrp,
-                                          int *realnump, gdb_byte *valuep)
+                                          int regnum)
 {
   struct sparc_frame_cache *cache =
-    sparc32_sol2_sigtramp_frame_cache (next_frame, this_cache);
+    sparc32_sol2_sigtramp_frame_cache (this_frame, this_cache);
 
-  trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
-                               optimizedp, lvalp, addrp, realnump, valuep);
+  return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
 }
 
-static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
-{
-  SIGTRAMP_FRAME,
-  sparc32_sol2_sigtramp_frame_this_id,
-  sparc32_sol2_sigtramp_frame_prev_register
-};
-
-static const struct frame_unwind *
-sparc32_sol2_sigtramp_frame_sniffer (struct frame_info *next_frame)
+static int
+sparc32_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
+                                    struct frame_info *this_frame,
+                                    void **this_cache)
 {
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
+  CORE_ADDR pc = get_frame_pc (this_frame);
   char *name;
 
   find_pc_partial_function (pc, &name, NULL, NULL);
   if (sparc_sol2_pc_in_sigtramp (pc, name))
-    return &sparc32_sol2_sigtramp_frame_unwind;
+    return 1;
 
-  return NULL;
+  return 0;
 }
 
+static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
+{
+  SIGTRAMP_FRAME,
+  sparc32_sol2_sigtramp_frame_this_id,
+  sparc32_sol2_sigtramp_frame_prev_register,
+  NULL,
+  sparc32_sol2_sigtramp_frame_sniffer
+};
+
 /* Unglobalize NAME.  */
 
 char *
@@ -229,7 +229,7 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* Solaris has kernel-assisted single-stepping support.  */
   set_gdbarch_software_single_step (gdbarch, NULL);
 
-  frame_unwind_append_sniffer (gdbarch, sparc32_sol2_sigtramp_frame_sniffer);
+  frame_unwind_append_unwinder (gdbarch, &sparc32_sol2_sigtramp_frame_unwind);
 }
 \f
 
index 400376d..898e96f 100644 (file)
@@ -768,10 +768,10 @@ sparc_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
 }
 
 static CORE_ADDR
-sparc_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
+sparc_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-  return frame_unwind_register_unsigned (next_frame, tdep->pc_regnum);
+  return frame_unwind_register_unsigned (this_frame, tdep->pc_regnum);
 }
 
 /* Return PC of first real instruction of the function starting at
@@ -830,7 +830,7 @@ sparc32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 /* Normal frames.  */
 
 struct sparc_frame_cache *
-sparc_frame_cache (struct frame_info *next_frame, void **this_cache)
+sparc_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache;
 
@@ -840,10 +840,10 @@ sparc_frame_cache (struct frame_info *next_frame, void **this_cache)
   cache = sparc_alloc_frame_cache ();
   *this_cache = cache;
 
-  cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
+  cache->pc = get_frame_func (this_frame);
   if (cache->pc != 0)
-    sparc_analyze_prologue (get_frame_arch (next_frame), cache->pc,
-                           frame_pc_unwind (next_frame), cache);
+    sparc_analyze_prologue (get_frame_arch (this_frame), cache->pc,
+                           get_frame_pc (this_frame), cache);
 
   if (cache->frameless_p)
     {
@@ -851,14 +851,14 @@ sparc_frame_cache (struct frame_info *next_frame, void **this_cache)
          pointer for our calling frame.  Use %sp (%o6) as this frame's
          base address.  */
       cache->base =
-       frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
+        get_frame_register_unsigned (this_frame, SPARC_SP_REGNUM);
     }
   else
     {
       /* For normal frames, %fp (%i6) holds the frame pointer, the
          base address for the current stack frame.  */
       cache->base =
-       frame_unwind_register_unsigned (next_frame, SPARC_FP_REGNUM);
+       get_frame_register_unsigned (this_frame, SPARC_FP_REGNUM);
     }
 
   if (cache->base & 1)
@@ -885,7 +885,7 @@ sparc32_struct_return_from_sym (struct symbol *sym)
 }
 
 struct sparc_frame_cache *
-sparc32_frame_cache (struct frame_info *next_frame, void **this_cache)
+sparc32_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache;
   struct symbol *sym;
@@ -893,7 +893,7 @@ sparc32_frame_cache (struct frame_info *next_frame, void **this_cache)
   if (*this_cache)
     return *this_cache;
 
-  cache = sparc_frame_cache (next_frame, this_cache);
+  cache = sparc_frame_cache (this_frame, this_cache);
 
   sym = find_pc_function (cache->pc);
   if (sym)
@@ -911,7 +911,7 @@ sparc32_frame_cache (struct frame_info *next_frame, void **this_cache)
       CORE_ADDR pc;
       int regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
 
-      pc = frame_unwind_register_unsigned (next_frame, regnum) + 8;
+      pc = get_frame_register_unsigned (this_frame, regnum) + 8;
       if (sparc_is_unimp_insn (pc))
         cache->struct_return_p = 1;
     }
@@ -920,11 +920,11 @@ sparc32_frame_cache (struct frame_info *next_frame, void **this_cache)
 }
 
 static void
-sparc32_frame_this_id (struct frame_info *next_frame, void **this_cache,
+sparc32_frame_this_id (struct frame_info *this_frame, void **this_cache,
                       struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
-    sparc32_frame_cache (next_frame, this_cache);
+    sparc32_frame_cache (this_frame, this_cache);
 
   /* This marks the outermost frame.  */
   if (cache->base == 0)
@@ -933,36 +933,26 @@ sparc32_frame_this_id (struct frame_info *next_frame, void **this_cache,
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
-static void
-sparc32_frame_prev_register (struct frame_info *next_frame, void **this_cache,
-                            int regnum, int *optimizedp,
-                            enum lval_type *lvalp, CORE_ADDR *addrp,
-                            int *realnump, gdb_byte *valuep)
+static struct value *
+sparc32_frame_prev_register (struct frame_info *this_frame,
+                            void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
-    sparc32_frame_cache (next_frame, this_cache);
+    sparc32_frame_cache (this_frame, this_cache);
 
   if (regnum == SPARC32_PC_REGNUM || regnum == SPARC32_NPC_REGNUM)
     {
-      *optimizedp = 0;
-      *lvalp = not_lval;
-      *addrp = 0;
-      *realnump = -1;
-      if (valuep)
-       {
-         CORE_ADDR pc = (regnum == SPARC32_NPC_REGNUM) ? 4 : 0;
+      CORE_ADDR pc = (regnum == SPARC32_NPC_REGNUM) ? 4 : 0;
 
-         /* If this functions has a Structure, Union or
-             Quad-Precision return value, we have to skip the UNIMP
-             instruction that encodes the size of the structure.  */
-         if (cache->struct_return_p)
-           pc += 4;
+      /* If this functions has a Structure, Union or Quad-Precision
+        return value, we have to skip the UNIMP instruction that encodes
+        the size of the structure.  */
+      if (cache->struct_return_p)
+       pc += 4;
 
-         regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
-         pc += frame_unwind_register_unsigned (next_frame, regnum) + 8;
-         store_unsigned_integer (valuep, 4, pc);
-       }
-      return;
+      regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
+      pc += get_frame_register_unsigned (this_frame, regnum) + 8;
+      return frame_unwind_got_constant (this_frame, regnum, pc);
     }
 
   /* Handle StackGhost.  */
@@ -971,20 +961,12 @@ sparc32_frame_prev_register (struct frame_info *next_frame, void **this_cache,
 
     if (wcookie != 0 && !cache->frameless_p && regnum == SPARC_I7_REGNUM)
       {
-       *optimizedp = 0;
-       *lvalp = not_lval;
-       *addrp = 0;
-       *realnump = -1;
-       if (valuep)
-         {
-           CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 4;
-           ULONGEST i7;
-
-           /* Read the value in from memory.  */
-           i7 = get_frame_memory_unsigned (next_frame, addr, 4);
-           store_unsigned_integer (valuep, 4, i7 ^ wcookie);
-         }
-       return;
+        CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 4;
+        ULONGEST i7;
+
+        /* Read the value in from memory.  */
+        i7 = get_frame_memory_unsigned (this_frame, addr, 4);
+        return frame_unwind_got_constant (this_frame, regnum, i7 ^ wcookie);
       }
   }
 
@@ -993,53 +975,35 @@ sparc32_frame_prev_register (struct frame_info *next_frame, void **this_cache,
   if (!cache->frameless_p
       && regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM)
     {
-      *optimizedp = 0;
-      *lvalp = lval_memory;
-      *addrp = cache->base + (regnum - SPARC_L0_REGNUM) * 4;
-      *realnump = -1;
-      if (valuep)
-       {
-         struct gdbarch *gdbarch = get_frame_arch (next_frame);
+      CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 4;
 
-         /* Read the value in from memory.  */
-         read_memory (*addrp, valuep, register_size (gdbarch, regnum));
-       }
-      return;
+      return frame_unwind_got_memory (this_frame, regnum, addr);
     }
 
-  /* The previous frame's `out' registers are accessable as the
+  /* The previous frame's `out' registers are accessible as the
      current frame's `in' registers.  */
   if (!cache->frameless_p
       && regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
     regnum += (SPARC_I0_REGNUM - SPARC_O0_REGNUM);
 
-  *optimizedp = 0;
-  *lvalp = lval_register;
-  *addrp = 0;
-  *realnump = regnum;
-  if (valuep)
-    frame_unwind_register (next_frame, (*realnump), valuep);
+  return frame_unwind_got_register (this_frame, regnum, regnum);
 }
 
 static const struct frame_unwind sparc32_frame_unwind =
 {
   NORMAL_FRAME,
   sparc32_frame_this_id,
-  sparc32_frame_prev_register
+  sparc32_frame_prev_register,
+  NULL,
+  default_frame_sniffer
 };
-
-static const struct frame_unwind *
-sparc32_frame_sniffer (struct frame_info *next_frame)
-{
-  return &sparc32_frame_unwind;
-}
 \f
 
 static CORE_ADDR
-sparc32_frame_base_address (struct frame_info *next_frame, void **this_cache)
+sparc32_frame_base_address (struct frame_info *this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache =
-    sparc32_frame_cache (next_frame, this_cache);
+    sparc32_frame_cache (this_frame, this_cache);
 
   return cache->base;
 }
@@ -1053,14 +1017,14 @@ static const struct frame_base sparc32_frame_base =
 };
 
 static struct frame_id
-sparc_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
+sparc_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
 {
   CORE_ADDR sp;
 
-  sp = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
+  sp = get_frame_register_unsigned (this_frame, SPARC_SP_REGNUM);
   if (sp & 1)
     sp += BIAS;
-  return frame_id_build (sp, frame_pc_unwind (next_frame));
+  return frame_id_build (sp, get_frame_pc (this_frame));
 }
 \f
 
@@ -1193,7 +1157,7 @@ sparc32_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
 static int
 sparc32_dwarf2_struct_return_p (struct frame_info *this_frame)
 {
-  CORE_ADDR pc = get_frame_address_in_block (this_frame, NORMAL_FRAME);
+  CORE_ADDR pc = get_frame_address_in_block (this_frame);
   struct symbol *sym = find_pc_function (pc);
 
   if (sym)
@@ -1438,7 +1402,7 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   set_gdbarch_software_single_step (gdbarch, sparc_software_single_step);
   set_gdbarch_write_pc (gdbarch, sparc_write_pc);
 
-  set_gdbarch_unwind_dummy_id (gdbarch, sparc_unwind_dummy_id);
+  set_gdbarch_dummy_id (gdbarch, sparc_dummy_id);
 
   set_gdbarch_unwind_pc (gdbarch, sparc_unwind_pc);
 
@@ -1452,7 +1416,7 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Hook in ABI-specific overrides, if they have been registered.  */
   gdbarch_init_osabi (info, gdbarch);
 
-  frame_unwind_append_sniffer (gdbarch, sparc32_frame_sniffer);
+  frame_unwind_append_unwinder (gdbarch, &sparc32_frame_unwind);
 
   /* If we have register sets, enable the generic core file support.  */
   if (tdep->gregset)
index 9f3a1ea..ea0fe45 100644 (file)
@@ -156,10 +156,10 @@ extern CORE_ADDR sparc_analyze_prologue (struct gdbarch *gdbarch,
                                         struct sparc_frame_cache *cache);
 
 extern struct sparc_frame_cache *
-  sparc_frame_cache (struct frame_info *next_frame, void **this_cache);
+  sparc_frame_cache (struct frame_info *this_frame, void **this_cache);
 
 extern struct sparc_frame_cache *
-  sparc32_frame_cache (struct frame_info *next_frame, void **this_cache);
+  sparc32_frame_cache (struct frame_info *this_frame, void **this_cache);
 
 \f
 
index 2fb433c..edcea4e 100644 (file)
@@ -48,7 +48,7 @@ const struct sparc_gregset sparc64_sol2_gregset =
 \f
 
 static struct sparc_frame_cache *
-sparc64_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
+sparc64_sol2_sigtramp_frame_cache (struct frame_info *this_frame,
                                   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -58,16 +58,16 @@ sparc64_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
   if (*this_cache)
     return *this_cache;
 
-  cache = sparc_frame_cache (next_frame, this_cache);
+  cache = sparc_frame_cache (this_frame, this_cache);
   gdb_assert (cache == *this_cache);
 
-  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+  cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
 
   /* The third argument is a pointer to an instance of `ucontext_t',
      which has a member `uc_mcontext' that contains the saved
      registers.  */
   regnum = (cache->frameless_p ? SPARC_O2_REGNUM : SPARC_I2_REGNUM);
-  mcontext_addr = frame_unwind_register_unsigned (next_frame, regnum) + 64;
+  mcontext_addr = get_frame_register_unsigned (this_frame, regnum) + 64;
 
   cache->saved_regs[SPARC64_CCR_REGNUM].addr = mcontext_addr + 0 * 8;
   cache->saved_regs[SPARC64_PC_REGNUM].addr = mcontext_addr + 1 * 8;
@@ -81,7 +81,7 @@ sparc64_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
        regnum <= SPARC_O7_REGNUM; regnum++, addr += 8)
     cache->saved_regs[regnum].addr = addr;
 
-  if (get_frame_memory_unsigned (next_frame, mcontext_addr + 21 * 8, 8))
+  if (get_frame_memory_unsigned (this_frame, mcontext_addr + 21 * 8, 8))
     {
       /* The register windows haven't been flushed.  */
       for (regnum = SPARC_L0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
@@ -92,7 +92,7 @@ sparc64_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
       CORE_ADDR sp;
 
       addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
-      sp = get_frame_memory_unsigned (next_frame, addr, 8);
+      sp = get_frame_memory_unsigned (this_frame, addr, 8);
       for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
           regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
        cache->saved_regs[regnum].addr = addr;
@@ -102,50 +102,50 @@ sparc64_sol2_sigtramp_frame_cache (struct frame_info *next_frame,
 }
 
 static void
-sparc64_sol2_sigtramp_frame_this_id (struct frame_info *next_frame,
+sparc64_sol2_sigtramp_frame_this_id (struct frame_info *this_frame,
                                     void **this_cache,
                                     struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
-    sparc64_sol2_sigtramp_frame_cache (next_frame, this_cache);
+    sparc64_sol2_sigtramp_frame_cache (this_frame, this_cache);
 
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
-static void
-sparc64_sol2_sigtramp_frame_prev_register (struct frame_info *next_frame,
+static struct value *
+sparc64_sol2_sigtramp_frame_prev_register (struct frame_info *this_frame,
                                           void **this_cache,
-                                          int regnum, int *optimizedp,
-                                          enum lval_type *lvalp,
-                                          CORE_ADDR *addrp,
-                                          int *realnump, gdb_byte *valuep)
+                                          int regnum)
 {
   struct sparc_frame_cache *cache =
-    sparc64_sol2_sigtramp_frame_cache (next_frame, this_cache);
+    sparc64_sol2_sigtramp_frame_cache (this_frame, this_cache);
 
-  trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
-                               optimizedp, lvalp, addrp, realnump, valuep);
+  return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum);
 }
 
-static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
-{
-  SIGTRAMP_FRAME,
-  sparc64_sol2_sigtramp_frame_this_id,
-  sparc64_sol2_sigtramp_frame_prev_register
-};
-
-static const struct frame_unwind *
-sparc64_sol2_sigtramp_frame_sniffer (struct frame_info *next_frame)
+static int
+sparc64_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self,
+                                    struct frame_info *this_frame,
+                                    void **this_cache)
 {
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
+  CORE_ADDR pc = get_frame_pc (this_frame);
   char *name;
 
   find_pc_partial_function (pc, &name, NULL, NULL);
   if (sparc_sol2_pc_in_sigtramp (pc, name))
-    return &sparc64_sol2_sigtramp_frame_unwind;
+    return 1;
 
-  return NULL;
+  return 0;
 }
+static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
+{
+  SIGTRAMP_FRAME,
+  sparc64_sol2_sigtramp_frame_this_id,
+  sparc64_sol2_sigtramp_frame_prev_register,
+  NULL,
+  sparc64_sol2_sigtramp_frame_sniffer
+};
+
 \f
 
 void
@@ -153,7 +153,7 @@ sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  frame_unwind_append_sniffer (gdbarch, sparc64_sol2_sigtramp_frame_sniffer);
+  frame_unwind_append_unwinder (gdbarch, &sparc64_sol2_sigtramp_frame_unwind);
 
   sparc64_init_abi (info, gdbarch);
 
index ae1eed3..25c8e57 100644 (file)
@@ -435,17 +435,17 @@ sparc64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
 /* Normal frames.  */
 
 static struct sparc_frame_cache *
-sparc64_frame_cache (struct frame_info *next_frame, void **this_cache)
+sparc64_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
-  return sparc_frame_cache (next_frame, this_cache);
+  return sparc_frame_cache (this_frame, this_cache);
 }
 
 static void
-sparc64_frame_this_id (struct frame_info *next_frame, void **this_cache,
+sparc64_frame_this_id (struct frame_info *this_frame, void **this_cache,
                       struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
-    sparc64_frame_cache (next_frame, this_cache);
+    sparc64_frame_cache (this_frame, this_cache);
 
   /* This marks the outermost frame.  */
   if (cache->base == 0)
@@ -454,30 +454,20 @@ sparc64_frame_this_id (struct frame_info *next_frame, void **this_cache,
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
-static void
-sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
-                            int regnum, int *optimizedp,
-                            enum lval_type *lvalp, CORE_ADDR *addrp,
-                            int *realnump, gdb_byte *valuep)
+static struct value *
+sparc64_frame_prev_register (struct frame_info *this_frame, void **this_cache,
+                            int regnum)
 {
   struct sparc_frame_cache *cache =
-    sparc64_frame_cache (next_frame, this_cache);
+    sparc64_frame_cache (this_frame, this_cache);
 
   if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
     {
-      *optimizedp = 0;
-      *lvalp = not_lval;
-      *addrp = 0;
-      *realnump = -1;
-      if (valuep)
-       {
-         CORE_ADDR pc = (regnum == SPARC64_NPC_REGNUM) ? 4 : 0;
+      CORE_ADDR pc = (regnum == SPARC64_NPC_REGNUM) ? 4 : 0;
 
-         regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
-         pc += frame_unwind_register_unsigned (next_frame, regnum) + 8;
-         store_unsigned_integer (valuep, 8, pc);
-       }
-      return;
+      regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
+      pc += get_frame_register_unsigned (this_frame, regnum) + 8;
+      return frame_unwind_got_constant (this_frame, regnum, pc);
     }
 
   /* Handle StackGhost.  */
@@ -486,20 +476,12 @@ sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
 
     if (wcookie != 0 && !cache->frameless_p && regnum == SPARC_I7_REGNUM)
       {
-       *optimizedp = 0;
-       *lvalp = not_lval;
-       *addrp = 0;
-       *realnump = -1;
-       if (valuep)
-         {
-           CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
-           ULONGEST i7;
-
-           /* Read the value in from memory.  */
-           i7 = get_frame_memory_unsigned (next_frame, addr, 8);
-           store_unsigned_integer (valuep, 8, i7 ^ wcookie);
-         }
-       return;
+        CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
+        ULONGEST i7;
+
+        /* Read the value in from memory.  */
+        i7 = get_frame_memory_unsigned (this_frame, addr, 8);
+        return frame_unwind_got_constant (this_frame, regnum, i7 ^ wcookie);
       }
   }
 
@@ -508,18 +490,9 @@ sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
   if (!cache->frameless_p
       && regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM)
     {
-      *optimizedp = 0;
-      *lvalp = lval_memory;
-      *addrp = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
-      *realnump = -1;
-      if (valuep)
-       {
-         struct gdbarch *gdbarch = get_frame_arch (next_frame);
+      CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
 
-         /* Read the value in from memory.  */
-         read_memory (*addrp, valuep, register_size (gdbarch, regnum));
-       }
-      return;
+      return frame_unwind_got_memory (this_frame, regnum, addr);
     }
 
   /* The previous frame's `out' registers are accessable as the
@@ -528,33 +501,24 @@ sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
       && regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
     regnum += (SPARC_I0_REGNUM - SPARC_O0_REGNUM);
 
-  *optimizedp = 0;
-  *lvalp = lval_register;
-  *addrp = 0;
-  *realnump = regnum;
-  if (valuep)
-    frame_unwind_register (next_frame, regnum, valuep);
+  return frame_unwind_got_register (this_frame, regnum, regnum);
 }
 
 static const struct frame_unwind sparc64_frame_unwind =
 {
   NORMAL_FRAME,
   sparc64_frame_this_id,
-  sparc64_frame_prev_register
+  sparc64_frame_prev_register,
+  NULL,
+  default_frame_sniffer
 };
-
-static const struct frame_unwind *
-sparc64_frame_sniffer (struct frame_info *next_frame)
-{
-  return &sparc64_frame_unwind;
-}
 \f
 
 static CORE_ADDR
-sparc64_frame_base_address (struct frame_info *next_frame, void **this_cache)
+sparc64_frame_base_address (struct frame_info *this_frame, void **this_cache)
 {
   struct sparc_frame_cache *cache =
-    sparc64_frame_cache (next_frame, this_cache);
+    sparc64_frame_cache (this_frame, this_cache);
 
   return cache->base;
 }
@@ -1149,7 +1113,7 @@ sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   /* FIXME: kettenis/20050423: Don't enable the unwinder until the
      StackGhost issues have been resolved.  */
 
-  frame_unwind_append_sniffer (gdbarch, sparc64_frame_sniffer);
+  frame_unwind_append_unwinder (gdbarch, &sparc64_frame_unwind);
   frame_base_set_default (gdbarch, &sparc64_frame_base);
 }
 \f