diff options
author | 2014-10-20 06:04:06 +0000 | |
---|---|---|
committer | 2014-10-20 06:04:06 +0000 | |
commit | 20399be96d7986f189235a0b0f960fce1d2d1196 (patch) | |
tree | 6b8b9ccedbacf2526b2b93e5085bf4270723bb29 | |
parent | use sha512 instead of md5 for tcp isn. ok deraadt (diff) | |
download | wireguard-openbsd-20399be96d7986f189235a0b0f960fce1d2d1196.tar.xz wireguard-openbsd-20399be96d7986f189235a0b0f960fce1d2d1196.zip |
Backport fix for binutils 11867: .quad directive not assembled correctly.
Alan Modra (and Alan's employer) graciously permitted use of his patch
under GPLv2.
ok kettenis@
-rw-r--r-- | gnu/usr.bin/binutils-2.17/gas/expr.c | 21 | ||||
-rw-r--r-- | gnu/usr.bin/binutils-2.17/gas/read.c | 23 | ||||
-rw-r--r-- | gnu/usr.bin/binutils/gas/expr.c | 21 | ||||
-rw-r--r-- | gnu/usr.bin/binutils/gas/read.c | 23 |
4 files changed, 68 insertions, 20 deletions
diff --git a/gnu/usr.bin/binutils-2.17/gas/expr.c b/gnu/usr.bin/binutils-2.17/gas/expr.c index 69f0aaccdb6..1939c111617 100644 --- a/gnu/usr.bin/binutils-2.17/gas/expr.c +++ b/gnu/usr.bin/binutils-2.17/gas/expr.c @@ -1046,6 +1046,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) { @@ -1056,14 +1065,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 diff --git a/gnu/usr.bin/binutils-2.17/gas/read.c b/gnu/usr.bin/binutils-2.17/gas/read.c index 6972f79add2..d26f0cce732 100644 --- a/gnu/usr.bin/binutils-2.17/gas/read.c +++ b/gnu/usr.bin/binutils-2.17/gas/read.c @@ -3816,15 +3816,32 @@ emit_expr (expressionS *exp, unsigned int nbytes) unsigned int size; LITTLENUM_TYPE *nums; - know (nbytes % CHARS_PER_LITTLENUM == 0); - size = exp->X_add_number * CHARS_PER_LITTLENUM; if (nbytes < size) { - as_warn (_("bignum truncated to %d bytes"), nbytes); + int i = nbytes / CHARS_PER_LITTLENUM; + if (i != 0) + { + LITTLENUM_TYPE sign = 0; + if ((generic_bignum[--i] + & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0) + sign = ~(LITTLENUM_TYPE) 0; + while (++i < exp->X_add_number) + if (generic_bignum[i] != sign) + break; + } + if (i < exp->X_add_number) + as_warn (_("bignum truncated to %d bytes"), nbytes); size = nbytes; } + if (nbytes == 1) + { + md_number_to_chars (p, (valueT) generic_bignum[0], 1); + return; + } + know (nbytes % CHARS_PER_LITTLENUM == 0); + if (target_big_endian) { while (nbytes > size) diff --git a/gnu/usr.bin/binutils/gas/expr.c b/gnu/usr.bin/binutils/gas/expr.c index 460a8372dd2..961bb36ed2a 100644 --- a/gnu/usr.bin/binutils/gas/expr.c +++ b/gnu/usr.bin/binutils/gas/expr.c @@ -1085,6 +1085,15 @@ operand (expressionS *expressionP) { 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) { @@ -1095,14 +1104,12 @@ operand (expressionS *expressionP) } 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 diff --git a/gnu/usr.bin/binutils/gas/read.c b/gnu/usr.bin/binutils/gas/read.c index 587856ef8b7..040bc11cb50 100644 --- a/gnu/usr.bin/binutils/gas/read.c +++ b/gnu/usr.bin/binutils/gas/read.c @@ -3549,15 +3549,32 @@ emit_expr (expressionS *exp, unsigned int nbytes) unsigned int size; LITTLENUM_TYPE *nums; - know (nbytes % CHARS_PER_LITTLENUM == 0); - size = exp->X_add_number * CHARS_PER_LITTLENUM; if (nbytes < size) { - as_warn (_("bignum truncated to %d bytes"), nbytes); + int i = nbytes / CHARS_PER_LITTLENUM; + if (i != 0) + { + LITTLENUM_TYPE sign = 0; + if ((generic_bignum[--i] + & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0) + sign = ~(LITTLENUM_TYPE) 0; + while (++i < exp->X_add_number) + if (generic_bignum[i] != sign) + break; + } + if (i < exp->X_add_number) + as_warn (_("bignum truncated to %d bytes"), nbytes); size = nbytes; } + if (nbytes == 1) + { + md_number_to_chars (p, (valueT) generic_bignum[0], 1); + return; + } + know (nbytes % CHARS_PER_LITTLENUM == 0); + if (target_big_endian) { while (nbytes > size) |