This is the mail archive of the gdb@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]

Re: bfd/cpu-powerpc.c problems


Alan Modra writes:
 > On Thu, Apr 18, 2002 at 05:41:07PM -0400, Elena Zannoni wrote:
 > > 
 > > When this change went in,
 > > http://sources.redhat.com/ml/binutils/2002-02/msg00146.html
 > > 
 > > the function bfd_lookup_arch stopped returning a list of all the
 > > powerpc machines when called with arch==bfd_arch_powerpc, and machine==0 as
 > > parameters. This in turn caused the "set architecture" command in gdb
 > > to behave incorrectly.
 > > 
 > > The problem is the lack of a pointer to the first element of the
 > > bfd_powerpc_archs array from the entry for the default machine. Gdb is
 > > relying on retrieving a chain of all the machines available starting
 > > from the default one.
 > 
 > I wasn't aware that gdb used bfd_lookup_arch in this way, and the
 > description of bfd_lookup_arch says nothing about the order of
 > entries in the list.  I guess I can claim gdb is relying on
 > undocumented behaviour.
 > 

Er... I'll let Cagney answer that. I think he did though...


 > The reason the order was changed was so that bfd_default_set_arch_mach
 > works properly when the default target is bfd_mach_ppc64.  The trouble
 > being that with bfd_mach_ppc == 0 and the bfd_mach_ppc entry being at
 > the head of the list results in a non-default entry being returned
 > with mach == 0.  So the change I made is actually a bug fix.
 > 

I see. You need 2 defaults.

 > OK, to accommodate gdb without changing the interface to lookup_arch
 > or bfd_mach_ppc value, we can do this:
 > 
 > bfd/ChangeLog
 > 	* archures.c (bfd_lookup_arch): Add comment on list order.
 > 	(bfd_default_set_arch_mach): Use bfd_lookup_arch.
 > 	* cpu-powerpc.c (bfd_powerpc_archs): Re-order so that the default
 > 	is always at head of list.
 > 
 > If there are no objections, I'll commit this in a day or so.
 > 

This fixes gdb's problem. thanks!

