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/sysregs branch] Use reggroups to identify save/restore registers


Hello,

The attached re-implements the register save/restore code (used across inferior function calls) so that reggroups, instead of iterators, are used to identify which registers should be saved or restored.

It has the single advantage of being able to enter:

(gdb) maint print registers

and instantly see which registers are saved/restored across dummy frames.

Beyond that, does anyone have comments about this alternative way of iterating over the registers?

Andrew
2002-09-13  Andrew Cagney  <cagney@redhat.com>

	* i386-tdep.c (i386_add_reggroups): Add save_reggroup and
	restore_reggroup.
	(i386_register_reggroup_p): Rewrite.  Use
	default_register_reggroup_p.

	* reggroups.h (save_reggroup, restore_reggroup): Declare.
	* reggroups.c (save_reggroup, restore_reggroup): Define.
	(_initialize_reggroup): Add save_reggroup and restore_reggroup to
	default_groups.
	* regcache.c (regcache_restore): Restore the registers in
	restore_reggroup.
	(regcache_save): Save registers in save_reggroup.

Index: i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.84.4.2
diff -u -r1.84.4.2 i386-tdep.c
--- i386-tdep.c	29 Aug 2002 03:25:04 -0000	1.84.4.2
+++ i386-tdep.c	13 Sep 2002 18:01:34 -0000
@@ -1435,6 +1435,8 @@
   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);
 }
@@ -1443,17 +1445,21 @@
 i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
 			  struct reggroup *group)
 {
-  if (group == all_reggroup)
-    return 1;
-  if (mmx_regnum_p (regnum))
-    return (group == i368_mmx_reggroup || group == vector_reggroup);
-  if (FP_REGNUM_P (regnum) || FPC_REGNUM_P (regnum))
-    return (group == float_reggroup || group == all_reggroup);
-  if (SSE_REGNUM_P (regnum) || regnum == MXCSR_REGNUM)
-    return (group == i368_sse_reggroup || group == vector_reggroup);
+  int sse_regnum_p = SSE_REGNUM_P (regnum) || regnum == MXCSR_REGNUM;
+  int fp_regnum_p = FP_REGNUM_P (regnum) || FPC_REGNUM_P (regnum);
+  if (group == i368_mmx_reggroup)
+    return mmx_regnum_p (regnum);
+  if (group == i368_sse_reggroup)
+    return sse_regnum_p;
+  if (group == vector_reggroup)
+    return (mmx_regnum_p (regnum) || sse_regnum_p);
+  if (group == float_reggroup)
+    return (FP_REGNUM_P (regnum) || FPC_REGNUM_P (regnum));
   if (group == general_reggroup)
     return 1;
-  return 0;
+  if (group == save_reggroup || group == restore_reggroup)
+    return (regnum < NUM_REGS);
+  return default_register_reggroup_p (gdbarch, regnum, group);
 }
 
 
Index: regcache.c
===================================================================
RCS file: /cvs/src/src/gdb/regcache.c,v
retrieving revision 1.57.2.2
diff -u -r1.57.2.2 regcache.c
--- regcache.c	26 Aug 2002 19:57:39 -0000	1.57.2.2
+++ regcache.c	13 Sep 2002 18:01:34 -0000
@@ -337,14 +337,15 @@
   memset (dst->registers, 0, dst->descr->sizeof_registers);
   memset (dst->register_valid_p, 0, dst->descr->sizeof_register_valid_p);
   /* Copy over any relevant registers.  */
-  for (regnum = gdbarch_next_cooked_register_to_save (gdbarch, -1);
-       regnum >= 0;
-       regnum = gdbarch_next_cooked_register_to_save (gdbarch, regnum))
+  for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
     {
-      regcache_cooked_read (src, regnum, buf);
-      memcpy (dst->registers + dst->descr->register_offset[regnum],
-	      buf, dst->descr->sizeof_register[regnum]);
-      dst->register_valid_p[regnum] = 1;
+      if (gdbarch_register_reggroup_p (gdbarch, regnum, save_reggroup))
+	{
+	  regcache_cooked_read (src, regnum, buf);
+	  memcpy (dst->registers + dst->descr->register_offset[regnum],
+		  buf, dst->descr->sizeof_register[regnum]);
+	  dst->register_valid_p[regnum] = 1;
+	}
     }
 }
 
@@ -357,13 +358,14 @@
   gdb_assert (src->descr->gdbarch == dst->descr->gdbarch);
   gdb_assert (!dst->readonly_p);
   /* Copy over any relevant registers.  */
