This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch rfc rfa:i386] Add i386 specific register groups


Hello,

The attached patch adds two i386 specific register groups:

+struct reggroup *i386_sse_reggroup;
+struct reggroup *i386_mmx_reggroup;

(hmm, I'll make them static :-) The registers are then distributed according to the attached output.

I should note that the orig_eax register is only a member of the system, save and restore reggroups, and hence is no longer displayed by either `info registers' or `info all-registers'. If you're really desperate you can use the `maint print raw-registers` (which is in the manual :-)

This ok?

--

At a more general level, the current mechanism for adding register groups requires the architecture add all relevant groups explicitly vis:

+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);
+}

this could be changed so that there is a standard pre-defined set, architectures only needing to add architecture specific groups.

Thoughts?

Andrew
(top-gdb) maint print register-groups 
 Name         Nr  Rel Offset    Size  Type            Groups
 eax           0    0      0       4  int             general,all,save,restore
 ecx           1    1      4       4  int             general,all,save,restore
 edx           2    2      8       4  int             general,all,save,restore
 ebx           3    3     12       4  int             general,all,save,restore
 esp           4    4     16       4  *1              general,all,save,restore
 ebp           5    5     20       4  *1              general,all,save,restore
 esi           6    6     24       4  int             general,all,save,restore
 edi           7    7     28       4  int             general,all,save,restore
 eip           8    8     32       4  *1              general,all,save,restore
 eflags        9    9     36       4  int             general,all,save,restore
 cs           10   10     40       4  int             general,all,save,restore
 ss           11   11     44       4  int             general,all,save,restore
 ds           12   12     48       4  int             general,all,save,restore
 es           13   13     52       4  int             general,all,save,restore
 fs           14   14     56       4  int             general,all,save,restore
 gs           15   15     60       4  int             general,all,save,restore
 st0          16   16     64      10  _i387_ext       general,float,all,save,restore
 st1          17   17     74      10  _i387_ext       general,float,all,save,restore
 st2          18   18     84      10  _i387_ext       general,float,all,save,restore
 st3          19   19     94      10  _i387_ext       general,float,all,save,restore
 st4          20   20    104      10  _i387_ext       general,float,all,save,restore
 st5          21   21    114      10  _i387_ext       general,float,all,save,restore
 st6          22   22    124      10  _i387_ext       general,float,all,save,restore
 st7          23   23    134      10  _i387_ext       general,float,all,save,restore
 fctrl        24   24    144       4  int             general,float,all,save,restore
 fstat        25   25    148       4  int             general,float,all,save,restore
 ftag         26   26    152       4  int             general,float,all,save,restore
 fiseg        27   27    156       4  int             general,float,all,save,restore
 fioff        28   28    160       4  int             general,float,all,save,restore
 foseg        29   29    164       4  int             general,float,all,save,restore
 fooff        30   30    168       4  int             general,float,all,save,restore
 fop          31   31    172       4  int             general,float,all,save,restore
 xmm0         32   32    176      16  _vec128i        sse,general,all,save,restore,vector
 xmm1         33   33    192      16  _vec128i        sse,general,all,save,restore,vector
 xmm2         34   34    208      16  _vec128i        sse,general,all,save,restore,vector
 xmm3         35   35    224      16  _vec128i        sse,general,all,save,restore,vector
 xmm4         36   36    240      16  _vec128i        sse,general,all,save,restore,vector
 xmm5         37   37    256      16  _vec128i        sse,general,all,save,restore,vector
 xmm6         38   38    272      16  _vec128i        sse,general,all,save,restore,vector
 xmm7         39   39    288      16  _vec128i        sse,general,all,save,restore,vector
 mxcsr        40   40    304       4  int             sse,general,all,save,restore,vector
 orig_eax     41   41    308       4  int             save,restore,system
 mm0          42    0    312       8  _vec64i         mmx,general,all,vector
 mm1          43    1    320       8  _vec64i         mmx,general,all,vector
 mm2          44    2    328       8  _vec64i         mmx,general,all,vector
 mm3          45    3    336       8  _vec64i         mmx,general,all,vector
 mm4          46    4    344       8  _vec64i         mmx,general,all,vector
 mm5          47    5    352       8  _vec64i         mmx,general,all,vector
 mm6          48    6    360       8  _vec64i         mmx,general,all,vector
 mm7          49    7    368       8  _vec64i         mmx,general,all,vector
*1: Register type's name NULL.
(top-gdb) 
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.

Index: i386-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-tdep.c,v
retrieving revision 1.18
diff -u -r1.18 i386-linux-tdep.c
--- i386-linux-tdep.c	31 Oct 2002 20:51:15 -0000	1.18
+++ i386-linux-tdep.c	8 Nov 2002 17:39:47 -0000
@@ -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 @@
 
   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);
+}
+
 
 /* Recognizing signal handler frames.  */
 
@@ -442,6 +457,7 @@
   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: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.92
diff -u -r1.92 i386-tdep.c
--- i386-tdep.c	8 Nov 2002 16:52:37 -0000	1.92
+++ i386-tdep.c	8 Nov 2002 17:39:47 -0000
@@ -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 register groups.  In addition to the normal groups, add "mmx"
+   and "sse".  */
+
+struct reggroup *i386_sse_reggroup;
+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 1;
+  return default_register_reggroup_p (gdbarch, regnum, group);
+}
+
+
 static struct gdbarch *
 i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
@@ -1601,6 +1652,10 @@
 
   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 @@
 			  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: i386-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.h,v
retrieving revision 1.16
diff -u -r1.16 i386-tdep.h
--- i386-tdep.h	8 Nov 2002 17:03:27 -0000	1.16
+++ i386-tdep.h	8 Nov 2002 17:39:47 -0000
@@ -167,6 +167,10 @@
 /* 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 *);
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]