__emutls_v & __emutls_t

Johannes Pfau nospam at example.com
Sun Dec 22 02:00:10 PST 2013


Am Sun, 22 Dec 2013 02:01:09 +0000
schrieb "Mike" <none at none.com>:

> I need to make a startup procedure for my ARM Cortex-M platform.  
> In C/C++ this includs copying the .data segment to RAM and 
> initializing the .bss segment to 0.
> 
> 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"
> 
> minlibd's linker script 
> (https://bitbucket.org/timosi/minlibd/src/c4503befb556ff3edf04eeb63c384e0ea723a6aa/tools/ldscript4?at=default) 
> does not deal with these sections, I'm assuming because my 
> version of GDC (yesterday's 4.8.2 backport {Thanks Johannes}) has 
> changes for supporting emulated TLS.
> 
> My GDC is configured with --disable-tls and --disable-threads, so 
> I believe I could treat these the same as __gshared variables, 
> but I need to first understand what these sections are and what 
> they contain.
> 
> 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:

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.


More information about the D.gnu mailing list