Hi Ulrich,
> Sparc/Solaris is another native target still does not use the new-style
> iterate_over_regset_sections core file logic (allowing cross-debugging
> of core files and core file generation).
>
> Fortunately, it should be straightforward to enable to generic sparc logic
> here by simply providing an appropriate register map. In fact, the map
> itself is already present, and can just be reused. The only remaining
> parameters needed are the total sizes of the register sections in core
> files, which I've taken from public OpenSolaris sources.
>
> The patch is untested so far since I don't have access to a Sparc/Solaris
> system. Testing by Solaris maintainers would be much appreciated.
>
> Bye,
> Ulrich
>
> 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.
I will try to test your patch with AdaCore's testsuite, but
currently, GDB does not build on Solaris, probably because of
the gnulib update. I will try focusing on that first, and then
do the testing.
Hi Ulrich,
> Sparc/Solaris is another native target still does not use the new-style
> iterate_over_regset_sections core file logic (allowing cross-debugging
> of core files and core file generation).
>
> Fortunately, it should be straightforward to enable to generic sparc logic
> here by simply providing an appropriate register map. In fact, the map
> itself is already present, and can just be reused. The only remaining
> parameters needed are the total sizes of the register sections in core
> files, which I've taken from public OpenSolaris sources.
>
> The patch is untested so far since I don't have access to a Sparc/Solaris
> system. Testing by Solaris maintainers would be much appreciated.
>
> Bye,
> Ulrich
>
> 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.
I tested this patch on sparc-solaris using AdaCore's testsuite,
and it revealed no regression, and in particular testcases involving
the use of core files continued passing.
===================================================================
@@ -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
===================================================================
@@ -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
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
+ };
/* The Solaris signal trampolines reside in libc. For normal signals,
@@ -211,6 +258,12 @@ sparc32_sol2_init_abi (struct gdbarch_in
{
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. */
===================================================================
@@ -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
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
+ };
static struct sparc_frame_cache *
@@ -159,6 +206,12 @@ sparc64_sol2_init_abi (struct gdbarch_in
{
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);