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]

H8300 Patch - Fix GDB crash problem when object file of different H8 cpu is loaded


Hi,

Currently if you are debugging one object and load another object of different 
H8 CPU then the GDB crashes in h8300_register_name() saying "invalid register number". This is because in gdbarch_init we are returning existing gdbarch but 
the globals h8300hmode, h8300smode, etc. are not set again corresponding to 
newly loaded object.

The patch below initializes these globals before returning existing gdbarch.

Regards,
Dhananjay

Changelog - 

2003-11-14  Dhananjay Deshpande <dhananjayd@kpitcummins.com>
        * gdb/h8300-tdep.c (h8300_gdbarch_init): Set globals before returning existing gdbarch

=================================================================================
--- gdb/h8300-tdep.c.old	2003-11-12 13:51:36.000000000 +0530
+++ gdb/h8300-tdep.c	2003-11-14 11:08:29.000000000 +0530
@@ -1176,6 +1176,53 @@ h8300_gdbarch_init (struct gdbarch_info 
   struct gdbarch_tdep *tdep = NULL;
   struct gdbarch *gdbarch;
 
+  /* Set globals */
+  switch (info.bfd_arch_info->mach)
+    {
+    case bfd_mach_h8300:
+      h8300_normal_mode = 0;
+      h8300sxmode = 0;
+      h8300smode = 0;
+      h8300hmode = 0;
+      break;
+    case bfd_mach_h8300h:
+      h8300_normal_mode = 0;
+      h8300sxmode = 0;
+      h8300smode = 0;
+      h8300hmode = 1;
+      break;
+    case bfd_mach_h8300hn:
+      h8300_normal_mode = 1;
+      h8300sxmode = 0;
+      h8300smode = 0;
+      h8300hmode = 1;
+      break;
+    case bfd_mach_h8300s:
+      h8300_normal_mode = 0;
+      h8300sxmode = 0;
+      h8300smode = 1;
+      h8300hmode = 1;
+      break;
+    case bfd_mach_h8300sn:
+      h8300_normal_mode = 1;
+      h8300sxmode = 0;
+      h8300smode = 1;
+      h8300hmode = 1;
+      break;
+    case bfd_mach_h8300sx:
+      h8300_normal_mode = 0;
+      h8300sxmode = 1;
+      h8300smode = 1;
+      h8300hmode = 1;
+      break;
+    case bfd_mach_h8300sxn:
+      h8300_normal_mode = 1;
+      h8300sxmode = 1;
+      h8300smode = 1;
+      h8300hmode = 1;
+      break;
+    }
+
   arches = gdbarch_list_lookup_by_info (arches, &info);
   if (arches != NULL)
     return arches->gdbarch;
@@ -1192,9 +1239,6 @@ h8300_gdbarch_init (struct gdbarch_info 
   switch (info.bfd_arch_info->mach)
     {
     case bfd_mach_h8300:
-      h8300sxmode = 0;
-      h8300smode = 0;
-      h8300hmode = 0;
       set_gdbarch_num_regs (gdbarch, 13);
       set_gdbarch_num_pseudo_regs (gdbarch, 1);
       set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300_dbg_reg_to_regnum);
@@ -1210,9 +1254,6 @@ h8300_gdbarch_init (struct gdbarch_info 
       break;
     case bfd_mach_h8300h:
     case bfd_mach_h8300hn:
-      h8300sxmode = 0;
-      h8300smode = 0;
-      h8300hmode = 1;
       set_gdbarch_num_regs (gdbarch, 13);
       set_gdbarch_num_pseudo_regs (gdbarch, 1);
       set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300_dbg_reg_to_regnum);
@@ -1222,13 +1263,11 @@ h8300_gdbarch_init (struct gdbarch_info 
       set_gdbarch_register_name (gdbarch, h8300_register_name);
       if(info.bfd_arch_info->mach != bfd_mach_h8300hn)
         {
-          h8300_normal_mode = 0;
           set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
           set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
         }
       else
         {
-          h8300_normal_mode = 1;
           set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
           set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
         }
@@ -1238,9 +1277,6 @@ h8300_gdbarch_init (struct gdbarch_info 
       break;
     case bfd_mach_h8300s:
     case bfd_mach_h8300sn:
-      h8300sxmode = 0;
-      h8300smode = 1;
-      h8300hmode = 1;
       set_gdbarch_num_regs (gdbarch, 16);
       set_gdbarch_num_pseudo_regs (gdbarch, 2);
       set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
@@ -1250,13 +1286,11 @@ h8300_gdbarch_init (struct gdbarch_info 
       set_gdbarch_register_name (gdbarch, h8300s_register_name);
       if(info.bfd_arch_info->mach != bfd_mach_h8300sn)
         {
-          h8300_normal_mode = 0;
           set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
           set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
         }
       else
         {
-          h8300_normal_mode = 1;
           set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
           set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
         }
@@ -1266,9 +1300,6 @@ h8300_gdbarch_init (struct gdbarch_info 
       break;
     case bfd_mach_h8300sx:
     case bfd_mach_h8300sxn:
-      h8300sxmode = 1;
-      h8300smode = 1;
-      h8300hmode = 1;
       set_gdbarch_num_regs (gdbarch, 18);
       set_gdbarch_num_pseudo_regs (gdbarch, 2);
       set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
@@ -1278,13 +1309,11 @@ h8300_gdbarch_init (struct gdbarch_info 
       set_gdbarch_register_name (gdbarch, h8300sx_register_name);
       if(info.bfd_arch_info->mach != bfd_mach_h8300sxn)
         {
-          h8300_normal_mode = 0;
           set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
           set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
         }
       else
         {
-          h8300_normal_mode = 1;
           set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
           set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
         }
=================================================================================


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