2002-11-08 Andrew Cagney <ac131313@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 8 Nov 2002 23:59:58 +0000 (23:59 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 8 Nov 2002 23:59:58 +0000 (23:59 +0000)
* i386-linux-tdep.c: Include "reggroups.h".
(i386_linux_register_reggroup_p): New function.
(i386_linux_init_abi): Set register_reggroup_p to
i386_linux_register_reggroup_p.
* i386-tdep.h (i386_register_reggroup_p): Declare.
* i386-tdep.c: Include "reggroups.h".
(i386_init_reggroups): New function.
(i386_add_reggroups): New function.
(i386_register_reggroup_p): New function.
(i386_sse_reggroup, i386_mmx_reggroup): New variables.
(_initialize_i386_tdep): Call i386_init_reggroups.
(i386_gdbarch_init): Set register_reggroup_p and add in the i386
specific reggroups.

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

index 8f8ad2c2d4c03237f9675cc12846f5b9fb104873..1104a5abd3d50f37a8887643d0321449a1a81d68 100644 (file)
@@ -1,3 +1,19 @@
+2002-11-08  Andrew Cagney  <ac131313@redhat.com>
+
+       * i386-linux-tdep.c: Include "reggroups.h".
+       (i386_linux_register_reggroup_p): New function.
+       (i386_linux_init_abi): Set register_reggroup_p to
+       i386_linux_register_reggroup_p.
+       * i386-tdep.h (i386_register_reggroup_p): Declare.
+       * i386-tdep.c: Include "reggroups.h".
+       (i386_init_reggroups): New function.
+       (i386_add_reggroups): New function.
+       (i386_register_reggroup_p): New function.
+       (i386_sse_reggroup, i386_mmx_reggroup): New variables.
+       (_initialize_i386_tdep): Call i386_init_reggroups.
+       (i386_gdbarch_init): Set register_reggroup_p and add in the i386
+       specific reggroups.
+
 2002-11-09  Mark Kettenis  <kettenis@gnu.org>
 
        * infptrace.c (child_xfer_memory): Make use of the new PT_IO
index 0d6ab40747a15c0827a5b8ea8f26b7dd3ae22010..f35c4ff9f874f02ecb18248fe9aac9692819451f 100644 (file)
@@ -25,6 +25,7 @@
 #include "value.h"
 #include "regcache.h"
 #include "inferior.h"
+#include "reggroups.h"
 
 /* For i386_linux_skip_solib_resolver.  */
 #include "symtab.h"
@@ -47,6 +48,20 @@ i386_linux_register_name (int reg)
 
   return i386_register_name (reg);
 }
+
+/* Return non-zero, when the register is in the corresponding register
+   group.  Put the LINUX_ORIG_EAX register in the system group.  */
+static int
+i386_linux_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
+                               struct reggroup *group)
+{
+  if (regnum == I386_LINUX_ORIG_EAX_REGNUM)
+    return (group == system_reggroup
+           || group == save_reggroup
+           || group == restore_reggroup);
+  return i386_register_reggroup_p (gdbarch, regnum, group);
+}
+
 \f
 /* Recognizing signal handler frames.  */
 
@@ -442,6 +457,7 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_write_pc (gdbarch, i386_linux_write_pc);
   set_gdbarch_num_regs (gdbarch, I386_SSE_NUM_REGS + 1);
   set_gdbarch_register_name (gdbarch, i386_linux_register_name);
+  set_gdbarch_register_reggroup_p (gdbarch, i386_linux_register_reggroup_p);
   set_gdbarch_register_bytes (gdbarch, I386_SSE_SIZEOF_REGS + 4);
 
   tdep->jb_pc_offset = 20;     /* From <bits/setjmp.h>.  */
index 3c12c7003f1138a83bc1c4c0484ea996ada02dd5..d658e3ab26b04992f1044d4f5ee65b75faa85d8b 100644 (file)
@@ -37,6 +37,7 @@
 #include "doublest.h"
 #include "value.h"
 #include "gdb_assert.h"
