[PATCH] multiarch {fetch,store}_pseudo_register

Elena Zannoni ezannoni@cygnus.com
Fri Jul 21 15:40:00 GMT 2000


The subject says it all....

Elena

2000-07-21  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>

	* gdbarch.sh: Add FETCH_PSEUDO_REGISTER and STORE_PSEUDO_REGISTER
 	to the gdbarch structure.
	* gdbarch.c: Regenerate.  
	* gdbarch.h: Regenerate.
	* inferior.h (FETCH_PSEUDO_REGISTER, STORE_PSEUDO_REGISTER):
 	Delete macros.
	* regcache.c (write_register, read_register, write_register_bytes,
 	write_register_gen, read_register_bytes, read_register_gen):
 	Rename ARCH_FECTH_PSEUDO_REGISTERS to FETCH_PSEUDO_REGISTERS and
 	ARCH_STORE_PSEUDO_REGISTER to STORE_PSEUDO_REGISTER.

Index: gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.29
diff -c -u -p -r1.29 gdbarch.sh
cvs server: conflicting specifications of output style
--- gdbarch.sh  2000/06/12 00:35:34     1.29
+++ gdbarch.sh  2000/07/21 22:08:14
@@ -333,6 +338,14 @@ f:1:GET_SAVED_REGISTER:void:get_saved_re
 f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr:::generic_register_convertible_not::0
 f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to:::0::0
 f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to:::0::0
+#This function is called when the value of a pseudo-register needs
+#to be updated.  Typically it will be defined on a per-architecture
+#basis.
+f:2:FETCH_PSEUDO_REGISTER:void:fetch_pseudo_register:int regnum:regnum:::0::0
+#This function is called when the value of a pseudo-register needs
+#to be set or stored.  Typically it will be defined on a per-architecture
+#basis.
+f:2:STORE_PSEUDO_REGISTER:void:store_pseudo_register:int regnum:regnum:::0::0
 #
 f:2:POINTER_TO_ADDRESS:CORE_ADDR:pointer_to_address:struct type *type, void *buf:type, buf:::unsigned_pointer_to_address::0
 f:2:ADDRESS_TO_POINTER:void:address_to_pointer:struct type *type, void *buf, CORE_ADDR addr:type, buf, addr:::unsigned_address_to_pointer::0

Index: inferior.h
===================================================================
RCS file: /cvs/src/src/gdb/inferior.h,v
retrieving revision 1.8
diff -c -u -r1.8 inferior.h
cvs server: conflicting specifications of output style
--- inferior.h  2000/07/12 22:01:17     1.8
+++ inferior.h  2000/07/21 22:06:04
@@ -59,29 +59,6 @@
 #define ARCH_NUM_REGS NUM_REGS
 #endif
 
-
-/* This function is called when the value of a pseudo-register needs
-   to be updated.  Typically it will be defined on a per-architecture
-   basis.  FIXME: move into gdbarch.[ch].  */
-#ifndef ARCH_FETCH_PSEUDO_REGISTERS
-#define ARCH_FETCH_PSEUDO_REGISTERS(REGNUM) /* no-op */
-#endif
-
-/* This function is called when the value of a pseudo-register needs
-   to be set or stored.  Typically it will be defined on a per-architecture
-   basis.  FIXME: move into gdbarch.[ch].  */
-#ifndef ARCH_STORE_PSEUDO_REGISTERS
-#define ARCH_STORE_PSEUDO_REGISTERS(REGNUM) /* no-op */
-#endif
-
 extern void set_sigint_trap (void);
 
 extern void clear_sigint_trap (void);

Index: gdbarch.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.h,v
retrieving revision 1.23
diff -c -u -p -r1.23 gdbarch.h
cvs server: conflicting specifications of output style
--- gdbarch.h   2000/06/10 05:37:47     1.23
+++ gdbarch.h   2000/07/21 22:09:14
@@ -587,6 +600,34 @@ extern void set_gdbarch_register_convert
 #if GDB_MULTI_ARCH
 #if (GDB_MULTI_ARCH > 1) || !defined (REGISTER_CONVERT_TO_RAW)
 #define REGISTER_CONVERT_TO_RAW(type, regnum, from, to) (gdbarch_register_convert_to_raw (current_gdbarch, type, regnum, from, to))
