ALPHA: Migrate from 'regset_from_core_section' to 'iterate_over_regset_sections'
authorAndreas Arnez <arnez@linux.vnet.ibm.com>
Mon, 3 Mar 2014 13:54:50 +0000 (13:54 +0000)
committerAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Tue, 30 Sep 2014 07:14:34 +0000 (09:14 +0200)
Don't define the 'regset_from_core_section' method, but the iterator
method instead.  Do this for GNU/Linux- as well as
Net/OpenBSD-targets.  In the case of GNU/Linux this should enable
non-native use of the 'generate-core-file' command.

gdb/ChangeLog:

* alpha-linux-tdep.c (alpha_linux_regset_from_core_section): Remove.
(alpha_linux_iterate_over_regset_sections): New.
(alpha_linux_init_abi): Adjust gdbarch initialization.
* alphabsd-tdep.h (alphanbsd_regset_from_core_section): Remove
prototype.
(alphanbsd_iterate_over_regset_sections): New prototype.
     * alphafbsd-tdep.c (alphafbsd_init_abi): Add comment for missing
     fbsd_init_abi invocation.
* alphanbsd-tdep.c (alphanbsd_supply_gregset): Move below
alphanbsd_aout_supply_gregset.  Invoke the latter for the
appropriate size.
(alphanbsd_aout_gregset): Remove.
(alphanbsd_regset_from_core_section): Remove.
(alphanbsd_iterate_over_regset_sections): New.
(alphanbsd_init_abi): Adjust gdbarch initialization.
* alphaobsd-tdep.c (alphaobsd_init_abi): Likewise.

gdb/ChangeLog
gdb/alpha-linux-tdep.c
gdb/alphabsd-tdep.h
gdb/alphafbsd-tdep.c
gdb/alphanbsd-tdep.c
gdb/alphaobsd-tdep.c

index a8de5dd..af139f1 100644 (file)
@@ -1,5 +1,14 @@
 2014-09-30  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
+       * alpha-linux-tdep.c (alpha_linux_regset_from_core_section): Remove.
+       (alpha_linux_iterate_over_regset_sections): New.
+       (alpha_linux_init_abi): Adjust gdbarch initialization.
+       * alphabsd-tdep.h (alphanbsd_regset_from_core_section): Remove
+       prototype.
+       (alphanbsd_iterate_over_regset_sections): New prototype.
+
+2014-09-30  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
        * aarch64-linux-tdep.c (aarch64_linux_regset_from_core_section):
        Remove.
        (aarch64_linux_iterate_over_regset_sections): New.
index 51ce1a7..e56be7e 100644 (file)
@@ -230,20 +230,16 @@ static const struct regset alpha_linux_fpregset =
   alpha_linux_supply_fpregset, alpha_linux_collect_fpregset
 };
 
-/* Return the appropriate register set for the core section identified
-   by SECT_NAME and SECT_SIZE.  */
+/* Iterate over core file register note sections.  */
 
-static const struct regset *
-alpha_linux_regset_from_core_section (struct gdbarch *gdbarch,
-                                     const char *sect_name, size_t sect_size)
+static void
+alpha_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
+                                         iterate_over_regset_sections_cb *cb,
+                                         void *cb_data,
+                                         const struct regcache *regcache)
 {
-  if (strcmp (sect_name, ".reg") == 0 && sect_size >= 32 * 8)
-    return &alpha_linux_gregset;
-
-  if (strcmp (sect_name, ".reg2") == 0 && sect_size >= 32 * 8)
-    return &alpha_linux_fpregset;
-
-  return NULL;
+  cb (".reg", 32 * 8, &alpha_linux_gregset, NULL, cb_data);
+  cb (".reg2", 32 * 8, &alpha_linux_fpregset, NULL, cb_data);
 }
 
 /* Implementation of `gdbarch_gdb_signal_from_target', as defined in
@@ -383,8 +379,8 @@ alpha_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_fetch_tls_load_module_address (gdbarch,
                                              svr4_fetch_objfile_link_map);
 
-  set_gdbarch_regset_from_core_section
-    (gdbarch, alpha_linux_regset_from_core_section);
+  set_gdbarch_iterate_over_regset_sections
+    (gdbarch, alpha_linux_iterate_over_regset_sections);
 
   set_gdbarch_gdb_signal_from_target (gdbarch,
                                      alpha_linux_gdb_signal_from_target);
index def7b04..a724ff7 100644 (file)
@@ -31,10 +31,10 @@ void alphabsd_fill_fpreg (const struct regcache *, char *, int);
 
 /* Functions exported from alphanbsd-tdep.c.  */
 
-/* Return the appropriate register set for the core section identified
-   by SECT_NAME and SECT_SIZE.  */
-extern const struct regset *
-  alphanbsd_regset_from_core_section (struct gdbarch *gdbarch,
-                                     const char *sect_name, size_t len);
+/* Iterate over supported core file register note sections. */
+void alphanbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
+                                            iterate_over_regset_sections_cb *cb,
+                                            void *cb_data,
+                                            const struct regcache *regcache);
 
 #endif /* alphabsd-tdep.h */
