diff options
author | pfg <pfg@FreeBSD.org> | 2014-12-31 04:51:09 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2014-12-31 04:51:09 +0000 |
commit | a8909671a4e648a0d5dbcae5756f3d8862f975f7 (patch) | |
tree | 88e3c35765ec870c04a6a5ba44be4ecc9673f7d1 /contrib/binutils/gas/expr.c | |
parent | eb8065a6a6ca8a4894af3382dbfbea4135bffd0a (diff) | |
download | FreeBSD-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.c | 21 |
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 |