TLS for Android
joakim at airpost.net
Sat Mar 8 21:38:06 PST 2014
On Saturday, 8 March 2014 at 22:44:16 UTC, David Nadlinger wrote:
> On Sat, Mar 8, 2014 at 7:16 PM, Joakim <joakim at airpost.net>
>> On Saturday, 8 March 2014 at 14:25:43 UTC, David Nadlinger
>>> LLVM does support putting variables into custom sections, and
>>> you can more
>>> or less get away with the DMD bracketing approach (see e.g.
>>> the new
>>> ModuleInfo discovery functionality I implemented for Linux,
>>> which is the
>>> same as DMD's druntime uses).
>> You're talking about findDataSection and friends?
> Not quite. I was referring to
> (_d_dso_registry, ...) and the associated compiler-side
Okay, I started looking around the master branch and didn't find
what you were talking about. No wonder, it's in the merge-2.064
branch. I'll look at what you did there.
>>> However, there is a catch: Due to what I can only imagine is
>>> a bug, LLVM
>>> does not support emitting a symbol both into a custom section
>>> and with weak
>>> linkage. Thus, you might be in for a round of LLVM hacking
>>> either way, even
>>> though it will likely involve much less when going the DMD
>> Hmm, I guess this is why you don't use the bracketing approach
>> What will be much less when going the DMD route?
> Actually, we didn't use the special section approach at all
> until very
> recently (i.e. Martin's shared library changes in 2.064). And I
> that you would probably get away with less LLVM hacking when
> changing the way LDC emits TLS globals/accesses than when
> "emulated" TLS on the LLVM backend side.
Well, the special section approach still isn't in the master
branch, hence my confusion. Okay, I wasn't clear that you were
comparing the dmd route to having llvm generate the right pthread
calls for Android.
>> As for reimplementing the runtime linker, in a sense that's
>> what's being
>> done with dmd/druntime for OS X, where it implements it's own
>> ___tls_get_addr using pthread_setspecific. I'll have to do
>> the same for
>> Android, as bionic doesn't have a __tls_get_addr.
> Well, yes and no. I was specifically referring to keeping the
> TLS infrastructure (i.e. %gs-based addressing on Linux/x86) in
> and just replacing the part that Glibc does (but Bionic
> doesn't) with
> a piece of code in druntime. __tls_get_addr isn't necessarily
> used on
While Android/X86 TLS does use the %gs register
that's not portable and I'd like to try Android/ARM after this,
so I'll stick with the pthread_(get|set)specific calls to wrap it:
More information about the digitalmars-d-ldc