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/in] Provide a default REGISTER_BYTE()


Hello,

The attached adds a default REGISTER_BYTE() method. It also adds another sanity check to ``maint print registers''.

One less thing to implement when adding a new architecture,

enjoy,
Andrew

PS: While the implementation isn't the most efficient it shouldn't matter. Things like the register cache pre-compute these values anyway.
2002-08-09  Andrew Cagney  <cagney@redhat.com>

	* regcache.c (regcache_dump): Compare the register offset
	with REGISTER_BYTE.
	* arch-utils.c (generic_register_byte): New function.
	* arch-utils.h (generic_register_byte): Declare.
	* gdbarch.sh (REGISTER_BYTE): Default to generic_register_byte.
	* gdbarch.h, gdbarch.c: Regenerate.

Index: arch-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.c,v
retrieving revision 1.63
diff -u -r1.63 arch-utils.c
--- arch-utils.c	30 Jul 2002 13:45:13 -0000	1.63
+++ arch-utils.c	10 Aug 2002 01:50:50 -0000
@@ -444,6 +444,23 @@
        (name && STREQ ("_sigtramp", name))
 #endif
 #endif
+
+/* Assume all registers are adjacent.  */
+
+int
+generic_register_byte (int regnum)
+{
+  int byte;
+  int i;
+  gdb_assert (regnum >= 0 && regnum < NUM_REGS + NUM_PSEUDO_REGS);
+  byte = 0;
+  for (i = 0; i < regnum; i++)
+    {
+      byte += TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (i));
+    }
+  return byte;
+}
+
 
 int
 legacy_pc_in_sigtramp (CORE_ADDR pc, char *name)
Index: arch-utils.h
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.h,v
retrieving revision 1.37
diff -u -r1.37 arch-utils.h
--- arch-utils.h	3 Jul 2002 21:27:55 -0000	1.37
+++ arch-utils.h	10 Aug 2002 01:50:50 -0000
@@ -155,6 +155,9 @@
 
 extern int generic_register_size (int regnum);
 
+/* Assume that the world is sane, the registers are all adjacent.  */
+extern int generic_register_byte (int regnum);
+
 /* Prop up old targets that use various IN_SIGTRAMP() macros.  */
 extern int legacy_pc_in_sigtramp (CORE_ADDR pc, char *name);
 
Index: gdbarch.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.c,v
retrieving revision 1.140
diff -u -r1.140 gdbarch.c
--- gdbarch.c	7 Aug 2002 16:01:57 -0000	1.140
+++ gdbarch.c	10 Aug 2002 01:50:50 -0000
@@ -315,7 +315,7 @@
   0,
   0,
   0,
-  0,
+  generic_register_byte,
   generic_register_size,
   0,
   generic_register_size,
@@ -484,6 +484,7 @@
   current_gdbarch->register_name = legacy_register_name;
   current_gdbarch->register_size = -1;
   current_gdbarch->register_bytes = -1;
+  current_gdbarch->register_byte = generic_register_byte;
   current_gdbarch->register_raw_size = generic_register_size;
   current_gdbarch->max_register_raw_size = -1;
   current_gdbarch->register_virtual_size = generic_register_size;
@@ -623,9 +624,7 @@
   if ((GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
       && (gdbarch->register_bytes == -1))
     fprintf_unfiltered (log, "\n\tregister_bytes");
-  if ((GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
-      && (gdbarch->register_byte == 0))
-    fprintf_unfiltered (log, "\n\tregister_byte");
+  /* Skip verify of register_byte, invalid_p == 0 */
   /* Skip verify of register_raw_size, invalid_p == 0 */
   if ((GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
       && (gdbarch->max_register_raw_size == -1))
Index: gdbarch.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.h,v
retrieving revision 1.108
diff -u -r1.108 gdbarch.h
--- gdbarch.h	7 Aug 2002 16:01:58 -0000	1.108
+++ gdbarch.h	10 Aug 2002 01:50:51 -0000
@@ -693,6 +693,11 @@
 #endif
 #endif
 
+/* Default (function) for non- multi-arch platforms. */
+#if (!GDB_MULTI_ARCH) && !defined (REGISTER_BYTE)
+#define REGISTER_BYTE(reg_nr) (generic_register_byte (reg_nr))
+#endif
+
 typedef int (gdbarch_register_byte_ftype) (int reg_nr);
 extern int gdbarch_register_byte (struct gdbarch *gdbarch, int reg_nr);
 extern void set_gdbarch_register_byte (struct gdbarch *gdbarch, gdbarch_register_byte_ftype *register_byte);
Index: gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.152
diff -u -r1.152 gdbarch.sh
--- gdbarch.sh	7 Aug 2002 16:01:58 -0000	1.152
+++ gdbarch.sh	10 Aug 2002 01:50:51 -0000
@@ -461,7 +461,7 @@
 f:2:REGISTER_NAME:const char *:register_name:int regnr:regnr:::legacy_register_name::0
 v:2:REGISTER_SIZE:int:register_size::::0:-1
 v:2:REGISTER_BYTES:int:register_bytes::::0:-1
-f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::0:0
+f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::generic_register_byte:generic_register_byte::0
 f:2:REGISTER_RAW_SIZE:int:register_raw_size:int reg_nr:reg_nr::generic_register_size:generic_register_size::0
 v:2:MAX_REGISTER_RAW_SIZE:int:max_register_raw_size::::0:-1
 f:2:REGISTER_VIRTUAL_SIZE:int:register_virtual_size:int reg_nr:reg_nr::generic_register_size:generic_register_size::0
Index: regcache.c
===================================================================
RCS file: /cvs/src/src/gdb/regcache.c,v
retrieving revision 1.49
diff -u -r1.49 regcache.c
--- regcache.c	10 Aug 2002 00:36:46 -0000	1.49
+++ regcache.c	10 Aug 2002 01:50:51 -0000
@@ -1279,7 +1279,8 @@
 	{
 	  fprintf_unfiltered (file, " %6ld",
 			      regcache->descr->register_offset[regnum]);
-	  if (register_offset != regcache->descr->register_offset[regnum])
+	  if (register_offset != regcache->descr->register_offset[regnum]
+	      || register_offset != REGISTER_BYTE (regnum))
 	    {
 	      if (!footnote_register_offset)
 		footnote_register_offset = ++footnote_nr;

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