From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1026 invoked by alias); 14 Nov 2003 14:49:13 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 1019 invoked from network); 14 Nov 2003 14:49:12 -0000 Received: from unknown (HELO localhost.redhat.com) (216.129.200.20) by sources.redhat.com with SMTP; 14 Nov 2003 14:49:12 -0000 Received: from redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 0039A2B8F; Fri, 14 Nov 2003 09:49:08 -0500 (EST) Message-ID: <3FB4EB64.3080106@redhat.com> Date: Fri, 14 Nov 2003 14:49:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.2) Gecko/20030820 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Dhananjay R. Deshpande" Cc: gdb-patches@sources.redhat.com Subject: Re: H8300 Patch - Fix GDB crash problem when object file of different H8 cpu is loaded References: <69595093233BB547BB70CF5E492B63F202B1061C@sohm.kpit.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2003-11/txt/msg00295.txt.bz2 > 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. 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 > Changelog - > > 2003-11-14 Dhananjay Deshpande > * 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); > } > ================================================================================= >