* i386-tdep.c (i386_regset_from_core_section): New function.
authorMark Kettenis <kettenis@gnu.org>
Sat, 11 Oct 2003 13:50:25 +0000 (13:50 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 11 Oct 2003 13:50:25 +0000 (13:50 +0000)
(i386_gdbarch_init): Initialize regset_from_core_section if
appropriate.
* i386-tdep.h (i386_regset_from_core_section): New declaration.

gdb/ChangeLog
gdb/i386-tdep.c
gdb/i386-tdep.h

index 3c9e0823b010e109c96bb90962f27709f3b0eb75..c391bf31644b380cab5d04f3c7a12f9c3a922821 100644 (file)
@@ -1,5 +1,10 @@
 2003-10-11  Mark Kettenis  <kettenis@gnu.org>
 
+       * i386-tdep.c (i386_regset_from_core_section): New function.
+       (i386_gdbarch_init): Initialize regset_from_core_section if
+       appropriate.
+       * i386-tdep.h (i386_regset_from_core_section): New declaration.
+
        * i386-tdep.h (struct regset): Declare opaque.
 
        * gdbarch.sh (regset_from_core_section): New method.
index d2baa75404b2c3425026336938ef19aa65d63677..21721de6d3b0d1060ec97f32842a26b537c898fb 100644 (file)
@@ -1587,6 +1587,40 @@ i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
   gdb_assert (len == tdep->sizeof_fpregset);
   i387_supply_fsave (regcache, regnum, fpregs);
 }
+
+/* Return the appropriate register set for the core section identified
+   by SECT_NAME and SECT_SIZE.  */
+
+const struct regset *
+i386_regset_from_core_section (struct gdbarch *gdbarch,
+                              const char *sect_name, size_t sect_size)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (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;
+       }
+      return tdep->gregset;
+    }
+
+  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 = i386_supply_fpregset;
+       }
+      return tdep->fpregset;
+    }
+
+  return NULL;
+}
 \f
 
 #ifdef STATIC_TRANSFORM_NAME
@@ -1977,6 +2011,13 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   frame_unwind_append_sniffer (gdbarch, i386_sigtramp_frame_sniffer);
   frame_unwind_append_sniffer (gdbarch, i386_frame_sniffer);
 
+  /* If we have a register mapping, enable the generic core file
+     support, unless it has already been enabled.  */
+  if (tdep->gregset_reg_offset
+      && !gdbarch_regset_from_core_section_p (gdbarch))
+    set_gdbarch_regset_from_core_section (gdbarch,
+                                         i386_regset_from_core_section);
+
   /* Unless support for MMX has been disabled, make %mm0 the first
      pseudo-register.  */
   if (tdep->mm0_regnum == 0)
index b4309501e855380d4cbb17c8f99fb9c5f6247176..59668d6b60835cf42c2e67a5bfe59bfa5e990d6f 100644 (file)
@@ -189,6 +189,12 @@ extern char const *i386_register_name (int reg);
 extern int i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
                                     struct reggroup *group);
 
+/* Return the appropriate register set for the core section identified
+   by SECT_NAME and SECT_SIZE.  */
+extern const struct regset *
+  i386_regset_from_core_section (struct gdbarch *gdbarch,
+                                const char *sect_name, size_t sect_size);
+
 /* Initialize a basic ELF architecture variant.  */
 extern void i386_elf_init_abi (struct gdbarch_info, struct gdbarch *);