GCC bug!

Fabio Alemagna falemagn@studenti.unina.it
Mon Feb 14 08:06:00 GMT 2000


Hi all.

I've dicovered a bug in gcc. It happens only in some circumstances: I've
discovered one of these, maybe there are others.

In attach you can see a limited, purified version of the program which
cause
the bug to happen.

To compile it just type "make". Eventually modify the header config.h to
match
your system. I know, the code is in some parts very ugly, but it's in a
very
early stage of completion, so do not take care of this.

My system configuration is:

a PC with Pentium II processor, Linux RedHat 6.1, egcs version 2.91.66
*NOT MODIFIED*, kernel version 2.2.12-20.

Working whit gdb and disassembled code I've noticed that the compiler
trash a
register in calling a function which have been declared have arguments
passed
in register.

*IMPORTANT*
* THIS HAPPEN ONLY, REPEAT *ONLY*, IF I COMPILE WITH -O2 FLAG: -O3, -O1
and
* -O0 works.
* Moreover this happens *only* if I declare function
* include/events.h/event_schedule(struct event *, ULONG) have parameter
passed
* in register instead of be inline or a normal function with parameters
on
* stack


the place where the bug happen is custom/custom.c at line 160:
	copi1 = chipmem_bank.wget(cop_pc);

where cop_pc is the parameter trashed.

Below there are the disassembled versions of this piece of code, the
first is
compiled whith -O2 flag, which make the bug to happens, the 2nd is
compiled
whith -O3 flag:

-O2 version (BUG)
	movl cop_pc,%ecx
	movl %ecx,%eax               #first use of eax and inutile intruction
(why
	                             #not movl cop_pc,%eax ???
  	movl chipmem_bank+16,%eax    #eax trashed!!!
  	call *%eax                   #this function get parameter in eax,
which
	                             #here is used like a funtion pointer!!  	
	movl %eax,%ecx               #inutile instruction.... :/
 	movl %ecx,%ebx

-O3 version (SANE)
 	movl cop_pc,%ecx             #(1)
	movl chipmem_bank+16,%edx
	movl %ecx,%eax               #(2)
	call *%edx
	movl %eax,%edx               #inutile instruction.... :/
	movl %edx,%ebx
#(1) and (2) are a couple of inutile intructions, why not movl
cop_pc,%eax???
		
I think a cleaner, faster and bugless implementation is:
 	movl cop_pc,%eax
	movl chipmem_bank+16,%edx
	call *%edx
	movl %eax,%ebx

I've worked around the bug by storing cop_pc in an auto variable (which
the
compiler allocate in a register).




Thanks for your interesting,
Fabio Alemagna
amiGate.bug.tgz
copper-bug.s.gz
copper-sane.s.gz

-------------- next part --------------
A non-text attachment was scrubbed...
Name: amiGate.bug.tgz
Type: application/x-gzip
Size: 27215 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-bugs/attachments/20000214/24a79ff1/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: copper-bug.s.gz
Type: application/x-gzip
Size: 8629 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-bugs/attachments/20000214/24a79ff1/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: copper-sane.s.gz
Type: application/x-gzip
Size: 9179 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-bugs/attachments/20000214/24a79ff1/attachment-0002.bin>


More information about the Gcc-bugs mailing list