PR cli/7719:
[deliverable/binutils-gdb.git] / gdb / sparc64fbsd-tdep.c
index 9ca4983dfae55b135f8c835e02d9bacd50470429..b642bfcc9c3c1671bb8e72b1d079ba85b1bea751 100644 (file)
@@ -1,12 +1,12 @@
 /* Target-dependent code for FreeBSD/sparc64.
 
 /* Target-dependent code for FreeBSD/sparc64.
 
-   Copyright 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2003-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "frame.h"
 
 #include "defs.h"
 #include "frame.h"
@@ -33,6 +31,7 @@
 #include "gdb_string.h"
 
 #include "sparc64-tdep.h"
 #include "gdb_string.h"
 
 #include "sparc64-tdep.h"
+#include "solib-svr4.h"
 
 /* From <machine/reg.h>.  */
 const struct sparc_gregset sparc64fbsd_gregset =
 
 /* From <machine/reg.h>.  */
 const struct sparc_gregset sparc64fbsd_gregset =
@@ -57,25 +56,41 @@ sparc64fbsd_supply_gregset (const struct regset *regset,
   sparc64_supply_gregset (&sparc64fbsd_gregset, regcache, regnum, gregs);
 }
 
   sparc64_supply_gregset (&sparc64fbsd_gregset, regcache, regnum, gregs);
 }
 
+static void
+sparc64fbsd_collect_gregset (const struct regset *regset,
+                            const struct regcache *regcache,
+                            int regnum, void *gregs, size_t len)
+{
+  sparc64_collect_gregset (&sparc64fbsd_gregset, regcache, regnum, gregs);
+}
+
 static void
 sparc64fbsd_supply_fpregset (const struct regset *regset,
                             struct regcache *regcache,
                             int regnum, const void *fpregs, size_t len)
 {
 static void
 sparc64fbsd_supply_fpregset (const struct regset *regset,
                             struct regcache *regcache,
                             int regnum, const void *fpregs, size_t len)
 {
-  sparc64_supply_fpregset (regcache, regnum, fpregs);
+  sparc64_supply_fpregset (&sparc64_bsd_fpregset, regcache, regnum, fpregs);
+}
+
+static void
+sparc64fbsd_collect_fpregset (const struct regset *regset,
+                             const struct regcache *regcache,
+                             int regnum, void *fpregs, size_t len)
+{
+  sparc64_collect_fpregset (&sparc64_bsd_fpregset, regcache, regnum, fpregs);
 }
 \f
 
 /* Signal trampolines.  */
 
 static int
 }
 \f
 
 /* Signal trampolines.  */
 
 static int
-sparc64fbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
+sparc64fbsd_pc_in_sigtramp (CORE_ADDR pc, const char *name)
 {
   return (name && strcmp (name, "__sigtramp") == 0);
 }
 
 static struct sparc_frame_cache *
 {
   return (name && strcmp (name, "__sigtramp") == 0);
 }
 
 static struct sparc_frame_cache *
-sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
+sparc64fbsd_sigtramp_frame_cache (struct frame_info *this_frame,
                                   void **this_cache)
 {
   struct sparc_frame_cache *cache;
                                   void **this_cache)
 {
   struct sparc_frame_cache *cache;
@@ -86,15 +101,15 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
   if (*this_cache)
     return *this_cache;
 
   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);
 
   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.  */
 
   /* The third argument is a pointer to an instance of `ucontext_t',
      which has a member `uc_mcontext' that contains the saved
      registers.  */
-  addr = frame_unwind_register_unsigned (next_frame, SPARC_O2_REGNUM);
+  addr = get_frame_register_unsigned (this_frame, SPARC_O2_REGNUM);
   mcontext_addr = addr + 64;
 
   /* The following registers travel in the `mc_local' slots of
   mcontext_addr = addr + 64;
 
   /* The following registers travel in the `mc_local' slots of
@@ -121,7 +136,7 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
   /* The `local' and `in' registers have been saved in the register
      save area.  */
   addr = cache->saved_regs[SPARC_SP_REGNUM].addr;
   /* The `local' and `in' registers have been saved in the register
      save area.  */
   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;
   for (regnum = SPARC_L0_REGNUM, addr = sp + BIAS;
        regnum <= SPARC_I7_REGNUM; regnum++, addr += 8)
     cache->saved_regs[regnum].addr = addr;
@@ -132,7 +147,7 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
 #define FPRS_FEF       (1 << 2)
 
   addr = cache->saved_regs[SPARC64_FPRS_REGNUM].addr;
 #define FPRS_FEF       (1 << 2)
 
   addr = cache->saved_regs[SPARC64_FPRS_REGNUM].addr;
