This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: bfd/cpu-powerpc.c problems
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: Elena Zannoni <ezannoni at redhat dot com>
- Cc: binutils at sources dot redhat dot com, gdb at sources dot redhat dot com
- Date: Fri, 19 Apr 2002 10:21:52 +0930
- Subject: Re: bfd/cpu-powerpc.c problems
- References: <15551.15731.382543.643107@localhost.redhat.com>
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.
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.
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.
--
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