immutable, static, __gshared, TLS, and compile time allocation
Andrej Mitrovic
andrej.mitrovich at gmail.com
Fri Apr 20 15:17:48 PDT 2012
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:
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..
More information about the Digitalmars-d
mailing list