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/rfc] z8k PRINT_REGISTER_HOOK() -> PRINT_REGISTERS_INFO() sortof


Hello,

The attached eliminates one instance of PRINT_REGISTER_HOOK. The way it does it is a little garish though. It creates a multi-arch friendly z8k_print_registers_info() (by cloning code) and then calls that from DO_REGISTERS_INFO().

Once (if?) the z8k is multi-arched, the wierdness will go away.

Andrew
2002-10-23  Andrew Cagney  <cagney@redhat.com>

	* z8k-tdep.c (z8k_print_register_hook): Make static.
	(z8k_print_registers_info): New static function, clone of
	infcmd.c's default_print_registers_info.
	(z8k_do_registers_info): New function.  Wrap
	z8k_print_registers_info.
	* config/z8k/tm-z8k.h: Update copyright.
	(struct gdbarch): Add opaque declaration.
	(PRINT_REGISTER_HOOK): Delete macro.
	(z8k_print_register_hook): Delete declaration.
	(DO_REGISTERS_INFO): Define.
	(z8k_do_registers_info): Declare.

Index: z8k-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/z8k-tdep.c,v
retrieving revision 1.10
diff -u -r1.10 z8k-tdep.c
--- z8k-tdep.c	29 Jul 2002 16:34:07 -0000	1.10
+++ z8k-tdep.c	23 Oct 2002 17:44:33 -0000
@@ -319,7 +319,7 @@
 }
 
 
-void
+static void
 z8k_print_register_hook (int regno)
 {
   if ((regno & 1) == 0 && regno < 16)
@@ -359,7 +359,117 @@
 			     (unsigned int)read_memory_short (rval + i));
 	}
     }
+}
+
+static void
+z8k_print_registers_info (struct gdbarch *gdbarch,
+			  struct ui_file *file,
+			  struct frame_info *frame,
+			  int regnum, int print_all)
+{
+  int i;
+  const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
+  char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
+  char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
+
+  for (i = 0; i < numregs; i++)
+    {
+      /* Decide between printing all regs, non-float / vector regs, or
+         specific reg.  */
+      if (regnum == -1)
+	{
+	  if (!print_all)
+	    {
+	      if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+		continue;
+	      if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
+		continue;
+	    }
+	}
+      else
+	{
+	  if (i != regnum)
+	    continue;
+	}
+
+      /* If the register name is empty, it is undefined for this
+         processor, so don't display anything.  */
+      if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
+	continue;
+
+      fputs_filtered (REGISTER_NAME (i), file);
+      print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
+
+      /* Get the data in raw format.  */
+      if (! frame_register_read (frame, i, raw_buffer))
+	{
+	  fprintf_filtered (file, "*value not available*\n");
+	  continue;
+	}
 
+      /* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
+         The function frame_register_read() should have returned the
+         pre-cooked register so no conversion is necessary.  */
+      /* Convert raw data to virtual format if necessary.  */
+      if (REGISTER_CONVERTIBLE (i))
+	{
+	  REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i),
+				       raw_buffer, virtual_buffer);
+	}
+      else
+	{
+	  memcpy (virtual_buffer, raw_buffer,
+		  REGISTER_VIRTUAL_SIZE (i));
+	}
+
+      /* If virtual format is floating, print it that way, and in raw
+         hex.  */
+      if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
+	{
+	  int j;
+
+	  val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+		     file, 0, 1, 0, Val_pretty_default);
+
+	  fprintf_filtered (file, "\t(raw 0x");
+	  for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
+	    {
+	      int idx;
+	      if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+		idx = j;
+	      else
+		idx = REGISTER_RAW_SIZE (i) - 1 - j;
+	      fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
+	    }
+	  fprintf_filtered (file, ")");
+	}
+      else
+	{
+	  /* Print the register in hex.  */
+	  val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+		     file, 'x', 1, 0, Val_pretty_default);
+          /* If not a vector register, print it also according to its
+             natural format.  */
+	  if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
+	    {
+	      fprintf_filtered (file, "\t");
+	      val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
+			 file, 0, 1, 0, Val_pretty_default);
+	    }
+	}
+
+      /* Some z8k specific info.  */
+      z8k_print_register_hook (i);
+
+      fprintf_filtered (file, "\n");
+    }
+}
+
+void
+z8k_do_registers_info (int regnum, int all)
+{
+  z8k_print_registers_info (current_gdbarch, gdb_stdout, selected_frame,
+			    regnum, all);
 }
 
 void
Index: config/z8k/tm-z8k.h
===================================================================
RCS file: /cvs/src/src/gdb/config/z8k/tm-z8k.h,v
retrieving revision 1.10
diff -u -r1.10 tm-z8k.h
--- config/z8k/tm-z8k.h	24 Aug 2002 00:21:36 -0000	1.10
+++ config/z8k/tm-z8k.h	23 Oct 2002 17:44:33 -0000
@@ -1,6 +1,7 @@
 /* Parameters for execution on a z8000 series machine.
-   Copyright 1992, 1993, 1994, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+
+   Copyright 1992, 1993, 1994, 1998, 1999, 2000, 2001, 2002 Free
+   Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -19,6 +20,8 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+struct gdbarch;
+
 #undef TARGET_INT_BIT
 #undef TARGET_LONG_BIT
 #undef TARGET_SHORT_BIT
@@ -276,9 +279,8 @@
 
 #define NO_STD_REGS
 
-extern void z8k_print_register_hook (int regno);
-#define	PRINT_REGISTER_HOOK(regno) z8k_print_register_hook(regno)
-
+extern void z8k_do_registers_info (int regnum, int all);
+#define DO_REGISTERS_INFO(REGNUM,ALL) z8k_do_registers_info (REGNUM,ALL)
 
 extern void z8k_set_pointer_size (int newsize);
 #define INIT_EXTRA_SYMTAB_INFO \

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