On 07 November 2006 16:33, Andrew Haley wrote:
> Ricardo FERNANDEZ PASCUAL writes:
> > I have done some experiments to try to understand what is happening, and
> > I am a bit confused by the bahavior of GCC. Consider the following C
> > function:
> >
> > static struct { int w; } s;
> >
> > void wait (void) {
> > int t;
> > loop:
> > t = *((volatile int *) &s.w);
> > if (t > 0) goto loop;
> > }
> >
> >
> > The code generated by "cc1 -O3" on x86 is:
> >
> > wait:
> > movl s, %eax
> > pushl %ebp
> > movl %esp, %ebp
> > testl %eax, %eax
> > jg .L6
> > popl %ebp
> > ret
> > .L3:
> > .L6:
> > jmp .L6
> >
> >
> > Which does not seem to respect the semantics of volatile. Is this the
> > expected behavior or is this a bug?
>
> I think it's a bug.
> > FWIW, the folowing function:
> which looks right. A temporary shouldn't make any difference here.
Can I just remind everyone we had a huge long thread with this discussion
last year and it might be worth reviewing. Look for the thread titled
"volatile semantics" running from Tue 03/05/2005 09:42 to Tue 26/07/2005
00:09. (We should try not to repeat too much of a three-month long debate!)
cheers,
DaveK
--
Can't think of a witty .sigline today....