+#endif
+#endif
+
+/* Default (function) for non- multi-arch platforms. */
+#if (GDB_MULTI_ARCH == 0) && !defined (FETCH_PSEUDO_REGISTER)
+#define FETCH_PSEUDO_REGISTER(regnum) (internal_error ("FETCH_PSEUDO_REGISTER"), 0)
+#endif
+
+typedef void (gdbarch_fetch_pseudo_register_ftype) (int regnum);
+extern void gdbarch_fetch_pseudo_register (struct gdbarch *gdbarch, int regnum);
+extern void set_gdbarch_fetch_pseudo_register (struct gdbarch *gdbarch, gdbarch_fetch_pseudo_register_ftype *fetch_pseudo_register);
+#if GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > 1) || !defined (FETCH_PSEUDO_REGISTER)
+#define FETCH_PSEUDO_REGISTER(regnum) (gdbarch_fetch_pseudo_register (current_gdbarch, regnum))
+#endif
+#endif
+
+/* Default (function) for non- multi-arch platforms. */
+#if (GDB_MULTI_ARCH == 0) && !defined (STORE_PSEUDO_REGISTER)
+#define STORE_PSEUDO_REGISTER(regnum) (internal_error ("STORE_PSEUDO_REGISTER"), 0)
+#endif
+
+typedef void (gdbarch_store_pseudo_register_ftype) (int regnum);
+extern void gdbarch_store_pseudo_register (struct gdbarch *gdbarch, int regnum);
+extern void set_gdbarch_store_pseudo_register (struct gdbarch *gdbarch, gdbarch_store_pseudo_register_ftype *store_pseudo_register);
+#if GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > 1) || !defined (STORE_PSEUDO_REGISTER)
+#define STORE_PSEUDO_REGISTER(regnum) (gdbarch_store_pseudo_register (current_gdbarch, regnum))
 #endif
 #endif

Index: gdbarch.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.c,v
retrieving revision 1.29
diff -c -u -p -r1.29 gdbarch.c
cvs server: conflicting specifications of output style
--- gdbarch.c   2000/06/12 00:35:33     1.29
+++ gdbarch.c   2000/07/21 22:10:21
@@ -181,6 +182,8 @@ struct gdbarch
   gdbarch_register_convertible_ftype *register_convertible;
   gdbarch_register_convert_to_virtual_ftype *register_convert_to_virtual;
   gdbarch_register_convert_to_raw_ftype *register_convert_to_raw;
+  gdbarch_fetch_pseudo_register_ftype *fetch_pseudo_register;
+  gdbarch_store_pseudo_register_ftype *store_pseudo_register;
   gdbarch_pointer_to_address_ftype *pointer_to_address;
   gdbarch_address_to_pointer_ftype *address_to_pointer;
   gdbarch_return_value_on_stack_ftype *return_value_on_stack;
@@ -340,6 +344,8 @@ struct gdbarch startup_gdbarch =
   0,
   0,
   0,
+  0,
+  0,
   /* startup_gdbarch() */
 };
 
@@ -561,6 +568,8 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of register_convertible, invalid_p == 0 */
   /* Skip verify of register_convert_to_virtual, invalid_p == 0 */
   /* Skip verify of register_convert_to_raw, invalid_p == 0 */
+  /* Skip verify of fetch_pseudo_register, invalid_p == 0 */
+  /* Skip verify of store_pseudo_register, invalid_p == 0 */
   /* Skip verify of pointer_to_address, invalid_p == 0 */
   /* Skip verify of address_to_pointer, invalid_p == 0 */
   /* Skip verify of return_value_on_stack, invalid_p == 0 */
@@ -972,6 +986,20 @@ gdbarch_dump (struct gdbarch *gdbarch, s
                       "REGISTER_CONVERT_TO_RAW(type, regnum, from, to)",
                       XSTRING (REGISTER_CONVERT_TO_RAW (type, regnum, from, to)));
 #endif
