Use a constructor function to create regset structures.
authorJim Blandy <jimb@codesourcery.com>
Thu, 20 May 2004 00:53:06 +0000 (00:53 +0000)
committerJim Blandy <jimb@codesourcery.com>
Thu, 20 May 2004 00:53:06 +0000 (00:53 +0000)
* regset.h (supply_regset_ftype, collect_regset_ftype): New typedefs.
(struct regset): Use supply_regset_ftype.  Add new
'collect_regset' member.
(regset_xmalloc): New declaration.
* regset.c: New file.
* am64-tdep.c (amd64_regset_from_core_section): Use
regset_xmalloc to construct regset structures.
* amd64obsd-tdep.c (amd64obsd_regset_from_core_section): Same.
* i386-tdep.c (i386_regset_from_core_section): Same.
* i386nbsd-tdep.c (i386nbsd_aout_regset_from_core_section): Same.
* i386obsd-tdep.c (i386obsd_aout_regset_from_core_section): Same.
* sparc64fbsd-tdep.c (sparc64fbsd_init_abi): Same.
* sparc64nbsd-tdep.c (sparc64nbsd_init_abi): Same.
* sparc64obsd-tdep.c (sparc64obsd_init_abi): Same.
* sparcnbsd-tdep.c (sparc32nbsd_init_abi): Same.
* Makefile.in (COMMON_OBS): Add regset.o.
(regset.o): New rule.

13 files changed:
gdb/ChangeLog
gdb/Makefile.in
gdb/amd64-tdep.c
gdb/amd64obsd-tdep.c
gdb/i386-tdep.c
gdb/i386nbsd-tdep.c
gdb/i386obsd-tdep.c
gdb/regset.c [new file with mode: 0644]
gdb/regset.h
gdb/sparc64fbsd-tdep.c
gdb/sparc64nbsd-tdep.c
gdb/sparc64obsd-tdep.c
gdb/sparcnbsd-tdep.c

index 6de6b221531b86b58fda4361d9e74430c2ef48da..f73a2d9a1febcfe1b7e9eb6c203957582afd333c 100644 (file)
@@ -1,15 +1,29 @@
+2004-05-19  Jim Blandy  <jimb@redhat.com>
+
+       Use a constructor function to create regset structures.
+       * regset.h (supply_regset_ftype, collect_regset_ftype): New typedefs.
+       (struct regset): Use supply_regset_ftype.  Add new
+        'collect_regset' member.
+       (regset_xmalloc): New declaration.
+       * regset.c: New file.
+       * am64-tdep.c (amd64_regset_from_core_section): Use
+       regset_xmalloc to construct regset structures.
+       * amd64obsd-tdep.c (amd64obsd_regset_from_core_section): Same.
+       * i386-tdep.c (i386_regset_from_core_section): Same.
+       * i386nbsd-tdep.c (i386nbsd_aout_regset_from_core_section): Same.
+       * i386obsd-tdep.c (i386obsd_aout_regset_from_core_section): Same.
+       * sparc64fbsd-tdep.c (sparc64fbsd_init_abi): Same.
+       * sparc64nbsd-tdep.c (sparc64nbsd_init_abi): Same.
+       * sparc64obsd-tdep.c (sparc64obsd_init_abi): Same.
+       * sparcnbsd-tdep.c (sparc32nbsd_init_abi): Same.
+       * Makefile.in (COMMON_OBS): Add regset.o.
+       (regset.o): New rule.
+
 2004-05-19  Joel Brobecker  <brobecker@gnat.com>
 
        * config/djgpp/fnchange.lst: Add entries for pthread_cond_wait.exp
        and pthread_cond_wait.c.
 
-2004-05-18  Jim Blandy  <jimb@redhat.com>
-
-       * rs6000-tdep.c (rs6000_gdbarch_init): Initialize tdep fields
-       before the mach-specific switch, and then let the individual cases
-       override the defaults, rather than leaving them uninitialized
-       until the switch and then setting them in each case.
-
 2004-05-18  Randolph Chung  <tausq@debian.org>
 
        * hppa-tdep.c (hppa_frame_cache): Check for validity of r31 for