-  fprs = get_frame_memory_unsigned (next_frame, addr, 8);
+  fprs = get_frame_memory_unsigned (this_frame, addr, 8);
   if (fprs & FPRS_FEF)
     {
       for (regnum = SPARC_F0_REGNUM, addr = mcontext_addr + 32 * 8;
   if (fprs & FPRS_FEF)
     {
       for (regnum = SPARC_F0_REGNUM, addr = mcontext_addr + 32 * 8;
@@ -148,50 +163,50 @@ sparc64fbsd_sigtramp_frame_cache (struct frame_info *next_frame,
 }
 
 static void
 }
 
 static void
-sparc64fbsd_sigtramp_frame_this_id (struct frame_info *next_frame,
+sparc64fbsd_sigtramp_frame_this_id (struct frame_info *this_frame,
                                    void **this_cache,
                                    struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
                                    void **this_cache,
                                    struct frame_id *this_id)
 {
   struct sparc_frame_cache *cache =
-    sparc64fbsd_sigtramp_frame_cache (next_frame, this_cache);
+    sparc64fbsd_sigtramp_frame_cache (this_frame, this_cache);
 
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
 
   (*this_id) = frame_id_build (cache->base, cache->pc);
 }
 
-static void
-sparc64fbsd_sigtramp_frame_prev_register (struct frame_info *next_frame,
-                                         void **this_cache,
-                                         int regnum, int *optimizedp,
-                                         enum lval_type *lvalp,
-                                         CORE_ADDR *addrp,
-                                         int *realnump, void *valuep)
+static struct value *
+sparc64fbsd_sigtramp_frame_prev_register (struct frame_info *this_frame,
+                                         void **this_cache, int regnum)
 {
   struct sparc_frame_cache *cache =
 {
   struct sparc_frame_cache *cache =
-    sparc64fbsd_sigtramp_frame_cache (next_frame, this_cache);
+    sparc64fbsd_sigtramp_frame_cache (this_frame, this_cache);
 
 
-  trad_frame_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 sparc64fbsd_sigtramp_frame_unwind =
-{
-  SIGTRAMP_FRAME,
-  sparc64fbsd_sigtramp_frame_this_id,
-  sparc64fbsd_sigtramp_frame_prev_register
-};
-
-static const struct frame_unwind *
-sparc64fbsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
+static int
+sparc64fbsd_sigtramp_frame_sniffer (const struct frame_unwind *self,
+                                   struct frame_info *this_frame,
+                                   void **this_cache)
 {
 {
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
-  char *name;
+  CORE_ADDR pc = get_frame_pc (this_frame);
+  const char *name;
 
   find_pc_partial_function (pc, &name, NULL, NULL);
   if (sparc64fbsd_pc_in_sigtramp (pc, name))
 
   find_pc_partial_function (pc, &name, NULL, NULL);
   if (sparc64fbsd_pc_in_sigtramp (pc, name))
-    return &sparc64fbsd_sigtramp_frame_unwind;
+    return 1;
 
 
-  return NULL;
+  return 0;
 }
 }
+
+static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind =
+{
+  SIGTRAMP_FRAME,
+  default_frame_unwind_stop_reason,
+  sparc64fbsd_sigtramp_frame_this_id,
+  sparc64fbsd_sigtramp_frame_prev_register,
+  NULL,
+  sparc64fbsd_sigtramp_frame_sniffer
+};
 \f
 
 static void
 \f
 
 static void
@@ -199,15 +214,22 @@ sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  tdep->gregset = regset_alloc (gdbarch, sparc64fbsd_supply_gregset, NULL);
+  tdep->gregset = regset_alloc (gdbarch, sparc64fbsd_supply_gregset,
+                               sparc64fbsd_collect_gregset);
   tdep->sizeof_gregset = 256;
 
   tdep->sizeof_gregset = 256;
 
-  tdep->fpregset = regset_alloc (gdbarch, sparc64fbsd_supply_fpregset, NULL);
+  tdep->fpregset = regset_alloc (gdbarch, sparc64fbsd_supply_fpregset,
+                                sparc64fbsd_collect_fpregset);
   tdep->sizeof_fpregset = 272;
 
   tdep->sizeof_fpregset = 272;
 
-  frame_unwind_append_sniffer (gdbarch, sparc64fbsd_sigtramp_frame_sniffer);
+  frame_unwind_append_unwinder (gdbarch, &sparc64fbsd_sigtramp_frame_unwind);
 
   sparc64_init_abi (info, gdbarch);
 
   sparc64_init_abi (info, gdbarch);
+
+  /* FreeBSD/sparc64 has SVR4-style shared libraries.  */
+  set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
+  set_solib_svr4_fetch_link_map_offsets
+    (gdbarch, svr4_lp64_fetch_link_map_offsets);
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 }
 
 /* Provide a prototype to silence -Wmissing-prototypes.  */
This page took 0.026535 seconds and 4 git commands to generate.