immutable, static, __gshared, TLS, and compile time allocation

Manu turkeyman at gmail.com
Fri Apr 20 16:20:33 PDT 2012


On 21 April 2012 01:17, Andrej Mitrovic <andrej.mitrovich at gmail.com> wrote:

> On 4/20/12, Manu <turkeyman at gmail.com> wrote:
> > I need to clarify some things that have confused me a few times.
>
> When in doubt you can either do a few write calls:
>

Sure, but as I'm trying to say, I'm already suspicious the compiler isn't
doing the 'right' thing in the first place... I want to rather know what
the word is, ie, the conceptual definition.


import std.stdio;
> import std.concurrency;
>
> struct FooStruct
> {
>    static int FooX;
>    __gshared int FooY;
> }
>
> void test()
> {
>    writeln(FooStruct.FooX);
>    writeln(FooStruct.FooY);
> }
>
> void main()
> {
>    writeln(FooStruct.FooX);
>    writeln(FooStruct.FooY);
>    FooStruct.FooX = 1;
>    FooStruct.FooY = 1;
>
>    spawn(&test);
> }
>
> Or better yet look at the disassembly:
>
> Here's FooX:
> SECTION .tls$   align=16 noexecute                      ; section number
> 8, data
> _D4test9FooStruct4FooXi:                                ; dword
>        dd 00000000H                                    ; 0000 _ 0
>
> Here's how it's loaded:
> mov     eax, dword [__tls_index]                ; 0003 _ A1,
> 00000000(segrel)
> mov     ecx, dword [fs:__tls_array]             ; 0008 _ 64: 8B. 0D,
> 00000000(segrel)
> mov     edx, dword [ecx+eax*4]                  ; 000F _ 8B. 14 81
> mov     eax, dword [_D4test9FooStruct4FooXi+edx]; 0012 _ 8B. 82, 00000000
>
> And here's FooY:
> SECTION .BSS    align=16 noexecute                      ; section number
> 4, bss
> _D4test9FooStruct4FooYi:                                ; dword
>        resd    1                                       ; 0004
>
> And here's how it's loaded (notice the lack of having to calculate the
> address based on TLS:
> mov     eax, dword [_D4test9FooStruct4FooYi]    ; 001D _ A1,
> 00000004(segrel)
>
> Adding static before __gshared doesn't seem to have any effect. DMD
> ignores a lot of nonsense keyword combinations. Maybe this will
> improve one day..
>

Right, this is precisely what I expect, and apparently the compiler knows
enough about that variable that even when addressing an alias at compile
time, it can still generate the appropriate TLS code. So that shows that
TLS is not a problem for compile time addressing, it is only important that
it is statically addressable.
So... back to my bug that Walter rejected, I don't understand the problem?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20120421/70569878/attachment.html>


More information about the Digitalmars-d mailing list