Some GC and emulated TLS questions (GDC related)

Joakim via Digitalmars-d digitalmars-d at puremagic.com
Sat Jul 15 03:49:39 PDT 2017


On Friday, 14 July 2017 at 09:13:26 UTC, Johannes Pfau wrote:
> Another solution could be to enhance libgcc emutls to allow 
> custom allocators, then have a special allocation function in 
> druntime for all D emutls variables. As far as I know there is 
> no GC heap that is scanned, but not automatically collected?

I believe that's what's done with the TLS ranges now, they're 
scanned but not collected, though they're not part of the GC heap.

> I'd need a way to completely manually manage GC.malloc/GC.free 
> memory without the GC collecting this memory, but still 
> scanning this memory for pointers. Does something like this 
> exist?

It doesn't have to be GC.malloc/GC.free, right?  The current 
DMD-style emutls simply mallocs and frees the TLS data itself and 
only expects the GC to scan it.

> Another option is simply using the DMD-style emutls. But as far 
> as I can see the DMD implementation never supported dynamic 
> loading of shared libraries? This is something the GCC emutls 
> support is quite good at: It doesn't have any platform 
> dependencies (apart from mutexes and some way to store one 
> thread specific pointer+destructor) and should work with all 
> kinds of shared library combinations. DMD style emutls also 
> does not allow sharing TLS variables between D and other 
> languages.

Yes, DMD's emutls was never made to work with loading multiple 
shared libraries.  As for sharing with other languages without 
copying the TLS data over, that seems a rare scenario.

> So I was thinking, if DMD style emutls really doesn't support 
> shared libraries, maybe we should just clone a GCC-style, 
> compiler and OS agnostic emutls implementation into druntime? A 
> D implementation could simply allocate all internal arrays 
> using the GC. This should be just as efficient as the C 
> implementation for variable access and interfacing to the GC is 
> trivial. It gets somewhat more complicated if we want to use 
> this in betterC though. We also lose C/C++ compatibility though 
> by using such a custom implementation.

It would be a good alternative to have, and you're not going to 
care in betterC mode, since there's no druntime or GC.  You'd 
have to be careful how you called TLS data from C/C++, but it 
could still be done.

> The rest of this post is a description of the GCC emutls code. 
> Someone
> can use this specification to implement a clean-room design D 
> emutls
> clone.
> Source code can be found here, but beware of the GPL license:
> https://github.com/gcc-mirror/gcc/blob/master/libgcc/emutls.c
>
> [...]

There is also this llvm implementation, available under 
permissive licenses and actually documented somewhat:

https://github.com/llvm-mirror/compiler-rt/blob/master/lib/builtins/emutls.c


More information about the Digitalmars-d mailing list