summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordaniel <daniel@openbsd.org>2014-10-20 06:04:06 +0000
committerdaniel <daniel@openbsd.org>2014-10-20 06:04:06 +0000
commit20399be96d7986f189235a0b0f960fce1d2d1196 (patch)
tree6b8b9ccedbacf2526b2b93e5085bf4270723bb29
parentuse sha512 instead of md5 for tcp isn. ok deraadt (diff)
downloadwireguard-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.c21
-rw-r--r--gnu/usr.bin/binutils-2.17/gas/read.c23
-rw-r--r--gnu/usr.bin/binutils/gas/expr.c21
-rw-r--r--gnu/usr.bin/binutils/gas/read.c23
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)