index 8c0813fd7499e4ef89a07fbadb26abc7f6b30c04..effe5c1d6b63f8e50bcff3a70c10303d3c233e6f 100644 (file)
@@ -910,7 +910,7 @@ COMMON_OBS = $(DEPFILES) $(YYOBJ) \
        frame-base.o \
        gnu-v2-abi.o gnu-v3-abi.o hpacc-abi.o cp-abi.o cp-support.o \
        cp-namespace.o \
-       reggroups.o \
+       reggroups.o regset.o \
        trad-frame.o \
        tramp-frame.o
 
@@ -2197,6 +2197,7 @@ regcache.o: regcache.c $(defs_h) $(inferior_h) $(target_h) $(gdbarch_h) \
        $(gdb_string_h) $(gdbcmd_h) $(observer_h)
 reggroups.o: reggroups.c $(defs_h) $(reggroups_h) $(gdbtypes_h) \
        $(gdb_assert_h) $(regcache_h) $(command_h) $(gdbcmd_h)
+regset.o: regset.c $(defs_h) $(regset_h) $(gdb_assert_h)
 remote.o: remote.c $(defs_h) $(gdb_string_h) $(inferior_h) $(bfd_h) \
        $(symfile_h) $(target_h) $(gdbcmd_h) $(objfiles_h) $(gdb_stabs_h) \
        $(gdbthread_h) $(remote_h) $(regcache_h) $(value_h) $(gdb_assert_h) \
