Getting tls symbols out of the compiler.

Iain Buclaw ibuclaw at ubuntu.com
Thu May 30 03:31:25 PDT 2013


On 30 May 2013 11:13, Johannes Pfau <nospam at example.com> wrote:
> Am Thu, 30 May 2013 10:42:17 +0100
> schrieb Iain Buclaw <ibuclaw at ubuntu.com>:
>
>>
>> This is more of a lazy init that won't affect start-up speed.  Note:
>> this idea is based off what C++ (g++) does for say - static A a = new
>> A();
>>
>
> I see.
>
>>
>> I don't think it would have much slow down.  Albeit the first
>> initialisation would jump through the druntime library twice, but
>> there after it's a single/two instruction test.  Pretty negligible -
>> but I'm not a speeeeeeeeed demon or freak who wants everything
>> compiled with -fOMG-fast. =)
>
> I'm more worried about adding many roots to the GC. The code which
> checks the guard variable is probably neglectable.
>
>>
>>
>> >> Though this should not be required if we have a proper TLS GC in
>> >> place.
>> >
>> > Do you mean Martin Nowak's shared library/TLS work? That indeed
>> > sounds like the proper solution.
>> >
>>
>> It should certainly mean that we don't have to worry about removing
>> roots once they've been added.
>
> AFAIK he also changed how TLS sections are looked up for the main
> executable. _tlsstart and _tlsend are not used anymore. Instead some
> mainly undocumented obscure glibc interface is used to ask the runtime
> linker for the start and end of the TLS section.
>
> https://github.com/D-Programming-Language/druntime/blob/master/src/rt/sections_linux.d#L122
> https://github.com/D-Programming-Language/druntime/blob/master/src/rt/sections_linux.d#L164
>
> https://github.com/D-Programming-Language/dmd/commit/313132b6e20c119fa64c6164574818421cb522ce
>
>>
>> > (And maybe the D community should develop a sane standard interface
>> > to the runtime linker to access sections. Then go lobbying all
>> > major libcs out there...)
>>
>> You mean binutils?  :-)
>>
>> See binutils/ld/scripttempl  for the ldscripts used to lay out the tls
>> data sections.  (Note, only a few actually have a TLS section - and
>> only winpe defines a _tls_start__ and _tls_end__ symbol).
>
> Well the start/end symbols could be introduced in binutils linker
> scripts. But the elf format already has all the information about
> section size and the runtime linker (ld.so) knows where every section
> starts and it also knows its size. There's just no standard interface to
> receive that information. (I had a quick look at the FreeBSD runtime
> linker some time ago. With some C libraries you can even get the
> elf header, but it's all non-standard and undocumented)
>
>


Yes, I've noticed  (and even gave libdruntime a test on gdc shortly
after the conference)  - it's broken everything ... literally ...


--
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';


More information about the D.gnu mailing list