This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: H8300 Patch - Fix GDB crash problem when object file of differentH8 cpu is loaded
- From: Michael Snyder <msnyder at redhat dot com>
- To: Andrew Cagney <ac131313 at redhat dot com>
- Cc: "Dhananjay R. Deshpande" <dhananjayd at KPITCummins dot com>, gdb-patches at sources dot redhat dot com
- Date: Fri, 14 Nov 2003 12:03:38 -0800
- Subject: Re: H8300 Patch - Fix GDB crash problem when object file of differentH8 cpu is loaded
- Organization: Red Hat, Inc.
- References: <69595093233BB547BB70CF5E492B63F202B1061C@sohm.kpit.com> <3FB4EB64.3080106@redhat.com>
Andrew Cagney wrote:
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.
Unfortunatly this isn't the right way to go. Because it is now possible
for GDB can have more than one active architecture, code that rely on
global state can no longer work. The globals:
> + h8300_normal_mode = 0;
> + h8300sxmode = 0;
> + h8300smode = 0;
> + h8300hmode = 0;
will need to be eliminated.
Would it be appropriate to move them into the gdbarch_tdep struct?
> Looking at your patch it doesn't look too
bad. Given h8300smode, I'd replace it with a function vis:
int
h8300smode (struct gdbarch *gdbarch)
{
return gdbarch_bfd_arch_info (current_gdbarch)->mach == bfd_mach_h8300s
}
and called:
if (h8300smode (current_gdbarch))
Andrew
The only problem is, these functions would be called from the sim.
Since the sim doesn't know about struct gdbarch, and since you've
written them as using the global current_gdbarch anyway, they
probably should have no argument.
Michael
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);
}
=================================================================================