index 95b64a0..2b7e36e 100644 (file)
@@ -93,6 +93,11 @@ alphafbsd_init_abi (struct gdbarch_info info,
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  /* FIXME: Should activate generic FreeBSD support here with
+     fbsd_init_abi(), but this requires a valid
+     'iterate_over_regset_sections' gdbarch method and
+     'collect_regset' functions for each regset.  */
+
   /* Hook into the DWARF CFI frame unwinder.  */
   alpha_dwarf2_init_abi (info, gdbarch);
 
index a4dd6e9..1c2e630 100644 (file)
@@ -73,30 +73,6 @@ alphanbsd_supply_fpregset (const struct regset *regset,
    REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
 
 static void
-alphanbsd_supply_gregset (const struct regset *regset,
-                         struct regcache *regcache,
-                         int regnum, const void *gregs, size_t len)
-{
-  const gdb_byte *regs = gregs;
-  int i;
-
-  gdb_assert (len >= ALPHANBSD_SIZEOF_GREGS);
-
-  for (i = 0; i < ALPHA_ZERO_REGNUM; i++)
-    {
-      if (regnum == i || regnum == -1)
-       regcache_raw_supply (regcache, i, regs + i * 8);
-    }
-
-  if (regnum == ALPHA_PC_REGNUM || regnum == -1)
-    regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
-}
-
-/* Supply register REGNUM from the buffer specified by GREGS and LEN
-   in the general-purpose register set REGSET to register cache
-   REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
-
-static void
 alphanbsd_aout_supply_gregset (const struct regset *regset,
                               struct regcache *regcache,
                               int regnum, const void *gregs, size_t len)
@@ -136,6 +112,34 @@ alphanbsd_aout_supply_gregset (const struct regset *regset,
     }
 }
 
+/* Supply register REGNUM from the buffer specified by GREGS and LEN
+   in the general-purpose register set REGSET to register cache
+   REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
+
+static void
+alphanbsd_supply_gregset (const struct regset *regset,
+                         struct regcache *regcache,
+                         int regnum, const void *gregs, size_t len)
+{
+  const gdb_byte *regs = gregs;
+  int i;
+
+  if (len >= ALPHANBSD_SIZEOF_GREGS + ALPHANBSD_SIZEOF_FPREGS)
+    {
+      alphanbsd_aout_supply_gregset (regset, regcache, regnum, gregs, len);
+      return;
+    }
+
+  for (i = 0; i < ALPHA_ZERO_REGNUM; i++)
+    {
+      if (regnum == i || regnum == -1)
+       regcache_raw_supply (regcache, i, regs + i * 8);
+    }
+
+  if (regnum == ALPHA_PC_REGNUM || regnum == -1)
+    regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
+}
+
 /* NetBSD/alpha register sets.  */
 
 static const struct regset alphanbsd_gregset =
@@ -150,31 +154,16 @@ static const struct regset alphanbsd_fpregset =
   alphanbsd_supply_fpregset
 };
 
-static const struct regset alphanbsd_aout_gregset =
-{
-  NULL,
-  alphanbsd_aout_supply_gregset
-};
-
-/* Return the appropriate register set for the core section identified
-   by SECT_NAME and SECT_SIZE.  */
+/* Iterate over supported core file register note sections. */
 
-const struct regset *
-alphanbsd_regset_from_core_section (struct gdbarch *gdbarch,
-                                   const char *sect_name, size_t sect_size)
+void
+alphanbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
+                                       iterate_over_regset_sections_cb *cb,
+                                       void *cb_data,
+                                       const struct regcache *regcache)
 {
-  if (strcmp (sect_name, ".reg") == 0 && sect_size >= ALPHANBSD_SIZEOF_GREGS)
-    {
-      if (sect_size >= ALPHANBSD_SIZEOF_GREGS + ALPHANBSD_SIZEOF_FPREGS)
-       return &alphanbsd_aout_gregset;
-      else
-       return &alphanbsd_gregset;
-    }
-
-  if (strcmp (sect_name, ".reg2") == 0 && sect_size >= ALPHANBSD_SIZEOF_FPREGS)
-    return &alphanbsd_fpregset;
-
-  return NULL;
+  cb (".reg", ALPHANBSD_SIZEOF_GREGS, &alphanbsd_gregset, NULL, cb_data);
+  cb (".reg2", ALPHANBSD_SIZEOF_FPREGS, &alphanbsd_fpregset, NULL, cb_data);
 }
 \f
 
@@ -283,8 +272,8 @@ alphanbsd_init_abi (struct gdbarch_info info,
   tdep->jb_pc = 2;
   tdep->jb_elt_size = 8;
 
-  set_gdbarch_regset_from_core_section
-    (gdbarch, alphanbsd_regset_from_core_section);
+  set_gdbarch_iterate_over_regset_sections
+    (gdbarch, alphanbsd_iterate_over_regset_sections);
 }
 \f
 
index 5c2a8b0..fcddd3a 100644 (file)
@@ -121,8 +121,8 @@ alphaobsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->jb_pc = 2;
   tdep->jb_elt_size = 8;
 
-  set_gdbarch_regset_from_core_section
-    (gdbarch, alphanbsd_regset_from_core_section);
+  set_gdbarch_iterate_over_regset_sections
+    (gdbarch, alphanbsd_iterate_over_regset_sections);
 }
 \f