This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[patch rfc rfa:i386] Add i386 specific register groups
- From: Andrew Cagney <ac131313 at redhat dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Fri, 08 Nov 2002 12:53:16 -0500
- Subject: [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 *);