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

Bug#448480: GCC miscompilation on ARM



Package: gcc
Version: 4:4.1.1-15

GCC miscompiles the following code :-

extern void extfunc(void);
extern unsigned extvar;

static void inner(char *a, unsigned b)
{
	if (b)
		extfunc();
	else
		extvar = (unsigned) a;
}

void outer(unsigned a, unsigned b)
{
	char c;

	c = a;

	inner(&c, b);
}

/*
 * with Debian Etch gcc
 *
 * gcc -O2 -c -o test.o test.c
 *
 * objdump -d test.o
 *
 * the initialisation of "c" that is needed
 * for the assignment to "extvar" is done
 * in the wrong leg of the if() !!
 *

test.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <outer>:
   0:	e52de004 	str	lr, [sp, #-4]!
   4:	e3510000 	cmp	r1, #0	; 0x0
   8:	e24dd004 	sub	sp, sp, #4	; 0x4
   c:	059f301c 	ldreq	r3, [pc, #28]	; 30 <.text+0x30>
  10:	028d2003 	addeq	r2, sp, #3	; 0x3
  14:	05832000 	streq	r2, [r3]
  18:	1a000001 	bne	24 <outer+0x24>
  1c:	e28dd004 	add	sp, sp, #4	; 0x4
  20:	e8bd8000 	ldmia	sp!, {pc}
  24:	e5cd0003 	strb	r0, [sp, #3]
  28:	ebfffffe 	bl	0 <extfunc>
  2c:	eafffffa 	b	1c <outer+0x1c>
  30:	00000000 	andeq	r0, r0, r0

*/

/*

Using built-in specs.
Target: arm-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release arm-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

*/

/*
 * same but with Debian Etch gcc-3.4
 *
 * this one is correct
 *

test.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <outer>:
   0:	e52de004 	str	lr, [sp, #-4]!
   4:	e3510000 	cmp	r1, #0	; 0x0
   8:	059f3020 	ldreq	r3, [pc, #32]	; 30 <.text+0x30>
   c:	e24dd004 	sub	sp, sp, #4	; 0x4
  10:	e28d2004 	add	r2, sp, #4	; 0x4
  14:	e5620001 	strb	r0, [r2, #-1]!
  18:	05832000 	streq	r2, [r3]
  1c:	1a000001 	bne	28 <outer+0x28>
  20:	e28dd004 	add	sp, sp, #4	; 0x4
  24:	e8bd8000 	ldmia	sp!, {pc}
  28:	ebfffffe 	bl	0 <extfunc>
  2c:	eafffffb 	b	20 <outer+0x20>
  30:	00000000 	andeq	r0, r0, r0

*/





Reply to: