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]

[RFA] h8300-tdep.c: Some more code to support H8SX


Hi,

the following patch adds some more code to support the H8SX cpu.
It's just framework, the changes in the prologue scanning are still
under construction.

	* h8300-tdep.c: Add H8SX registers. Drop E_NUM_REGS entirely,
	substitute by NUM_REGS throughout.
	(h8300_register_name): Only care for H8/300 and H8/300H registers.
	(h8300s_register_name): New function for H8S registers.
	(h8300sx_register_name): Ditto for H8SX registers.
	(h8300_print_register): Revise register printing, avoid depending
	on 32 bit long.
	(h8300_register_byte); Only care for H8/300 registers.
	(h8300h_register_byte): New function for any other architecture.
	(h8300_register_raw_size): Remove.
	(h8300_register_virtual_type): Revise to return actually useful
	type.
	(h8300_extract_struct_value_address): Only care for H8/300 registers.
	(h8300h_extract_struct_value_address): New function for any other
	architecture.
	(h8300_gdbarch_init): Call set_gdbarch_num_regs,
	set_gdbarch_register_name, set_gdbarch_register_byte,
	set_gdbarch_ptr_bit and set_gdbarch_addr_bit architecture dependent.
	Remove calls to set_gdbarch_deprecated_register_size,
	set_gdbarch_deprecated_register_bytes, set_gdbarch_register_raw_size,
	set_gdbarch_deprecated_max_register_raw_size,
	set_gdbarch_register_virtual_size and
	set_gdbarch_deprecated_max_register_virtual_size entirely.

Index: h8300-tdep.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/h8300-tdep.c,v
retrieving revision 2.66
diff -u -p -r2.66 h8300-tdep.c
--- h8300-tdep.c	2003/06/06 18:51:51	2.66
+++ h8300-tdep.c	2003/06/11 13:02:03
@@ -44,8 +44,6 @@ struct frame_extra_info
   CORE_ADDR locals_pointer;
 };
 
-#define E_NUM_REGS (h8300smode ? 14 : 13)
-
 enum
 {
   h8300_reg_size = 2,
@@ -69,7 +67,11 @@ enum gdb_regnum
   E_CYCLES_REGNUM,
   E_TICK_REGNUM, E_EXR_REGNUM = E_TICK_REGNUM,
   E_INST_REGNUM, E_TICKS_REGNUM = E_INST_REGNUM,
-  E_INSTS_REGNUM
+  E_INSTS_REGNUM,
+  E_MACH_REGNUM,
+  E_MACL_REGNUM,
+  E_SBR_REGNUM,
+  E_VBR_REGNUM
 };
 
 #define UNSIGNED_SHORT(X) ((X) & 0xffff)
