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]

[commit] Implement d10v specific `info registers'


Hello,

This patch provides a d10v specific implementation of the `info registers' command. With that in place, it deprecates the old d10v only `(gdb) regs' command.

It also tweaks frame_reg_name_to_regnum() so that the lenght of it's name parameter doesn't need to be specified.

committed,
Andrew
2003-02-02  Andrew Cagney  <ac131313@redhat.com>

	* NEWS: Mention that the d10v's `regs' command is deprecated.

	* frame.h: Note that namelen can be negative.
	* frame.c (frame_map_name_to_regnum): When LEN is negative, use
	NAME's length.

	* d10v-tdep.c (d10v_gdbarch_init): Set print_registers_info.
	(d10v_print_registers_info): New function.
	(show_regs): Call d10v_print_registers_info.
	(_initialize_d10v_tdep): Mark "show regs" command as deprecated.

Index: NEWS
===================================================================
RCS file: /cvs/src/src/gdb/NEWS,v
retrieving revision 1.98
diff -u -r1.98 NEWS
--- NEWS	22 Jan 2003 23:50:35 -0000	1.98
+++ NEWS	2 Feb 2003 18:42:23 -0000
@@ -3,6 +3,11 @@
 
 *** Changes since GDB 5.3:
 
+* d10v `regs' command deprecated
+
+The `info registers' command has been updated so that it displays the
+registers using a format identical to the old `regs' command.
+
 * Profiling support
 
 A new command, "maint set profile on/off", has been added.  This command can
Index: d10v-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/d10v-tdep.c,v
retrieving revision 1.73
diff -u -r1.73 d10v-tdep.c
--- d10v-tdep.c	30 Jan 2003 15:11:20 -0000	1.73
+++ d10v-tdep.c	2 Feb 2003 18:42:23 -0000
@@ -819,63 +819,89 @@
 }
 
 static void
-show_regs (char *args, int from_tty)
+d10v_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
+			   struct frame_info *frame, int regnum, int all)
 {
-  int a;
-  printf_filtered ("PC=%04lx (0x%lx) PSW=%04lx RPT_S=%04lx RPT_E=%04lx RPT_C=%04lx\n",
-		   (long) read_register (PC_REGNUM),
-		   (long) d10v_make_iaddr (read_register (PC_REGNUM)),
-		   (long) read_register (PSW_REGNUM),
-		   (long) read_register (24),
-		   (long) read_register (25),
-		   (long) read_register (23));
-  printf_filtered ("R0-R7  %04lx %04lx %04lx %04lx %04lx %04lx %04lx %04lx\n",
-		   (long) read_register (0),
-		   (long) read_register (1),
-		   (long) read_register (2),
-		   (long) read_register (3),
-		   (long) read_register (4),
-		   (long) read_register (5),
-		   (long) read_register (6),
-		   (long) read_register (7));
-  printf_filtered ("R8-R15 %04lx %04lx %04lx %04lx %04lx %04lx %04lx %04lx\n",
-		   (long) read_register (8),
-		   (long) read_register (9),
-		   (long) read_register (10),
-		   (long) read_register (11),
-		   (long) read_register (12),
-		   (long) read_register (13),
-		   (long) read_register (14),
-		   (long) read_register (15));
-  for (a = 0; a < NR_IMAP_REGS; a++)
-    {
-      if (a > 0)
-	printf_filtered ("    ");
-      printf_filtered ("IMAP%d %04lx", a, d10v_imap_register (a));
-    }
-  if (NR_DMAP_REGS == 1)
-    printf_filtered ("    DMAP %04lx\n", d10v_dmap_register (2));
-  else
-    {
-      for (a = 0; a < NR_DMAP_REGS; a++)
-	{
-	  printf_filtered ("    DMAP%d %04lx", a, d10v_dmap_register (a));
-	}
-      printf_filtered ("\n");
-    }
-  printf_filtered ("A0-A%d", NR_A_REGS - 1);
-  for (a = A0_REGNUM; a < A0_REGNUM + NR_A_REGS; a++)
+  if (regnum >= 0)
     {
-      char num[MAX_REGISTER_RAW_SIZE];
-      int i;
-      printf_filtered ("  ");
-      deprecated_read_register_gen (a, (char *) &num);
-      for (i = 0; i < MAX_REGISTER_RAW_SIZE; i++)
-	{
-	  printf_filtered ("%02x", (num[i] & 0xff));
-	}
+      default_print_registers_info (gdbarch, file, frame, regnum, all);
+      return;
     }
-  printf_filtered ("\n");
+
+  {
+    ULONGEST pc, psw, rpt_s, rpt_e, rpt_c;
+    frame_read_unsigned_register (frame, PC_REGNUM, &pc);
+    frame_read_unsigned_register (frame, PSW_REGNUM, &psw);
+    frame_read_unsigned_register (frame, frame_map_name_to_regnum ("rpt_s", -1), &rpt_s);
+    frame_read_unsigned_register (frame, frame_map_name_to_regnum ("rpt_e", -1), &rpt_e);
+    frame_read_unsigned_register (frame, frame_map_name_to_regnum ("rpt_c", -1), &rpt_c);
+    fprintf_filtered (file, "PC=%04lx (0x%lx) PSW=%04lx RPT_S=%04lx RPT_E=%04lx RPT_C=%04lx\n",
+		     (long) pc, (long) d10v_make_iaddr (pc), (long) psw,
+		     (long) rpt_s, (long) rpt_e, (long) rpt_c);
+  }
+
+  {
+    int group;
+    for (group = 0; group < 16; group += 8)
+      {
+	int r;
+	fprintf_filtered (file, "R%d-R%-2d", group, group + 7);
+	for (r = group; r < group + 8; r++)
+	  {
+	    ULONGEST tmp;
+	    frame_read_unsigned_register (frame, r, &tmp);
+	    fprintf_filtered (file, " %04lx", (long) tmp);
+	  }
+	fprintf_filtered (file, "\n");
+      }
+  }
+
+  /* Note: The IMAP/DMAP registers don't participate in function
+     calls.  Don't bother trying to unwind them.  */
+
+  {
+    int a;
+    for (a = 0; a < NR_IMAP_REGS; a++)
+      {
+	if (a > 0)
+	  fprintf_filtered (file, "    ");
+	fprintf_filtered (file, "IMAP%d %04lx", a, d10v_imap_register (a));
+      }
+    if (NR_DMAP_REGS == 1)
+      /* Registers DMAP0 and DMAP1 are constant.  Just return dmap2.  */
+      fprintf_filtered (file, "    DMAP %04lx\n", d10v_dmap_register (2));
+    else
+      {
+	for (a = 0; a < NR_DMAP_REGS; a++)
+	  {
+	    fprintf_filtered (file, "    DMAP%d %04lx", a, d10v_dmap_register (a));
+	  }
+	fprintf_filtered (file, "\n");
+      }
+  }
+
+  {
+    char *num = alloca (max_register_size (gdbarch));
+    int a;
+    fprintf_filtered (file, "A0-A%d", NR_A_REGS - 1);
+    for (a = A0_REGNUM; a < A0_REGNUM + NR_A_REGS; a++)
+      {
+	int i;
+	fprintf_filtered (file, "  ");
+	frame_register_read (frame, a, num);
+	for (i = 0; i < MAX_REGISTER_RAW_SIZE; i++)
+	  {
+	    fprintf_filtered (file, "%02x", (num[i] & 0xff));
+	  }
+      }
+  }
+  fprintf_filtered (file, "\n");
+}
+
+static void
+show_regs (char *args, int from_tty)
+{
+  d10v_print_registers_info (current_gdbarch, gdb_stdout, get_current_frame (), -1, 1);
 }
 
 static CORE_ADDR
@@ -1699,6 +1725,8 @@
   set_gdbarch_register_sim_regno (gdbarch, d10v_register_sim_regno);
   set_gdbarch_extra_stack_alignment_needed (gdbarch, 0);
 
+  set_gdbarch_print_registers_info (gdbarch, d10v_print_registers_info);
+
   frame_unwind_append_predicate (gdbarch, d10v_frame_p);
 
   return gdbarch;
@@ -1718,7 +1746,8 @@
   target_resume_hook = d10v_eva_prepare_to_trace;
   target_wait_loop_hook = d10v_eva_get_trace_data;
 
-  add_com ("regs", class_vars, show_regs, "Print all registers");
+  deprecate_cmd (add_com ("regs", class_vars, show_regs, "Print all registers"),
+		 "info registers");
 
   add_com ("itrace", class_support, trace_command,
 	   "Enable tracing of instruction execution.");
Index: frame.c
===================================================================
RCS file: /cvs/src/src/gdb/frame.c,v
retrieving revision 1.64
diff -u -r1.64 frame.c
--- frame.c	29 Jan 2003 18:07:06 -0000	1.64
+++ frame.c	2 Feb 2003 18:42:24 -0000
@@ -385,6 +385,9 @@
 {
   int i;
 
+  if (len < 0)
+    len = strlen (name);
+
   /* Search register name space. */
   for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
     if (REGISTER_NAME (i) && len == strlen (REGISTER_NAME (i))
Index: frame.h
===================================================================
RCS file: /cvs/src/src/gdb/frame.h,v
retrieving revision 1.64
diff -u -r1.64 frame.h
--- frame.h	21 Jan 2003 19:32:42 -0000	1.64
+++ frame.h	2 Feb 2003 18:42:26 -0000
@@ -291,9 +291,10 @@
 
 /* Map between a frame register number and its name.  A frame register
    space is a superset of the cooked register space --- it also
-   includes builtin registers.  */
+   includes builtin registers.  If NAMELEN is negative, use the NAME's
+   length when doing the comparison.  */
 
-extern int frame_map_name_to_regnum (const char *name, int strlen);
+extern int frame_map_name_to_regnum (const char *name, int namelen);
 extern const char *frame_map_regnum_to_name (int regnum);
 
 /* Unwind the PC.  Strictly speaking return the resume address of the

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