Elena


 > -- 
 > Alan Modra
 > IBM OzLabs - Linux Technology Centre
 > 
 > Index: bfd/archures.c
 > ===================================================================
 > RCS file: /cvs/src/src/bfd/archures.c,v
 > retrieving revision 1.47
 > diff -u -p -r1.47 archures.c
 > --- bfd/archures.c	13 Mar 2002 07:30:45 -0000	1.47
 > +++ bfd/archures.c	19 Apr 2002 00:43:49 -0000
 > @@ -604,21 +604,9 @@ bfd_default_set_arch_mach (abfd, arch, m
 >       enum bfd_architecture arch;
 >       unsigned long mach;
 >  {
 > -  const bfd_arch_info_type * const *app, *ap;
 > -
 > -  for (app = bfd_archures_list; *app != NULL; app++)
 > -    {
 > -      for (ap = *app; ap != NULL; ap = ap->next)
 > -	{
 > -	  if (ap->arch == arch
 > -	      && (ap->mach == mach
 > -		  || (mach == 0 && ap->the_default)))
 > -	    {
 > -	      abfd->arch_info = ap;
 > -	      return true;
 > -	    }
 > -	}
 > -    }
 > +  abfd->arch_info = bfd_lookup_arch (arch, mach);
 > +  if (abfd->arch_info != NULL)
 > +    return true;
 >  
 >    abfd->arch_info = &bfd_default_arch_struct;
 >    bfd_set_error (bfd_error_bad_value);
 > @@ -985,7 +973,9 @@ DESCRIPTION
 >  	Look for the architecure info structure which matches the
 >  	arguments @var{arch} and @var{machine}. A machine of 0 matches the
 >  	machine/architecture structure which marks itself as the
 > -	default.
 > +	default.  gdb relies on the default arch being the first
 > +	entry for the given ARCH so that all the entries for that
 > +	arch can be accessed via ap->next.
 >  */
 >  
 >  const bfd_arch_info_type *
 > Index: bfd/cpu-powerpc.c
 > ===================================================================
 > RCS file: /cvs/src/src/bfd/cpu-powerpc.c,v
 > retrieving revision 1.8
 > diff -u -p -r1.8 cpu-powerpc.c
 > --- bfd/cpu-powerpc.c	5 Feb 2002 03:35:14 -0000	1.8
 > +++ bfd/cpu-powerpc.c	19 Apr 2002 00:43:56 -0000
 > @@ -50,6 +50,65 @@ powerpc_compatible (a,b)
 >  
 >  const bfd_arch_info_type bfd_powerpc_archs[] =
 >  {
 > +#if BFD_DEFAULT_TARGET_SIZE == 64 /* default arch must come first.  */
 > +  {
 > +    64,	/* 64 bits in a word */
 > +    64,	/* 64 bits in an address */
 > +    8,	/* 8 bits in a byte */
 > +    bfd_arch_powerpc,
 > +    bfd_mach_ppc64,
 > +    "powerpc",
 > +    "powerpc:common64",
 > +    3,
 > +    true, /* default for 64 bit target */
 > +    powerpc_compatible,
 > +    bfd_default_scan,
 > +    &bfd_powerpc_archs[1]
 > +  },
 > +  {
 > +    32,	/* 32 bits in a word */
 > +    32,	/* 32 bits in an address */
 > +    8,	/* 8 bits in a byte */
 > +    bfd_arch_powerpc,
 > +    bfd_mach_ppc, /* for the POWER/PowerPC common architecture */
 > +    "powerpc",
 > +    "powerpc:common",
 > +    3,
 > +    false,
 > +    powerpc_compatible,
 > +    bfd_default_scan,
 > +    &bfd_powerpc_archs[2],
 > +  },
 > +#else
 > +  {
 > +    32,	/* 32 bits in a word */
 > +    32,	/* 32 bits in an address */
 > +    8,	/* 8 bits in a byte */
 > +    bfd_arch_powerpc,
 > +    bfd_mach_ppc, /* for the POWER/PowerPC common architecture */
 > +    "powerpc",
 > +    "powerpc:common",
 > +    3,
 > +    true, /* default for 32 bit target */
 > +    powerpc_compatible,
 > +    bfd_default_scan,
 > +    &bfd_powerpc_archs[1],
 > +  },
 > +  {
 > +    64,	/* 64 bits in a word */
 > +    64,	/* 64 bits in an address */
 > +    8,	/* 8 bits in a byte */
 > +    bfd_arch_powerpc,
 > +    bfd_mach_ppc64,
 > +    "powerpc",
 > +    "powerpc:common64",
 > +    3,
 > +    false,
 > +    powerpc_compatible,
 > +    bfd_default_scan,
 > +    &bfd_powerpc_archs[2]
 > +  },
 > +#endif
 >    {
 >      32,	/* 32 bits in a word */
 >      32,	/* 32 bits in an address */
 > @@ -62,7 +121,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[1]
 > +    &bfd_powerpc_archs[3]
 >    },
 >    {
 >      32,	/* 32 bits in a word */
 > @@ -76,7 +135,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[2]
 > +    &bfd_powerpc_archs[4]
 >    },
 >    {
 >      32,	/* 32 bits in a word */
 > @@ -90,7 +149,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[3]
 > +    &bfd_powerpc_archs[5]
 >    },
 >    {
 >      32,	/* 32 bits in a word */
 > @@ -104,7 +163,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[4]
 > +    &bfd_powerpc_archs[6]
 >    },
 >    {
 >      32,	/* 32 bits in a word */
 > @@ -118,7 +177,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[5]
 > +    &bfd_powerpc_archs[7]
 >    },
 >    {
 >      64,	/* 64 bits in a word */
 > @@ -132,7 +191,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[6]
 > +    &bfd_powerpc_archs[8]
 >    },
 >    {
 >      64,	/* 64 bits in a word */
 > @@ -146,7 +205,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[7]
 > +    &bfd_powerpc_archs[9]
 >    },
 >    {
 >      64,	/* 64 bits in a word */
 > @@ -160,7 +219,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[8]
 > +    &bfd_powerpc_archs[10]
 >    },
 >    {
 >      64,	/* 64 bits in a word */
 > @@ -174,7 +233,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[9]
 > +    &bfd_powerpc_archs[11]
 >    },
 >    {
 >      64,	/* 64 bits in a word */
 > @@ -188,7 +247,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[10]
 > +    &bfd_powerpc_archs[12]
 >    },
 >    {
 >      32,	/* 32 bits in a word */
 > @@ -202,7 +261,7 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      false, /* not the default */
 >      powerpc_compatible,
 >      bfd_default_scan,
 > -    &bfd_powerpc_archs[11]
 > +    &bfd_powerpc_archs[13]
 >    },
 >    {
 >      32,       /* 32 bits in a word */
 > @@ -214,34 +273,6 @@ const bfd_arch_info_type bfd_powerpc_arc
 >      "powerpc:MPC8XX",
 >      3,
 >      false, /* not the default */
 > -    powerpc_compatible,
 > -    bfd_default_scan,
 > -    &bfd_powerpc_archs[12]
 > -  },
 > -  {
 > -    64,	/* 64 bits in a word */
 > -    64,	/* 64 bits in an address */
 > -    8,	/* 8 bits in a byte */
 > -    bfd_arch_powerpc,
 > -    bfd_mach_ppc64,
 > -    "powerpc",
 > -    "powerpc:common64",
 > -    3,
 > -    BFD_DEFAULT_TARGET_SIZE == 64, /* default for 64 bit target */
 > -    powerpc_compatible,
 > -    bfd_default_scan,
 > -    &bfd_powerpc_archs[13]
 > -  },
 > -  {
 > -    32,	/* 32 bits in a word */
 > -    32,	/* 32 bits in an address */
 > -    8,	/* 8 bits in a byte */
 > -    bfd_arch_powerpc,
 > -    bfd_mach_ppc, /* for the POWER/PowerPC common architecture */
 > -    "powerpc",
 > -    "powerpc:common",
 > -    3,
 > -    BFD_DEFAULT_TARGET_SIZE != 64, /* default for 32 bit target */
 >      powerpc_compatible,
 >      bfd_default_scan,
 >      0


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