gcc volatile behaviour

Zoltan Kocsi zoltan@bendor.com.au
Sat Oct 9 05:56:00 GMT 1999


I have some problem with gcc/egcs crosscompiling to m68k.
The problem probably would be present on any target, actually.

When the value of an assignment expression where the left-hand side is 
volatile is used, gcc re-fetches the left-hand object. That is:

  volatile int a, b;
  a = b = 0;

compiles to

        clr.l b
        move.l b,%d0
        move.l %d0,a
 
Apart from the fact that the involvement of d0 is not really a
necessity (with -O3), I do not understand why does it fetch 'b' ?

Similarly, when one does stringcopy:

   strcpy( char *a char *b )
   {
     while( *a++ = *b++ );
   }
   
compiles the loop to the inefficient but correct

.L7:
        move.b (%a0)+,%d0
        move.b %d0,(%a1)+
        jbne .L7

Changing the declaration of 'a' to volatile char *a, the result is this:

.L7:
        move.b (%a1)+,(%a0)
        move.b (%a0)+,%d0
        jbne .L7
 
This means that the copy is not terminated when the '\0' is *written*
to the area pointed by 'a' but when a zero is *read back* from the given 
area. In case of HW buffers this may not be what the programmer had in 
mind, for buffers sometimes are write only, for example.

In every case, when the left hand operand of an assignment expression
is volatile and the value of the expression is ised, gcc and egcs read 
back the value from the volatile object instead of using the value
written to the object.

Is there any particular reason why gcc and egcs do this ?

Thanks,

Zoltan

------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com



More information about the crossgcc mailing list