+#if defined (FETCH_PSEUDO_REGISTER) && GDB_MULTI_ARCH
+  /* Macro might contain `[{}]' when not multi-arch */
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: %s # %s\n",
+                      "FETCH_PSEUDO_REGISTER(regnum)",
+                      XSTRING (FETCH_PSEUDO_REGISTER (regnum)));
+#endif
+#if defined (STORE_PSEUDO_REGISTER) && GDB_MULTI_ARCH
+  /* Macro might contain `[{}]' when not multi-arch */
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: %s # %s\n",
+                      "STORE_PSEUDO_REGISTER(regnum)",
+                      XSTRING (STORE_PSEUDO_REGISTER (regnum)));
+#endif
 #ifdef POINTER_TO_ADDRESS
   fprintf_unfiltered (file,
                       "gdbarch_dump: %s # %s\n",
@@ -1556,6 +1589,20 @@ gdbarch_dump (struct gdbarch *gdbarch, s
                         (long) current_gdbarch->register_convert_to_raw
                         /*REGISTER_CONVERT_TO_RAW ()*/);
 #endif
+#ifdef FETCH_PSEUDO_REGISTER
+  if (GDB_MULTI_ARCH)
+    fprintf_unfiltered (file,
+                        "gdbarch_dump: FETCH_PSEUDO_REGISTER = 0x%08lx\n",
+                        (long) current_gdbarch->fetch_pseudo_register
+                        /*FETCH_PSEUDO_REGISTER ()*/);
+#endif
+#ifdef STORE_PSEUDO_REGISTER
+  if (GDB_MULTI_ARCH)
+    fprintf_unfiltered (file,
+                        "gdbarch_dump: STORE_PSEUDO_REGISTER = 0x%08lx\n",
+                        (long) current_gdbarch->store_pseudo_register
+                        /*STORE_PSEUDO_REGISTER ()*/);
+#endif
 #ifdef POINTER_TO_ADDRESS
   if (GDB_MULTI_ARCH)
     fprintf_unfiltered (file,
@@ -2769,6 +2832,40 @@ set_gdbarch_register_convert_to_raw (str
                                      gdbarch_register_convert_to_raw_ftype register_convert_to_raw)
 {
   gdbarch->register_convert_to_raw = register_convert_to_raw;
+}
+
+void
+gdbarch_fetch_pseudo_register (struct gdbarch *gdbarch, int regnum)
+{
+  if (gdbarch->fetch_pseudo_register == 0)
+    internal_error ("gdbarch: gdbarch_fetch_pseudo_register invalid");
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_fetch_pseudo_register called\n");
+  gdbarch->fetch_pseudo_register (regnum);
+}
+
+void
+set_gdbarch_fetch_pseudo_register (struct gdbarch *gdbarch,
+                                   gdbarch_fetch_pseudo_register_ftype fetch_pseudo_register)
+{
+  gdbarch->fetch_pseudo_register = fetch_pseudo_register;
+}
+
+void
+gdbarch_store_pseudo_register (struct gdbarch *gdbarch, int regnum)
+{
+  if (gdbarch->store_pseudo_register == 0)
+    internal_error ("gdbarch: gdbarch_store_pseudo_register invalid");
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_store_pseudo_register called\n");
+  gdbarch->store_pseudo_register (regnum);
+}
+
+void
+set_gdbarch_store_pseudo_register (struct gdbarch *gdbarch,
+                                   gdbarch_store_pseudo_register_ftype store_pseudo_register)
+{
+  gdbarch->store_pseudo_register = store_pseudo_register;
 }
 
 CORE_ADDR

Index: regcache.c
===================================================================
RCS file: /cvs/src/src/gdb/regcache.c,v
retrieving revision 1.5
diff -c -u -p -r1.5 regcache.c
cvs server: conflicting specifications of output style
--- regcache.c  2000/07/21 22:25:52     1.5
+++ regcache.c  2000/07/21 22:39:10
@@ -378,7 +378,7 @@ read_register_bytes (int inregbyte, char
       if (regno < NUM_REGS)
        target_fetch_registers (regno);
       else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
-       ARCH_FETCH_PSEUDO_REGISTERS (regno);
+       FETCH_PSEUDO_REGISTER (regno);
 
       if (!register_valid[regno])
        error ("read_register_bytes:  Couldn't update register %d.", regno);
@@ -407,7 +407,7 @@ read_register_gen (int regno, char *myad
       if (regno < NUM_REGS)
        target_fetch_registers (regno);
       else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
-       ARCH_FETCH_PSEUDO_REGISTERS (regno);
+       FETCH_PSEUDO_REGISTER (regno);
     }
   memcpy (myaddr, &registers[REGISTER_BYTE (regno)],
          REGISTER_RAW_SIZE (regno));
@@ -456,7 +456,7 @@ write_register_gen (int regno, char *mya
   if (regno < NUM_REGS)
     target_store_registers (regno);
   else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
-    ARCH_STORE_PSEUDO_REGISTERS (regno);
+    STORE_PSEUDO_REGISTER (regno);
 }
 
 /* Copy INLEN bytes of consecutive data from memory at MYADDR
@@ -510,7 +510,7 @@ write_register_bytes (int myregstart, ch
          if (regno < NUM_REGS)
            target_store_registers (regno);
          else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
-           ARCH_STORE_PSEUDO_REGISTERS (regno);
+           STORE_PSEUDO_REGISTER (regno);
        }
     }
 }
@@ -533,7 +533,7 @@ read_register (int regno)
       if (regno < NUM_REGS)
        target_fetch_registers (regno);
       else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
-       ARCH_FETCH_PSEUDO_REGISTERS (regno);
+       FETCH_PSEUDO_REGISTER (regno);
     }
 
   return (extract_unsigned_integer (&registers[REGISTER_BYTE (regno)],
@@ -639,7 +639,7 @@ write_register (int regno, LONGEST val)
   if (regno < NUM_REGS)
     target_store_registers (regno);
   else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
-    ARCH_STORE_PSEUDO_REGISTERS (regno);
+    STORE_PSEUDO_REGISTER (regno);
 }
 
 void


More information about the Gdb-patches mailing list