-  for (regnum = gdbarch_next_cooked_register_to_restore (gdbarch, -1);
-       regnum >= 0;
-       regnum = gdbarch_next_cooked_register_to_restore (gdbarch, regnum))
+  for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
     {
-      memcpy (buf, src->registers + src->descr->register_offset[regnum],
-	      src->descr->sizeof_register[regnum]);
-      regcache_cooked_write (dst, regnum, buf);
+      if (gdbarch_register_reggroup_p (gdbarch, regnum, restore_reggroup))
+	{
+	  memcpy (buf, src->registers + src->descr->register_offset[regnum],
+		  src->descr->sizeof_register[regnum]);
+	  regcache_cooked_write (dst, regnum, buf);
+	}
     }
 }
 
Index: reggroups.c
===================================================================
RCS file: /cvs/src/src/gdb/Attic/reggroups.c,v
retrieving revision 1.1.2.1
diff -u -r1.1.2.1 reggroups.c
--- reggroups.c	26 Aug 2002 19:57:39 -0000	1.1.2.1
+++ reggroups.c	13 Sep 2002 18:01:34 -0000
@@ -131,6 +131,7 @@
 {
   int vector_p;
   int float_p;
+  int raw_p;
   if (REGISTER_NAME (regnum) == NULL
       || *REGISTER_NAME (regnum) == '\0')
     return 0;
@@ -138,12 +139,15 @@
     return 1;
   vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
   float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
+  raw_p = regnum < gdbarch_num_regs (gdbarch);
   if (group == float_reggroup)
     return float_p;
   if (group == vector_reggroup)
     return vector_p;
   if (group == general_reggroup)
     return (!vector_p && !float_p);
+  if (group == save_reggroup || group == restore_reggroup)
+    return raw_p;
   return 0;   
 }
 
@@ -156,27 +160,22 @@
 struct reggroup system_group = { "system" };
 struct reggroup vector_group = { "vector" };
 struct reggroup all_group = { "all" };
+struct reggroup save_group = { "save" };
+struct reggroup restore_group = { "restore" };
 
 struct reggroup *const general_reggroup = &general_group;
 struct reggroup *const float_reggroup = &float_group;
 struct reggroup *const system_reggroup = &system_group;
 struct reggroup *const vector_reggroup = &vector_group;
 struct reggroup *const all_reggroup = &all_group;
+struct reggroup *const save_reggroup = &save_group;
+struct reggroup *const restore_reggroup = &restore_group;
 
 void
 _initialize_reggroup (void)
 {
   reggroups_data = register_gdbarch_data (reggroups_init, reggroups_free);
 
-#if 0
-  /* The pre-defined groups.  */
-  general_reggroup = reggroup_new ("general");
-  float_reggroup = reggroup_new ("float");
-  system_reggroup = reggroup_new ("system");
-  vector_reggroup = reggroup_new ("vector");
-  all_reggroup = reggroup_new ("all");
-#endif
-
   /* The pre-defined list of groups.  */
   default_groups = reggroups_init (NULL);
   add_group (default_groups, general_reggroup);
@@ -184,4 +183,6 @@
   add_group (default_groups, system_reggroup);
   add_group (default_groups, vector_reggroup);
   add_group (default_groups, all_reggroup);
+  add_group (default_groups, save_reggroup);
+  add_group (default_groups, restore_reggroup);
 }
Index: reggroups.h
===================================================================
RCS file: /cvs/src/src/gdb/Attic/reggroups.h,v
retrieving revision 1.1.2.1
diff -u -r1.1.2.1 reggroups.h
--- reggroups.h	26 Aug 2002 19:57:39 -0000	1.1.2.1
+++ reggroups.h	13 Sep 2002 18:01:34 -0000
@@ -27,12 +27,16 @@
 struct gdbarch;
 struct reggroup;
 
-/* Pre-defined register groups.  */
+/* Pre-defined, user visible, register groups.  */
 extern struct reggroup *const general_reggroup;
 extern struct reggroup *const float_reggroup;
 extern struct reggroup *const system_reggroup;
 extern struct reggroup *const vector_reggroup;
 extern struct reggroup *const all_reggroup;
+
+/* Pre-defined, internal, register groups.  */
+extern struct reggroup *const save_reggroup;
+extern struct reggroup *const restore_reggroup;
 
 /* Create a new local register group.  */
 extern struct reggroup *reggroup_new (const char *name);

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