Use core regset iterators on Sparc Solaris
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Wed, 3 Dec 2014 14:38:46 +0000 (15:38 +0100)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Wed, 3 Dec 2014 14:38:46 +0000 (15:38 +0100)
Remove native-only core file handling on Sparc Solaris.  Instead,
enable the sparc target generic core regset logic on Solaris by
providing appropriate register offset maps.

Thanks to Joel Brobecker for testing!

gdb/
* config/sparc/sol2.mh (NATDEPFILES): Remove core-regset.o.
* sparc-sol2-tdep.c: Include "regset.h".
(sparc32_sol2_supply_core_gregset): New function.
(sparc32_sol2_collect_core_gregset): Likewise.
(sparc32_sol2_supply_core_fpregset): Likewise.
(sparc32_sol2_collect_core_fpregset): Likewise.
(sparc32_sol2_gregset, sparc32_sol2_fpregset): New variables.
(sparc32_sol2_init_abi): Set tdep->gregset/sizeof_gregset and
tdep->fpregset/sizeof_fpregset.
* sparc64-sol2-tdep.c: Include "regset.h".
(sparc64_sol2_supply_core_gregset): New function.
(sparc64_sol2_collect_core_gregset): Likewise.
(sparc64_sol2_supply_core_fpregset): Likewise.
(sparc64_sol2_collect_core_fpregset): Likewise.
(sparc64_sol2_gregset, sparc64_sol2_fpregset): New variables.
(sparc64_sol2_init_abi): Set tdep->gregset/sizeof_gregset and
tdep->fpregset/sizeof_fpregset.

gdb/ChangeLog
gdb/config/sparc/sol2.mh
gdb/sparc-sol2-tdep.c
gdb/sparc64-sol2-tdep.c

index 5e1e43f45fd3b93e239edc42d33319fe5e5d9f53..ebb36b78161dd2177ffaa938c8cd17de63bd38aa 100644 (file)
@@ -1,3 +1,23 @@
+2014-12-03  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * config/sparc/sol2.mh (NATDEPFILES): Remove core-regset.o.
+       * sparc-sol2-tdep.c: Include "regset.h".
+       (sparc32_sol2_supply_core_gregset): New function.
+       (sparc32_sol2_collect_core_gregset): Likewise.
+       (sparc32_sol2_supply_core_fpregset): Likewise.
+       (sparc32_sol2_collect_core_fpregset): Likewise.
+       (sparc32_sol2_gregset, sparc32_sol2_fpregset): New variables.
+       (sparc32_sol2_init_abi): Set tdep->gregset/sizeof_gregset and
+       tdep->fpregset/sizeof_fpregset.
+       * sparc64-sol2-tdep.c: Include "regset.h".
+       (sparc64_sol2_supply_core_gregset): New function.
+       (sparc64_sol2_collect_core_gregset): Likewise.
+       (sparc64_sol2_supply_core_fpregset): Likewise.
+       (sparc64_sol2_collect_core_fpregset): Likewise.
+       (sparc64_sol2_gregset, sparc64_sol2_fpregset): New variables.
+       (sparc64_sol2_init_abi): Set tdep->gregset/sizeof_gregset and
+       tdep->fpregset/sizeof_fpregset.
+
 2014-12-03  Simon Marchi  <simon.marchi@ericsson.com>
 
        * common/cleanups.c (make_cleanup_dtor): Use typedef for dtor
index c6cabd2439f7a1a8d1a82575c5877ab533f0ff53..220c61f643961fffcae6e1a03a918a73e24f26c1 100644 (file)
@@ -1,6 +1,6 @@
 # Host: Solaris SPARC & UltraSPARC
 NAT_FILE= nm-sol2.h
 NATDEPFILES= sparc-sol2-nat.o \
-       core-regset.o fork-child.o \
+       fork-child.o \
        procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o
 HAVE_NATIVE_GCORE_HOST = 1
index 7a7d3eb5da701faed8eb0938ca71a6afceebde0f..827bdd01db902775cd55e538b892cb7dc1c8b01b 100644 (file)
@@ -25,6 +25,7 @@
 #include "objfiles.h"
 #include "osabi.h"
 #include "regcache.h"
+#include "regset.h"
 #include "target.h"
 #include "trad-frame.h"
 
@@ -50,6 +51,52 @@ const struct sparc_fpregmap sparc32_sol2_fpregmap =
   0 * 4,                       /* %f0 */
   33 * 4,                      /* %fsr */
 };
