Date: Wed, 31 Dec 2014 04:51:10 +0000 (UTC) From: "Pedro F. Giffuni" <pfg@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r276448 - stable/10/contrib/binutils/gas Message-ID: <201412310451.sBV4pAx6000591@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: pfg Date: Wed Dec 31 04:51:09 2014 New Revision: 276448 URL: https://svnweb.freebsd.org/changeset/base/276448 Log: 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 Modified: stable/10/contrib/binutils/gas/expr.c stable/10/contrib/binutils/gas/read.c Directory Properties: stable/10/ (props changed) Modified: stable/10/contrib/binutils/gas/expr.c ============================================================================== --- stable/10/contrib/binutils/gas/expr.c Wed Dec 31 04:12:38 2014 (r276447) +++ stable/10/contrib/binutils/gas/expr.c Wed Dec 31 04:51:09 2014 (r276448) @@ -1040,6 +1040,15 @@ operand (expressionS *expressionP, enum { 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 } 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 Modified: stable/10/contrib/binutils/gas/read.c ============================================================================== --- stable/10/contrib/binutils/gas/read.c Wed Dec 31 04:12:38 2014 (r276447) +++ stable/10/contrib/binutils/gas/read.c Wed Dec 31 04:51:09 2014 (r276448) @@ -4117,15 +4117,32 @@ emit_expr (expressionS *exp, unsigned in 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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201412310451.sBV4pAx6000591>