index 0a85a236e1ef3b9c41917523f78f92972afc0c27..a326811f11d3ef3efd65d457fe7d42e5677843b2 100644 (file)
@@ -1074,11 +1074,7 @@ amd64_regset_from_core_section (struct gdbarch *gdbarch,
   if (strcmp (sect_name, ".reg2") == 0 && sect_size == tdep->sizeof_fpregset)
     {
       if (tdep->fpregset == NULL)
-       {
-         tdep->fpregset = XMALLOC (struct regset);
-         tdep->fpregset->descr = tdep;
-         tdep->fpregset->supply_regset = amd64_supply_fpregset;
-       }
+        tdep->fpregset = regset_xmalloc (tdep, amd64_supply_fpregset, NULL);
 
       return tdep->fpregset;
     }
index f9e0f69fe6ec9a627ddfc21ccad1d2d5e4dd01b8..5ded31d8a05f423709fce2803bb70dbc69ae49b9 100644 (file)
@@ -63,11 +63,7 @@ amd64obsd_regset_from_core_section (struct gdbarch *gdbarch,
       && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FXSAVE)
     {
       if (tdep->gregset == NULL)
-       {
-         tdep->gregset = XMALLOC (struct regset);
-         tdep->gregset->descr = tdep;
-         tdep->gregset->supply_regset = amd64obsd_supply_regset;
-       }
+        tdep->gregset = regset_xmalloc (tdep, amd64obsd_supply_regset, NULL);
       return tdep->gregset;
     }
 
index 5f3952931fe31e22f2dc142737385229d7f95eef..99810598dbfb64a110b16e2c0cd74f30c078b66a 100644 (file)
@@ -1662,11 +1662,7 @@ i386_regset_from_core_section (struct gdbarch *gdbarch,
   if (strcmp (sect_name, ".reg") == 0 && sect_size == tdep->sizeof_gregset)
     {
       if (tdep->gregset == NULL)
-       {
-         tdep->gregset = XMALLOC (struct regset);
-         tdep->gregset->descr = tdep;
-         tdep->gregset->supply_regset = i386_supply_gregset;
-       }
+        tdep->gregset = regset_xmalloc (tdep, i386_supply_gregset, NULL);
       return tdep->gregset;
     }
 
@@ -1675,11 +1671,7 @@ i386_regset_from_core_section (struct gdbarch *gdbarch,
          && sect_size == I387_SIZEOF_FXSAVE))
     {
       if (tdep->fpregset == NULL)
-       {
-         tdep->fpregset = XMALLOC (struct regset);
-         tdep->fpregset->descr = tdep;
-         tdep->fpregset->supply_regset = i386_supply_fpregset;
-       }
+        tdep->fpregset = regset_xmalloc (tdep, i386_supply_fpregset, NULL);
       return tdep->fpregset;
     }
 
index 9fd98839db9b4c0bd4893d036e81f8fab4a46c73..53dbe8af2abed3034b2087ec0ca05c1ee7716a82 100644 (file)
@@ -86,11 +86,8 @@ i386nbsd_aout_regset_from_core_section (struct gdbarch *gdbarch,
       && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE)
     {
       if (tdep->gregset == NULL)
-       {
-         tdep->gregset = XMALLOC (struct regset);
-         tdep->gregset->descr = tdep;
-         tdep->gregset->supply_regset = i386nbsd_aout_supply_regset;
-       }
+        tdep->gregset
+          = regset_xmalloc (tdep, i386nbsd_aout_supply_regset, NULL);
       return tdep->gregset;
     }
 
index 0fe066fa20d88da17ad72f450e3048f1ea07b5bc..a21faabab821c785d8b2bfa6403aa83ebf7c5c43 100644 (file)
@@ -141,11 +141,8 @@ i386obsd_aout_regset_from_core_section (struct gdbarch *gdbarch,
       && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FSAVE)
     {
       if (tdep->gregset == NULL)
-       {
-         tdep->gregset = XMALLOC (struct regset);
-         tdep->gregset->descr = tdep;
-         tdep->gregset->supply_regset = i386obsd_aout_supply_regset;
-       }
+        tdep->gregset
+          = regset_xmalloc (tdep, i386obsd_aout_supply_regset, NULL);
       return tdep->gregset;
     }
 
diff --git a/gdb/regset.c b/gdb/regset.c
new file mode 100644 (file)
index 0000000..98fb665
--- /dev/null
@@ -0,0 +1,39 @@
+/* Regset support functions, for GDB.
+
+   Copyright 2004 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
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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.  */
+
+#include "defs.h"
+#include "regset.h"
+#include "gdb_assert.h"
+
+
+struct regset *
+regset_xmalloc (void *descr,
+                supply_regset_ftype *supply_regset,
+                collect_regset_ftype *collect_regset)
+{
+  struct regset *r = (struct regset *) xmalloc (sizeof (*r));
+
+  r->descr = descr;
+  r->supply_regset = supply_regset;
+  r->collect_regset = collect_regset;
+
+  return r;
+}
index 6172f0fecfd21696a3bbd648f055b98c23870d68..1d4355c5943c717669511c18005291b1a5a076ed 100644 (file)
@@ -26,6 +26,11 @@ struct gdbarch;
 struct regcache;
 
 /* Data structure describing a register set.  */
+typedef void (supply_regset_ftype) (const struct regset *, struct regcache *,
+                                    int, const void *, size_t);
+typedef void (collect_regset_ftype) (const struct regset *, 
+                                     const struct regcache *,
+                                     int, const void *, size_t);
 
 struct regset
 {
@@ -33,9 +38,23 @@ struct regset
      providing some sort of description of the register set.  */
   const void *descr;
 
-  /* Function supplying a register set to a register cache.  */
-  void (*supply_regset) (const struct regset *, struct regcache *,
-                        int, const void *, size_t);
+  /* Function supplying values in a register set to a register cache.  */
+  supply_regset_ftype *supply_regset;
+
+  /* Function collecting values in a register set from a register cache.  */
+  collect_regset_ftype *collect_regset;
 };
 
+
+/* Allocate a fresh 'struct regset' whose descr is DESCR, whose
+   supply_regset function is SUPPLY_REGSET, and whose collect_regset
+   function is COLLECT_REGSET.  If the regset has no collect function,
+   pass NULL for COLLECT_REGSET.
+
+   The object returned is allocated using xmalloc.  */
+extern struct regset *regset_xmalloc (void *descr,
+                                      supply_regset_ftype *supply_regset,
+                                      collect_regset_ftype *collect_regset);
+
+
 #endif /* regset.h */
index 6532a5f5df1f0bfc7a06220c6f6a0c35d9f36099..7864ffa0ccec4191b986a90e57e56ce11d9516e8 100644 (file)
@@ -199,13 +199,11 @@ sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  tdep->gregset = XMALLOC (struct regset);
-  tdep->gregset->descr = &sparc64fbsd_gregset;
-  tdep->gregset->supply_regset = sparc64fbsd_supply_gregset;
+  tdep->gregset
+    = regset_xmalloc (&sparc64fbsd_gregset, sparc64fbsd_supply_gregset, NULL);
   tdep->sizeof_gregset = 256;
 
-  tdep->fpregset = XMALLOC (struct regset);
-  tdep->fpregset->supply_regset = sparc64fbsd_supply_fpregset;
+  tdep->fpregset = regset_xmalloc (NULL, sparc64fbsd_supply_fpregset, NULL);
   tdep->sizeof_fpregset = 272;
 
   frame_unwind_append_sniffer (gdbarch, sparc64fbsd_sigtramp_frame_sniffer);
index 1c30a7a156343b3c979d2084af2ab82b511cda90..25a0074298cf8c92e82a624fcb1ed15bd5a67b8d 100644 (file)
@@ -226,13 +226,11 @@ sparc64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  tdep->gregset = XMALLOC (struct regset);
-  tdep->gregset->descr = &sparc64nbsd_gregset;
-  tdep->gregset->supply_regset = sparc64nbsd_supply_gregset;
+  tdep->gregset
+    = regset_xmalloc (&sparc64nbsd_gregset, sparc64nbsd_supply_gregset, NULL);
   tdep->sizeof_gregset = 160;
 
-  tdep->fpregset = XMALLOC (struct regset);
-  tdep->fpregset->supply_regset = sparc64nbsd_supply_fpregset;
+  tdep->fpregset = regset_xmalloc (NULL, sparc64nbsd_supply_fpregset, NULL);
   tdep->sizeof_fpregset = 272;
 
   frame_unwind_append_sniffer (gdbarch, sparc64nbsd_sigtramp_frame_sniffer);
index fa0ab4dc9bd0e869efa7ed38f3fed3db2a35ac78..b6bd88c1e055751bb4a21250edabe116884ef941 100644 (file)
@@ -184,9 +184,9 @@ sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  tdep->gregset = XMALLOC (struct regset);
-  tdep->gregset->descr = &sparc64obsd_core_gregset;
-  tdep->gregset->supply_regset = sparc64obsd_supply_gregset;
+  tdep->gregset = regset_xmalloc (&sparc64obsd_core_gregset, 
+                                  sparc64obsd_supply_gregset,
+                                  NULL);
   tdep->sizeof_gregset = 832;
 
   frame_unwind_append_sniffer (gdbarch, sparc64obsd_sigtramp_frame_sniffer);
index 43a8e9de3d620d09b60bd721057b4c40130c9b7a..ab6003cbb0f2f313702abbcb32394d54dc0cb9aa 100644 (file)
@@ -274,13 +274,11 @@ sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_long_double_bit (gdbarch, 64);
   set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_big);
 
-  tdep->gregset = XMALLOC (struct regset);
-  tdep->gregset->descr = &sparc32nbsd_gregset;
-  tdep->gregset->supply_regset = sparc32nbsd_supply_gregset;
+  tdep->gregset
+    = regset_xmalloc (&sparc32nbsd_gregset, sparc32nbsd_supply_gregset, NULL);
   tdep->sizeof_gregset = 20 * 4;
 
-  tdep->fpregset = XMALLOC (struct regset);
-  tdep->fpregset->supply_regset = sparc32nbsd_supply_fpregset;
+  tdep->fpregset = regset_xmalloc (NULL, sparc32nbsd_supply_fpregset, NULL);
   tdep->sizeof_fpregset = 33 * 4;
 
   frame_unwind_append_sniffer (gdbarch, sparc32nbsd_sigtramp_frame_sniffer);