[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#758964: gcc-4.9 assembler errors when building md5 code from fbb on arm64



Package: gcc-4.9
Version: 4.9.1-7
x-debbugs-cc: fbb@packages.debian.org
Control:| affects -1 fbb|

While building the latest version of fbb (the previous version built successfully) for arm64 the autobuilders (both on debian-ports and debian official) ran into the following error. They were using gcc-4.9 version 4.9.1-7

gcc -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall -Wstrict-prototypes -O2 -g -funsigned-char  -D__LINUX__ -DPROTOTYPES -I../include -DUSE_NCURSES -D_FORTIFY_SOURCE=2  -c -o md5c.o md5c.c
/tmp/ccrwJ404.s: Assembler messages:
/tmp/ccrwJ404.s:609: Error: operand 1 should be an integer register -- `ldr v12,[x1]'
/tmp/ccrwJ404.s:610: Error: invalid use of vector register at operand 1 -- `eor v12,x6,v12'
<builtin>: recipe for target 'md5c.o' failed

I was able to reproducte this locally (under user mode qemu) with 4.9.1-8 and have prepared a reduced (though unfortunately stil fairly large) testcase.

root@debian:/# gcc -g -fstack-protector-strong -O2 -c -o test.o test.c
/tmp/ccap2vnU.s: Assembler messages:
/tmp/ccap2vnU.s:421: Error: operand 1 should be an integer register -- `ldr v7,[x0]' /tmp/ccap2vnU.s:422: Error: invalid use of vector register at operand 1 -- `eor v7,x8,v7'
root@debian:/#

It seems this bug can be worked around by adding -fno-inline-small-functions and -fno-inline-functions-called-once (note: the first of these is sufficient with the reduced testcase where I removed static to make reduction work easier, both are needed with the original code) or removing -fstack-protector-strong

I've also attatched the debdiff I used to test if fbb built successfully with the workaround, note that this is NOT suitable for uploading to debian in it's present form, if it was to be uploaded then you would want to wrap it in suitable conditional logic. Personally though I don't think it's worth uploading a workaround (a proper fix is another matter) for an arm64 build failure in a low popcon leaf package at this point.


//test code for compiler bug, don't expect this to do anything useful
   /****************************************************************
    Copyright (C) 1986-2000 by

    F6FBB - Jean-Paul ROUBELAT
    6, rue George Sand
    31120 - Roquettes - France
	jpr@f6fbb.org

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    Parts of code have been taken from many other softwares.
    Thanks for the help.
    ****************************************************************/
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
 */

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
   rights reserved.

   License to copy and use this software is granted provided that it
   is identified as the "RSA Data Security, Inc. MD5 Message-Digest
   Algorithm" in all material mentioning or referencing this software
   or this function.

   License is also granted to make and use derivative works provided
   that such works are identified as "derived from the RSA Data
   Security, Inc. MD5 Message-Digest Algorithm" in all material
   mentioning or referencing the derived work.

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */

typedef unsigned char *POINTER;
typedef unsigned short int UINT2;
typedef unsigned long int UINT4;
#define uchar char
#define PROTO_LIST(list) list

//#include "global.h"
//#include "md5.h"

/* Constants for MD5Transform routine.
 */
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21

void MD5Transform PROTO_LIST ((UINT4[4], uchar[64]));
void Encode PROTO_LIST
  ((uchar *, UINT4 *, unsigned int));
void Decode PROTO_LIST
  ((UINT4 *, uchar *, unsigned int));
void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));

/* F, G, H and I are basic MD5 functions.
 */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

/* ROTATE_LEFT rotates x left n bits.
 */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
   Rotation is separate from addition to prevent recomputation.
 */
