Ehem, ARM
Joakim
joakim at airpost.net
Fri Mar 21 12:59:40 PDT 2014
On Saturday, 28 December 2013 at 22:21:46 UTC, Joakim wrote:
> I finished porting most of druntime to Android/x86 and have
> started trying to run the tests: I just got 31 out of 38
> druntime modules' unit tests to pass. :)
>
> I figured out the segfault mentioned above was because TLS is
> done differently on Android- flags[] is a global when outside
> main and thread-local by default as a result, adding a shared
> attribute makes it work again- and I was getting a lot of
> segfaults on the unit tests for the same reason. After making
> all the simple globals in the unit tests, like cpuid in
> rt.arrayfloat/int/etc., into shared variables, only 8 modules'
> unittests segfault, one after passing.
>
> Bionic doesn't support __thread for TLS, but it does let you
> use the pthread_key_(create|delete)/pthread_(set|get)specific
> APIs, just as druntime does on OS X. Here's the bionic
> implementation:
>
> https://github.com/android/platform_bionic/blob/master/libc/bionic/pthread_key.cpp
>
> I haven't completely grasped TLS and how it's done on OS X yet,
> but I get the sense I'll have to modify dmd a little to get TLS
> working with bionic. It appears that Martin and Johannes have
> looked into this before, so if you two have any feedback, let
> me know.
>
> I'm hoping TLS is the last remaining piece for druntime to be
> finished porting to Android/x86, then I want to try Phobos,
> which I'm guessing shouldn't be as bad.
Been awhile since I updated on the Android effort: I'm now able
to get all 38 druntime modules' unit tests to pass on
Android/x86... under somewhat random conditions. It's finicky
and some of the tests start failing and many segfaulting on exit,
as mentioned before, if I make minor changes to the unit tests,
like changing some TLS globals to shared. I'm guessing this is
because I don't really have TLS working yet, I'm just taking
advantage of the fact that the baked-in TLS in linux kinda sorta
still works on Android.
As long as it's local-exec, uninitialized TLS mostly works if
it's less than 4-5 KB, while initialized TLS doesn't get
initialized correctly. Of course, it's possible that I'm hitting
some other codegen incompatibility altogether, unrelated to TLS,
but the fact that it sometimes works depending on the number of
TLS variables makes me think it's a TLS issue. I also got a bit
more than half of the Phobos unit tests to pass, with a lot of
seg faults there too.
Android is going to need a packed TLS approach, similar to what
Walter implemented for OS X with dmd:
http://www.drdobbs.com/architecture-and-design/implementing-thread-local-storage-on-os/228701185
I've been looking into doing something similar for ELF, but this
is the first time hacking on a compiler for me. If someone else
more familiar with dmd or ldc could put packed TLS for ELF
together more quickly, that would certainly speed things up. If
not, I'll have something together eventually. ;)
More information about the Digitalmars-d
mailing list