__emutls_v & __emutls_t

Mike none at none.com
Sun Dec 22 02:51:17 PST 2013


On Sunday, 22 December 2013 at 10:00:28 UTC, Johannes Pfau wrote:
>> If I declare global variables in D as...
>> 
>> __gshared int GlobalDataVar = 2;
>> __gshared int GlobalBssVar;
>> 
>> ... these get put in .data and .bss respectively, and I know 
>> what to do in my startup procedure:
>> 
>> However if I declare thread local variables in D as...
>> 
>> int TLSDataVar = 1;
>> int TLSBssVar;
>> 
>> ... two symbols for each variable are created: one in the 
>> section ".rodata.__emutls_t" and the other in section 
>> ".data.__emutls_v"
>> 
>> I know this may be more specific to GCC than GDC, but if you 
>> know something about these sections, please let me know, or 
>> point me to some resource that will help me understand them.
>> 
>> Thanks,
>> Mike
>
> I wrote a long answer here and managed to crash the newsreader 
> before
> it was sent so here's a short summary:

Damn! Such valuable information lost... but I understand.

>
> The emutls code is here:
> https://github.com/D-Programming-GDC/GDC/blob/master/libphobos/libdruntime/gcc/emutls.d
>
> The compiler calls __emutls_get_address, every symbol gets a
> emutls_object_t.
>
> If you have only one thread you could to reimplement emutls.d to
> avoid dynamic allocation. But the better solution is probably 
> to add a
> --single-thread-only option to GDC which rewrites TLS variables 
> to
> normal variables.

That's making a lot of sense, my memory.map file looks like this:

  .rodata.__emutls_t._D5start9TLSBssVari
                 0x0800006c        0x4 start.o
  .rodata.__emutls_t._D5start10TLSDataVari
                 0x08000070        0x4 start.o

.data.__emutls_v._D5start9TLSBssVari
                 0x08000080       0x10
  .data.__emutls_v._D5start9TLSBssVari
                 0x08000080       0x10 start.o
                 0x08000080                
__emutls_v._D5start9TLSBssVari

.data.__emutls_v._D5start10TLSDataVari
                 0x08000090       0x10
  .data.__emutls_v._D5start10TLSDataVari
                 0x08000090       0x10 start.o
                 0x08000090                
__emutls_v._D5start10TLSDataVari


In emutls.d, emutls_object_t is exactly 16 bytes, and each symbol 
in .data.__emutls_v is also 16 bytes.  So, I'm assuming 
.data.__emutls_v sections contain the emutls_object_t object.

Therefore, given the following TLS variables:

int TLSDataVar = 1;
int TLSBssVar;

... and the memory.map information above, examining 0x0800006c 
and 0x08000070 in gdb yields the following:

(gdb) x 0x08000070
0x8000070 <__emutls_t._D5start10TLSDataVari>:   0x00000001
(gdb) x 0x0800006c
0x800006c <__emutls_t._D5start9TLSBssVari>:     0x00000000

So, these must be the initial values each of the variables.

Now that I have some hypothesis as to what these sections are, I 
guess I just need to figure out what to do with these in the 
startup routine.  Timo, any ideas?



More information about the D.gnu mailing list