#define FF(a, b, c, d, x, s, ac) { \
 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define GG(a, b, c, d, x, s, ac) { \
 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define HH(a, b, c, d, x, s, ac) { \
 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define II(a, b, c, d, x, s, ac) { \
 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }


/* MD5 basic transformation. Transforms state based on block.
 */
void MD5Transform (state, block)
	 UINT4 state[4];
	 uchar block[64];
{
	UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];

	Decode (x, block, 64);

	/* Round 1 */
	FF (a, b, c, d, x[0], S11, 0xd76aa478L);	/* 1 */
	FF (d, a, b, c, x[1], S12, 0xe8c7b756L);	/* 2 */
	FF (c, d, a, b, x[2], S13, 0x242070dbL);	/* 3 */
	FF (b, c, d, a, x[3], S14, 0xc1bdceeeL);	/* 4 */
	FF (a, b, c, d, x[4], S11, 0xf57c0fafL);	/* 5 */
	FF (d, a, b, c, x[5], S12, 0x4787c62aL);	/* 6 */
	FF (c, d, a, b, x[6], S13, 0xa8304613L);	/* 7 */
	FF (b, c, d, a, x[7], S14, 0xfd469501L);	/* 8 */
	FF (a, b, c, d, x[8], S11, 0x698098d8L);	/* 9 */
	FF (d, a, b, c, x[9], S12, 0x8b44f7afL);	/* 10 */
	FF (c, d, a, b, x[10], S13, 0xffff5bb1L);	/* 11 */
	FF (b, c, d, a, x[11], S14, 0x895cd7beL);	/* 12 */
	FF (a, b, c, d, x[12], S11, 0x6b901122L);	/* 13 */
	FF (d, a, b, c, x[13], S12, 0xfd987193L);	/* 14 */
	FF (c, d, a, b, x[14], S13, 0xa679438eL);	/* 15 */
	FF (b, c, d, a, x[15], S14, 0x49b40821L);	/* 16 */

	/* Round 2 */
	GG (a, b, c, d, x[1], S21, 0xf61e2562L);	/* 17 */
	GG (d, a, b, c, x[6], S22, 0xc040b340L);	/* 18 */
	GG (c, d, a, b, x[11], S23, 0x265e5a51L);	/* 19 */
	GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL);	/* 20 */
	GG (a, b, c, d, x[5], S21, 0xd62f105dL);	/* 21 */
	GG (d, a, b, c, x[10], S22, 0x2441453L);	/* 22 */
	GG (c, d, a, b, x[15], S23, 0xd8a1e681L);	/* 23 */
	GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L);	/* 24 */
	GG (a, b, c, d, x[9], S21, 0x21e1cde6L);	/* 25 */
	GG (d, a, b, c, x[14], S22, 0xc33707d6L);	/* 26 */
	GG (c, d, a, b, x[3], S23, 0xf4d50d87L);	/* 27 */
	GG (b, c, d, a, x[8], S24, 0x455a14edL);	/* 28 */
	GG (a, b, c, d, x[13], S21, 0xa9e3e905L);	/* 29 */
	GG (d, a, b, c, x[2], S22, 0xfcefa3f8L);	/* 30 */
	GG (c, d, a, b, x[7], S23, 0x676f02d9L);	/* 31 */
	GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL);	/* 32 */

	/* Round 3 */
	HH (a, b, c, d, x[5], S31, 0xfffa3942L);	/* 33 */
	HH (d, a, b, c, x[8], S32, 0x8771f681L);	/* 34 */
	HH (c, d, a, b, x[11], S33, 0x6d9d6122L);	/* 35 */
	HH (b, c, d, a, x[14], S34, 0xfde5380cL);	/* 36 */
	HH (a, b, c, d, x[1], S31, 0xa4beea44L);	/* 37 */
	HH (d, a, b, c, x[4], S32, 0x4bdecfa9L);	/* 38 */
	HH (c, d, a, b, x[7], S33, 0xf6bb4b60L);	/* 39 */
	HH (b, c, d, a, x[10], S34, 0xbebfbc70L);	/* 40 */
	HH (a, b, c, d, x[13], S31, 0x289b7ec6L);	/* 41 */
	HH (d, a, b, c, x[0], S32, 0xeaa127faL);	/* 42 */
	HH (c, d, a, b, x[3], S33, 0xd4ef3085L);	/* 43 */
	HH (b, c, d, a, x[6], S34, 0x4881d05L);		/* 44 */
	HH (a, b, c, d, x[9], S31, 0xd9d4d039L);	/* 45 */
	HH (d, a, b, c, x[12], S32, 0xe6db99e5L);	/* 46 */
	HH (c, d, a, b, x[15], S33, 0x1fa27cf8L);	/* 47 */
	HH (b, c, d, a, x[2], S34, 0xc4ac5665L);	/* 48 */

	state[0] += a;
	state[1] += b;
	state[2] += c;
	state[3] += d;

	/* Zeroize sensitive information.
	 */
	MD5_memset ((POINTER) x, 0, sizeof (x));
}

////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/* Note: Replace "for loop" with standard memset if possible.
 */
void MD5_memset (output, value, len)
	 POINTER output;
	 int value;
	 unsigned int len;
{
	unsigned int i;

	for (i = 0; i < len; i++)
		((char *) output)[i] = (char) value;
}
diff -Nru fbb-7.05f/debian/changelog fbb-7.05f/debian/changelog
--- fbb-7.05f/debian/changelog	2014-08-20 08:24:20.000000000 +0000
+++ fbb-7.05f/debian/changelog	2014-08-23 08:32:12.000000000 +0000
@@ -1,3 +1,9 @@
+fbb (7.05f-1+test1) UNRELEASED; urgency=medium
+
+  * Use -fno-inline-small-functions and -fno-inline-functions-called-once to work arround compiler bug.
+
+ -- root <root@debian>  Sat, 23 Aug 2014 08:30:44 +0000
+
 fbb (7.05f-1) unstable; urgency=medium
 
   * Added myself to uploaders
diff -Nru fbb-7.05f/debian/rules fbb-7.05f/debian/rules
--- fbb-7.05f/debian/rules	2014-08-18 19:18:19.000000000 +0000
+++ fbb-7.05f/debian/rules	2014-08-23 09:13:15.000000000 +0000
@@ -5,6 +5,8 @@
 DPKG_EXPORT_BUILDFLAGS = 1
 include /usr/share/dpkg/buildflags.mk
 
+export CFLAGS += -fno-inline-small-functions -fno-inline-functions-called-once
+
 package=fbb
 
 build: build-arch build-indep

Reply to: