On 19 March 2012 15:25, Johannes Pfau <nos...@example.com> wrote: > Am Mon, 19 Mar 2012 09:22:01 +0000 > schrieb Iain Buclaw <ibuc...@ubuntu.com>: > >> On 19 March 2012 08:15, Johannes Pfau <nos...@example.com> wrote: >> > >> > * Our own, emulated TLS support is implemented in GCC. This means >> > it's also used in C, which is great. Also GCC's emulated tls needs >> > absolutely no special features in the runtime linker, compile time >> > linker or language frontends. It's very portable and works with all >> > weird combinations of dynamic libraries, dlopen, etc. >> > But it has one quirk: It doesn't allocate TLS memory in a >> > contiguous way, every tls variable is allocated using malloc. This >> > means we can't pass a range to the GC for the tls variables. So we >> > can't support this emutls in the GC. >> > >> >> As far as my thought process goes, the only (implementable in the GDC >> frontend) way to force contiguous layout of all TLS symbols is to pack >> them up ourselves into a struct that is accessible via a single global >> module-level variable. And in the .ctor section, the module adds this >> range to the GC. This should be enough so it also works for shared >> libraries too, however I'm sure there is quite a few details I am >> missing out on here that would block this from working. :) >> > > Good idea, I should have thought about that. I can't think of a > reason why it wouldn't work and it should be quite fast as well. >
Initial things to think about on the top of my head: * Speed to access symbols. * Accessing thread local symbols across modules. > Just to clarify: 'module-level' as in D module(/object file) or as in > one variable per shared library/application? If we can support one > variable per shared library/application that'd be great, as we will > then only have a few tls ranges for the gc. > Per module - see the code that initialises _Dmodule_ref. We're really just adding two extra fields to that which includes starting address and size. -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';