@@ -864,21 +866,47 @@ static struct cmd_list_element *setmachi
 static const char *
 h8300_register_name (int regno)
 {
-  /* The register names change depending on whether the h8300h processor
+  /* The register names change depending on which h8300 processor
      type is selected. */
-  static char *h8300_register_names[] = {
+  static char *register_names[] = {
     "r0", "r1", "r2", "r3", "r4", "r5", "r6",
     "sp", "ccr","pc","cycles", "tick", "inst", ""
   };
-  static char *h8300s_register_names[] = {
+  if (regno < 0
+      || regno >= (sizeof (register_names) / sizeof (*register_names)))
+    internal_error (__FILE__, __LINE__,
+                    "h8300_register_name: illegal register number %d", regno);
+  else
+    return register_names[regno];
+}
+
+static const char *
+h8300s_register_name (int regno)
+{
+  static char *register_names[] = {
     "er0", "er1", "er2", "er3", "er4", "er5", "er6",
     "sp", "ccr", "pc", "cycles", "exr", "tick", "inst"
+  };
+  if (regno < 0
+      || regno >= (sizeof (register_names) / sizeof (*register_names)))
+    internal_error (__FILE__, __LINE__,
+                    "h8300s_register_name: illegal register number %d", regno);
+  else
+    return register_names[regno];
+}
+
+static const char *
+h8300sx_register_name (int regno)
+{
+  static char *register_names[] = {
+    "er0", "er1", "er2", "er3", "er4", "er5", "er6",
+    "sp", "ccr", "pc", "cycles", "exr", "tick", "inst",
+    "mach", "macl", "sbr", "vbr"
   };
-  char **register_names =
-  		h8300smode ? h8300s_register_names : h8300_register_names;
-  if (regno < 0 || regno >= E_NUM_REGS)
+  if (regno < 0
+      || regno >= (sizeof (register_names) / sizeof (*register_names)))
     internal_error (__FILE__, __LINE__,
-		    "h8300_register_name: illegal register number %d", regno);
+		    "h8300sx_register_name: illegal register number %d", regno);
   else
     return register_names[regno];
 }
@@ -887,44 +915,33 @@ static void
 h8300_print_register (struct gdbarch *gdbarch, struct ui_file *file,
 		      struct frame_info *frame, int regno)
 {
-  ULONGEST rval;
-  long val;
-  const char *name = h8300_register_name (regno);
+  LONGEST rval;
+  const char *name = gdbarch_register_name (gdbarch, regno);
 
   if (!name || !*name)
     return;
 
-  /* FIXME: cagney/2002-10-22: The code below assumes that VAL is at
-     least 4 bytes (32 bits) in size and hence is large enough to hold
-     the largest h8300 register.  Should instead be using ULONGEST and
-     the phex() functions.  */
-  gdb_assert (sizeof (val) >= 4);
-  frame_read_unsigned_register (frame, regno, &rval);
-  val = rval;
+  frame_read_signed_register (frame, regno, &rval);
 
   fprintf_filtered (file, "%-14s ", name);
-  if (h8300hmode)
+  if (regno == E_CCR_REGNUM || (regno == E_EXR_REGNUM && h8300smode))
     {
-      if (val)
-	fprintf_filtered (file, "0x%08lx   %-8ld", val, val);
-      else
-	fprintf_filtered (file, "0x%-8lx   %-8ld", val, val);
+      fprintf_filtered (file, "0x%02x        ", (unsigned char)rval);
+      print_longest (file, 'u', 1, rval);
     }
   else
     {
-      if (val)
-	fprintf_filtered (file, "0x%04lx   %-4ld", val, val);
-      else
-	fprintf_filtered (file, "0x%-4lx   %-4ld", val, val);
+      fprintf_filtered (file, "0x%s  ", phex ((ULONGEST)rval, BINWORD));
+      print_longest (file, 'd', 1, rval);
     }
   if (regno == E_CCR_REGNUM)
     {
       /* CCR register */
       int C, Z, N, V;
-      unsigned char b[h8300h_reg_size];
-      unsigned char l;
-      frame_register_read (deprecated_selected_frame, regno, b);
-      l = b[REGISTER_VIRTUAL_SIZE (E_CCR_REGNUM) - 1];
+      //unsigned char b[h8300_max_reg_size];
+      unsigned char l = rval & 0xff;
+      //frame_register_read (deprecated_selected_frame, regno, b);
+      //l = b[REGISTER_VIRTUAL_SIZE (E_CCR_REGNUM) - 1];
       fprintf_filtered (file, "\t");
       fprintf_filtered (file, "I-%d ", (l & 0x80) != 0);
       fprintf_filtered (file, "UI-%d ", (l & 0x40) != 0);
@@ -962,10 +979,10 @@ h8300_print_register (struct gdbarch *gd
   else if (regno == E_EXR_REGNUM && h8300smode)
     {
       /* EXR register */
-      unsigned char b[h8300h_reg_size];
-      unsigned char l;
-      frame_register_read (deprecated_selected_frame, regno, b);
-      l = b[REGISTER_VIRTUAL_SIZE (E_EXR_REGNUM) - 1];
+      //unsigned char b[h8300_max_reg_size];
+      unsigned char l = rval & 0xff;
+      //frame_register_read (deprecated_selected_frame, regno, b);
+      //l = b[REGISTER_VIRTUAL_SIZE (E_EXR_REGNUM) - 1];
       fprintf_filtered (file, "\t");
       fprintf_filtered (file, "T-%d - - - ", (l & 0x80) != 0);
       fprintf_filtered (file, "I2-%d ", (l & 4) != 0);
@@ -980,7 +997,7 @@ h8300_print_registers_info (struct gdbar
 			    struct frame_info *frame, int regno, int cpregs)
 {
   if (regno < 0)
-    for (regno = 0; regno < E_NUM_REGS; ++regno)
+    for (regno = 0; regno < NUM_REGS; ++regno)
       h8300_print_register (gdbarch, file, frame, regno);
   else
     h8300_print_register (gdbarch, file, frame, regno);
@@ -995,34 +1012,50 @@ h8300_saved_pc_after_call (struct frame_
 static int
 h8300_register_byte (int regno)
 {
-  if (regno < 0 || regno >= E_NUM_REGS)
+  if (regno < 0 || regno >= NUM_REGS)
     internal_error (__FILE__, __LINE__,
 		    "h8300_register_byte: illegal register number %d", regno);
   else
-    return regno * BINWORD;
+    return regno * h8300_reg_size;
 }
 
 static int
-h8300_register_raw_size (int regno)
+h8300h_register_byte (int regno)
 {
-  if (regno < 0 || regno >= E_NUM_REGS)
+  if (regno < 0 || regno >= NUM_REGS)
     internal_error (__FILE__, __LINE__,
-		    "h8300_register_raw_size: illegal register number %d",
-		    regno);
+		    "h8300_register_byte: illegal register number %d", regno);
   else
-    return BINWORD;
+    return regno * h8300h_reg_size;
 }
 
 static struct type *
 h8300_register_virtual_type (int regno)
 {
-  if (regno < 0 || regno >= E_NUM_REGS)
+  if (regno < 0 || regno >= NUM_REGS)
     internal_error (__FILE__, __LINE__,
 		    "h8300_register_virtual_type: illegal register number %d",
 		    regno);
   else
-    return h8300hmode ?
-	   builtin_type_unsigned_long : builtin_type_unsigned_short;
+    {
+      switch (regno)
+        {
+	  case E_PC_REGNUM:
+	    return builtin_type_void_func_ptr;
+	  case E_SP_REGNUM:
+	  case E_FP_REGNUM:
+	    return builtin_type_void_data_ptr;
+	  case E_CCR_REGNUM:
+	    return builtin_type_uint8;
+	  case E_EXR_REGNUM:
+	    if (h8300smode)
+	      return builtin_type_uint8;
+	    /*FALLTHRU*/
+	  default:
+	    return h8300hmode ? builtin_type_int32
+			      : builtin_type_int16;
+        }
+    }
 }
 
 static void
@@ -1042,9 +1075,17 @@ h8300_extract_struct_value_address (char
 {
   return 
     extract_unsigned_integer (regbuf + h8300_register_byte (E_ARG0_REGNUM),
-			      h8300_register_raw_size (E_ARG0_REGNUM));
+			      h8300_reg_size);
 }
 
+static CORE_ADDR
+h8300h_extract_struct_value_address (char *regbuf)
+{
+  return 
+    extract_unsigned_integer (regbuf + h8300_register_byte (E_ARG0_REGNUM),
+			      h8300h_reg_size);
+}
+
 const static unsigned char *
 h8300_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
 {
@@ -1081,24 +1122,41 @@ h8300_gdbarch_init (struct gdbarch_info 
   if (info.bfd_arch_info->arch != bfd_arch_h8300)
     return NULL;
 
+  gdbarch = gdbarch_alloc (&info, 0);
+
   switch (info.bfd_arch_info->mach)
     {
     case bfd_mach_h8300:
       h8300sxmode = 0;
       h8300smode = 0;
       h8300hmode = 0;
+      set_gdbarch_num_regs (gdbarch, 13);
+      set_gdbarch_register_name (gdbarch, h8300_register_name);
+      set_gdbarch_register_byte (gdbarch, h8300_register_byte);
+      set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
+      set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
       break;
     case bfd_mach_h8300h:
     case bfd_mach_h8300hn:
       h8300sxmode = 0;
       h8300smode = 0;
       h8300hmode = 1;
+      set_gdbarch_num_regs (gdbarch, 13);
+      set_gdbarch_register_name (gdbarch, h8300_register_name);
+      set_gdbarch_register_byte (gdbarch, h8300h_register_byte);
+      set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
+      set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
       break;
     case bfd_mach_h8300s:
     case bfd_mach_h8300sn:
       h8300sxmode = 0;
       h8300smode = 1;
       h8300hmode = 1;
+      set_gdbarch_num_regs (gdbarch, 14);
+      set_gdbarch_register_name (gdbarch, h8300s_register_name);
+      set_gdbarch_register_byte (gdbarch, h8300h_register_byte);
+      set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
+      set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
       break;
     case bfd_mach_h8300sx:
       /* start-sanitize-redhat */
@@ -1107,11 +1165,14 @@ h8300_gdbarch_init (struct gdbarch_info 
       h8300sxmode = 1;
       h8300smode = 1;
       h8300hmode = 1;
+      set_gdbarch_num_regs (gdbarch, 18);
+      set_gdbarch_register_name (gdbarch, h8300sx_register_name);
+      set_gdbarch_register_byte (gdbarch, h8300h_register_byte);
+      set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
+      set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
       break;
     }
 
-  gdbarch = gdbarch_alloc (&info, 0);
-
   /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
      ready to unwind the PC first (see frame.c:get_prev_frame()).  */
   set_gdbarch_deprecated_init_frame_pc (gdbarch, init_frame_pc_default);
@@ -1120,19 +1181,10 @@ h8300_gdbarch_init (struct gdbarch_info 
    * Basic register fields and methods.
    */
 
-  set_gdbarch_num_regs (gdbarch, E_NUM_REGS);
   set_gdbarch_num_pseudo_regs (gdbarch, 0);
   set_gdbarch_sp_regnum (gdbarch, E_SP_REGNUM);
   set_gdbarch_deprecated_fp_regnum (gdbarch, E_FP_REGNUM);
   set_gdbarch_pc_regnum (gdbarch, E_PC_REGNUM);
-  set_gdbarch_register_name (gdbarch, h8300_register_name);
-  set_gdbarch_deprecated_register_size (gdbarch, BINWORD);
-  set_gdbarch_deprecated_register_bytes (gdbarch, E_NUM_REGS * BINWORD);
-  set_gdbarch_register_byte (gdbarch, h8300_register_byte);
-  set_gdbarch_register_raw_size (gdbarch, h8300_register_raw_size);
-  set_gdbarch_deprecated_max_register_raw_size (gdbarch, h8300h_reg_size);
-  set_gdbarch_register_virtual_size (gdbarch, h8300_register_raw_size);
-  set_gdbarch_deprecated_max_register_virtual_size (gdbarch, h8300h_reg_size);
   set_gdbarch_register_virtual_type (gdbarch, h8300_register_virtual_type);
   set_gdbarch_print_registers_info (gdbarch, h8300_print_registers_info);
   set_gdbarch_print_float_info (gdbarch, h8300_print_float_info);
@@ -1198,8 +1250,6 @@ h8300_gdbarch_init (struct gdbarch_info 
   set_gdbarch_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   set_gdbarch_long_double_bit (gdbarch, 4 * TARGET_CHAR_BIT);
   /* end-sanitize-h8300 */
-  set_gdbarch_ptr_bit (gdbarch, BINWORD * TARGET_CHAR_BIT);
-  set_gdbarch_addr_bit (gdbarch, BINWORD * TARGET_CHAR_BIT);
 
   /* set_gdbarch_stack_align (gdbarch, SOME_stack_align); */
   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
	
-- 
Corinna Vinschen
Cygwin Developer
Red Hat, Inc.
mailto:vinschen@redhat.com


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