While optimization and gshared data

Alex Rønne Petersen alex at lycus.org
Thu Dec 6 20:23:42 PST 2012


On 06-12-2012 19:38, Iain Buclaw wrote:
> On 6 December 2012 18:30, Alex Rønne Petersen <alex at lycus.org> wrote:
>> On 06-12-2012 19:28, Timo Sintonen wrote:
>>>
>>> I have some memory mapped hardware in my arm controller.
>>> I define struct regs to describe the registers and __gshared regs* p to
>>> point to the actual address.
>>> I have a loop like: while (p.status==0) {...}
>>>
>>> The body of the loop does not touch status and so gdc optimizer does not
>>> evaluate status again, resulting to an endless loop. Gcc does the same,
>>> unless the variable is defined as volatile.
>>>
>>> This is ok in tls variables, but gshared variables are not thread safe.
>>> Actually I can see from assembler code that this occurs in all shared
>>> variables, like:
>>> __gshared int a=0;
>>> while (a==0) {}
>>> with nothing in the body generates just a jump to itself and the program
>>> stops.
>>>
>>> Another thread, interrupt or hardware can change a __gshared variable
>>> any time, so I think that the evalution should not be optimized away.
>>
>>
>> Yes, the compiler *must* assume that anything __gshared is implicitly
>> volatile in the C sense.
>>
>
> Is this going off your word or mine.... I know as a fact gdc marks
> shared decls as volatile, but not __gshared.  This was brought into
> question once when I pointed it out to you, are you now in agreement?
>
>
> Regards,
>

I think it was shared declarations that I didn't think needed volatile, 
but __gshared definitely does (I think Walter agrees on the latter too, 
not sure about the former).

-- 
Alex Rønne Petersen
alex at lycus.org
http://lycus.org


More information about the D.gnu mailing list