egcs-1.1, m68k: bug in volatile pointer ref
Mon Jan 11 06:40:00 GMT 1999
For info, this is a copy of a bug report I submitted to egcs-bugs.
It is very significant for embedded systems.
The following bug was observed in egcs-1.1b and egcs-1.1.1 configured
Assignment operations through a pointer variable declared volatile
produce multiple accesses. This can cause incorrect behaviour when the
destination of the write is a register in a peripheral device and the
device expects a series of values to be written to the same address.
The bug is triggered when compiling with no optimisation. Optimisation
levels of -O1 and above do not exhibit the bug.
The following code snippet demonstrates the bug. The manner of declaring
the volatile pointer is not significant, the same bad code is generated
whether the pointer is a local variable, global variable or structure
void write_device(unsigned char *addr, int val)
volatile unsigned char *ptr = addr;
*ptr = val;
m68k-coff-gcc -S volatile-bug.c
The resulting assembler is:
Note the spurious extra "move.b (%a0),(%a0)" instruction.
Mark Powell, Senior Software Engineer, Primagraphics Limited
New Cambridge House, Litlington, nr.Royston, Herts, SG8 0SS, UK
Tel. +44 1763 852222, Fax. 853324, email@example.com, http://www.primag.co.uk
New CrossGCC FAQ: http://www.objsw.com/CrossGCC
To remove yourself from the crossgcc list, send
mail to firstname.lastname@example.org with the
text 'unsubscribe' (without the quotes) in the
body of the message.
More information about the crossgcc