+#include "reggroups.h"
 
 #include "i386-tdep.h"
 #include "i387-tdep.h"
@@ -1443,6 +1444,56 @@ i386_nw_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 }
 \f
 
+/* i386 register groups.  In addition to the normal groups, add "mmx"
+   and "sse".  */
+
+static struct reggroup *i386_sse_reggroup;
+static struct reggroup *i386_mmx_reggroup;
+
+static void
+i386_init_reggroups (void)
+{
+  i386_sse_reggroup = reggroup_new ("sse", USER_REGGROUP);
+  i386_mmx_reggroup = reggroup_new ("mmx", USER_REGGROUP);
+}
+
+static void
+i386_add_reggroups (struct gdbarch *gdbarch)
+{
+  reggroup_add (gdbarch, i386_sse_reggroup);
+  reggroup_add (gdbarch, i386_mmx_reggroup);
+  reggroup_add (gdbarch, general_reggroup);
+  reggroup_add (gdbarch, float_reggroup);
+  reggroup_add (gdbarch, all_reggroup);
+  reggroup_add (gdbarch, save_reggroup);
+  reggroup_add (gdbarch, restore_reggroup);
+  reggroup_add (gdbarch, vector_reggroup);
+  reggroup_add (gdbarch, system_reggroup);
+}
+
+int
+i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
+                         struct reggroup *group)
+{
+  int sse_regnum_p = (i386_sse_regnum_p (regnum)
+                     || i386_mxcsr_regnum_p (regnum));
+  int fp_regnum_p = (i386_fp_regnum_p (regnum)
+                    || i386_fpc_regnum_p (regnum));
+  int mmx_regnum_p = (i386_mmx_regnum_p (regnum));
+  if (group == i386_mmx_reggroup)
+    return mmx_regnum_p;
+  if (group == i386_sse_reggroup)
+    return sse_regnum_p;
+  if (group == vector_reggroup)
+    return (mmx_regnum_p || sse_regnum_p);
+  if (group == float_reggroup)
+    return fp_regnum_p;
+  if (group == general_reggroup)
+    return (!fp_regnum_p && !mmx_regnum_p && !sse_regnum_p);
+  return default_register_reggroup_p (gdbarch, regnum, group);
+}
+
+\f
 static struct gdbarch *
 i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
@@ -1601,6 +1652,10 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   set_gdbarch_print_insn (gdbarch, i386_print_insn);
 
+  /* Add the i386 register groups.  */
+  i386_add_reggroups (gdbarch);
+  set_gdbarch_register_reggroup_p (gdbarch, i386_register_reggroup_p);
+
   /* Hook in ABI-specific overrides, if they have been registered.  */
   gdbarch_init_osabi (info, gdbarch, osabi);
 
@@ -1671,4 +1726,7 @@ are \"default\", \"pcc\" and \"reg\", and the default value is \"default\".",
                          i386_go32_init_abi);
   gdbarch_register_osabi (bfd_arch_i386, GDB_OSABI_NETWARE,
                          i386_nw_init_abi);
+
+  /* Initialize the i386 specific register groups.  */
+  i386_init_reggroups ();
 }
index 5980617acea9622e5805324f6ccef3d6f7a5a7cf..627cb0a974e7d6840bed6b9d049b0eab7132cd67 100644 (file)
@@ -167,6 +167,10 @@ extern int i386_frameless_signal_p (struct frame_info *frame);
 /* Return the name of register REG.  */
 extern char const *i386_register_name (int reg);
 
+/* Return non-zero if REGNUM is a member of the specified group.  */
+extern int i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
+                                    struct reggroup *group);
+
 /* Initialize a basic ELF architecture variant.  */
 extern void i386_elf_init_abi (struct gdbarch_info, struct gdbarch *);