This is the mail archive of the
mailing list for the binutils project.
[PATCH] fix gas/gcc incompatibility regression on sparc (PR gas/13441)
- From: Mikael Pettersson <mikpe at it dot uu dot se>
- To: binutils at sourceware dot org
- Date: Sun, 27 Nov 2011 21:25:15 +0100
- Subject: [PATCH] fix gas/gcc incompatibility regression on sparc (PR gas/13441)
This fixes PR gas/13441, a SPARC-specific regression present in the
binutils-2.22 release and on head, caused by the hwcap_allowed change
Before that change gas did not require any explicit option to
accept instructions for later architecture revisions; it would
however record the minimum architecture revision needed by the
The hwcap_allowed change added a second independent mechanism for
checking instruction availability. The new check is always enabled,
but hwcap_allowed is only set if the user passes an explicit -A option.
Without that option hwcap_allowed is always zero, making gas reject any
post-v7 instruction. GCC did not pass that option to gas until very
recently (GCC PR50979 fixed for gcc-4.5 and later on 2011-11-04),
causing "older" gcc binaries to fail if binutils is updated and the
user's code needs post-v7 instructions. In the PR, a signed int
multiply mapped to a v8 "smul" was enough to trigger the failure.
To maintain compatibility with "older" gcc binaries I suggest that
hwcap_allowed be default initialized to all-bits-one rather than zero,
effectively disabling the hwcap_allowed checking in the absence of
any explicit -A option. The case when -A is present is unchanged.
Tested on binutils 2.22 and head with no testsuite regressions.
Ok for 2.22 branch and head?
(I don't have cvs write access, so if it's approved I'll need help
to get it committed.)
2011-11-27 Mikael Pettersson <firstname.lastname@example.org>
* config/tc-sparc.c (hwcap_allowed): Initialize.
(md_parse_option, case 'A'): Override default hwcap_allowed.
--- binutils-2.22/gas/config/tc-sparc.c.~1~ 2011-09-22 02:03:28.000000000 +0200
+++ binutils-2.22/gas/config/tc-sparc.c 2011-11-27 17:04:18.000000000 +0100
@@ -84,7 +84,9 @@ static int hwcap_seen;
-static int hwcap_allowed;
+/* Bitmask of permitted instruction types, set from -A option.
+ Without -A option permits all instruction types. */
+static int hwcap_allowed = ~0;
static int architecture_requested;
static int warn_on_bump;
@@ -507,7 +509,7 @@ md_parse_option (int c, char *arg)
|| opcode_arch > max_architecture)
max_architecture = opcode_arch;
- hwcap_allowed |= sa->hwcap_allowed;
+ hwcap_allowed = sa->hwcap_allowed;
architecture_requested = 1;