This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
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