+
+static void
+sparc32_sol2_supply_core_gregset (const struct regset *regset,
+                                 struct regcache *regcache,
+                                 int regnum, const void *gregs, size_t len)
+{
+  sparc32_supply_gregset (&sparc32_sol2_gregmap, regcache, regnum, gregs);
+}
+
+static void
+sparc32_sol2_collect_core_gregset (const struct regset *regset,
+                                  const struct regcache *regcache,
+                                  int regnum, void *gregs, size_t len)
+{
+  sparc32_collect_gregset (&sparc32_sol2_gregmap, regcache, regnum, gregs);
+}
+
+static void
+sparc32_sol2_supply_core_fpregset (const struct regset *regset,
+                                  struct regcache *regcache,
+                                  int regnum, const void *fpregs, size_t len)
+{
+  sparc32_supply_fpregset (&sparc32_sol2_fpregmap, regcache, regnum, fpregs);
+}
+
+static void
+sparc32_sol2_collect_core_fpregset (const struct regset *regset,
+                                   const struct regcache *regcache,
+                                   int regnum, void *fpregs, size_t len)
+{
+  sparc32_collect_fpregset (&sparc32_sol2_fpregmap, regcache, regnum, fpregs);
+}
+
+static const struct regset sparc32_sol2_gregset =
+  {
+    NULL,
+    sparc32_sol2_supply_core_gregset,
+    sparc32_sol2_collect_core_gregset
+  };
+
+static const struct regset sparc32_sol2_fpregset =
+  {
+    NULL,
+    sparc32_sol2_supply_core_fpregset,
+    sparc32_sol2_collect_core_fpregset
+  };
 \f
 
 /* The Solaris signal trampolines reside in libc.  For normal signals,
@@ -211,6 +258,12 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  tdep->gregset = &sparc32_sol2_gregset;
+  tdep->sizeof_gregset = 152;
+
+  tdep->fpregset = &sparc32_sol2_fpregset;
+  tdep->sizeof_fpregset = 400;
+
   /* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop, SunPRO)
      compiler puts out 0 instead of the address in N_SO stabs.  Starting with
      SunPRO 3.0, the compiler does this for N_FUN stabs too.  */
index 23e943d0f943229c9dfa390fac4d3d0cdea29b1a..d1d6d62518ccea568779f2cb2cd488cdccfc72e9 100644 (file)
@@ -25,6 +25,7 @@
 #include "objfiles.h"
 #include "osabi.h"
 #include "trad-frame.h"
+#include "regset.h"
 
 #include "sol2-tdep.h"
 #include "sparc64-tdep.h"
@@ -49,6 +50,52 @@ const struct sparc_fpregmap sparc64_sol2_fpregmap =
   0 * 8,                       /* %f0 */
   33 * 8,                      /* %fsr */
 };
+
+static void
+sparc64_sol2_supply_core_gregset (const struct regset *regset,
+                                 struct regcache *regcache,
+                                 int regnum, const void *gregs, size_t len)
+{
+  sparc64_supply_gregset (&sparc64_sol2_gregmap, regcache, regnum, gregs);
+}
+
+static void
+sparc64_sol2_collect_core_gregset (const struct regset *regset,
+                                  const struct regcache *regcache,
+                                  int regnum, void *gregs, size_t len)
+{
+  sparc64_collect_gregset (&sparc64_sol2_gregmap, regcache, regnum, gregs);
+}
+
+static void
+sparc64_sol2_supply_core_fpregset (const struct regset *regset,
+                                  struct regcache *regcache,
+                                  int regnum, const void *fpregs, size_t len)
+{
+  sparc64_supply_fpregset (&sparc64_sol2_fpregmap, regcache, regnum, fpregs);
+}
+
+static void
+sparc64_sol2_collect_core_fpregset (const struct regset *regset,
+                                   const struct regcache *regcache,
+                                   int regnum, void *fpregs, size_t len)
+{
+  sparc64_collect_fpregset (&sparc64_sol2_fpregmap, regcache, regnum, fpregs);
+}
+
+static const struct regset sparc64_sol2_gregset =
+  {
+    NULL,
+    sparc64_sol2_supply_core_gregset,
+    sparc64_sol2_collect_core_gregset
+  };
+
+static const struct regset sparc64_sol2_fpregset =
+  {
+    NULL,
+    sparc64_sol2_supply_core_fpregset,
+    sparc64_sol2_collect_core_fpregset
+  };
 \f
 
 static struct sparc_frame_cache *
@@ -159,6 +206,12 @@ sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  tdep->gregset = &sparc64_sol2_gregset;
+  tdep->sizeof_gregset = 304;
+
+  tdep->fpregset = &sparc64_sol2_fpregset;
+  tdep->sizeof_fpregset = 544;
+
   frame_unwind_append_unwinder (gdbarch, &sparc64_sol2_sigtramp_frame_unwind);
 
   sparc64_init_abi (info, gdbarch);