From owner-svn-src-all@FreeBSD.ORG  Wed Dec 31 04:51:10 2014
Return-Path: <owner-svn-src-all@FreeBSD.ORG>
Delivered-To: svn-src-all@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115])
 (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
 (No client certificate requested)
 by hub.freebsd.org (Postfix) with ESMTPS id ACFA58A6;
 Wed, 31 Dec 2014 04:51:10 +0000 (UTC)
Received: from svn.freebsd.org (svn.freebsd.org
 [IPv6:2001:1900:2254:2068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id 8E7392432;
 Wed, 31 Dec 2014 04:51:10 +0000 (UTC)
Received: from svn.freebsd.org ([127.0.1.70])
 by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sBV4pA3M000593;
 Wed, 31 Dec 2014 04:51:10 GMT (envelope-from pfg@FreeBSD.org)
Received: (from pfg@localhost)
 by svn.freebsd.org (8.14.9/8.14.9/Submit) id sBV4pAx6000591;
 Wed, 31 Dec 2014 04:51:10 GMT (envelope-from pfg@FreeBSD.org)
Message-Id: <201412310451.sBV4pAx6000591@svn.freebsd.org>
X-Authentication-Warning: svn.freebsd.org: pfg set sender to pfg@FreeBSD.org
 using -f
From: "Pedro F. Giffuni" <pfg@FreeBSD.org>
Date: Wed, 31 Dec 2014 04:51:10 +0000 (UTC)
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
X-SVN-Group: stable-10
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.18-1
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
 user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all/>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 31 Dec 2014 04:51:10 -0000

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)