summaryrefslogtreecommitdiffstats
path: root/contrib/binutils/gas/expr.c
diff options
context:
space:
mode:
authorpfg <pfg@FreeBSD.org>2014-12-31 04:51:09 +0000
committerpfg <pfg@FreeBSD.org>2014-12-31 04:51:09 +0000
commita8909671a4e648a0d5dbcae5756f3d8862f975f7 (patch)
tree88e3c35765ec870c04a6a5ba44be4ecc9673f7d1 /contrib/binutils/gas/expr.c
parenteb8065a6a6ca8a4894af3382dbfbea4135bffd0a (diff)
downloadFreeBSD-src-a8909671a4e648a0d5dbcae5756f3d8862f975f7.zip
FreeBSD-src-a8909671a4e648a0d5dbcae5756f3d8862f975f7.tar.gz
MFC r276229:
Backport fix for binutils 11867: .quad directive not assembled correctly Alan Modra (and Alan's employer) graciously permitted use of his patch under GPLv2. Obtained from: OpenBSD
Diffstat (limited to 'contrib/binutils/gas/expr.c')
-rw-r--r--contrib/binutils/gas/expr.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/contrib/binutils/gas/expr.c b/contrib/binutils/gas/expr.c
index 11f2942..3f364b5 100644
--- a/contrib/binutils/gas/expr.c
+++ b/contrib/binutils/gas/expr.c
@@ -1040,6 +1040,15 @@ operand (expressionS *expressionP, enum expr_mode mode)
{
for (i = 0; i < expressionP->X_add_number; ++i)
generic_bignum[i] = ~generic_bignum[i];
+
+ /* Extend the bignum to at least the size of .octa. */
+ if (expressionP->X_add_number < SIZE_OF_LARGE_NUMBER)
+ {
+ expressionP->X_add_number = SIZE_OF_LARGE_NUMBER;
+ for (; i < expressionP->X_add_number; ++i)
+ generic_bignum[i] = ~(LITTLENUM_TYPE) 0;
+ }
+
if (c == '-')
for (i = 0; i < expressionP->X_add_number; ++i)
{
@@ -1050,14 +1059,12 @@ operand (expressionS *expressionP, enum expr_mode mode)
}
else if (c == '!')
{
- int nonzero = 0;
for (i = 0; i < expressionP->X_add_number; ++i)
- {
- if (generic_bignum[i])
- nonzero = 1;
- generic_bignum[i] = 0;
- }
- generic_bignum[0] = nonzero;
+ if (generic_bignum[i] != 0)
+ break;
+ expressionP->X_add_number = i >= expressionP->X_add_number;
+ expressionP->X_op = O_constant;
+ expressionP->X_unsigned = 1;
}
}
else if (expressionP->X_op != O_illegal
OpenPOWER on IntegriCloud