This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[patch/in] Provide a default REGISTER_BYTE()
- From: Andrew Cagney <ac131313 at ges dot redhat dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Fri, 09 Aug 2002 21:56:50 -0400
- Subject: [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;