Hitchikers Guide to Porting Phobos / D Runtime to other architectures

Joakim joakim at airpost.net
Tue Dec 3 03:26:57 PST 2013


On Monday, 9 April 2012 at 09:05:25 UTC, Johannes Pfau wrote:
> Am Sun, 08 Apr 2012 21:08:52 +0200
> schrieb "Iain Buclaw" <ibuclaw at ubuntu.com>:
>
>> I got asked whether there are any porting hints for phobos on 
>> other architectures the other day from the debian GCC 
>> maintainers.  So I gathered this must be at least a dedicated 
>> wiki or article to be written up on the subject. :)
>> 
>> I know there are a few working on porting gdc and associated 
>> libraries over to ARM (with my assistance from the compiler 
>> side).  So please tell, what are your experiences? Successes?  
>> Failures?  What tips would you give to someone wanting to port 
>> to their own architecture?
>> 
>> Regards
>> Iain
>
> (This is mostly about porting to a different C library. I don't
> remember many issues when porting to a different CPU 
> architecture)
>
> Issues I hit with druntime:
>
> * Adapting the core.stdc bindings to something different than 
> the
>   currently supported C libraries sucks: The version blocks are
>   sometimes completely wrong. For example Android's bionic is a 
> C
>   library based on BSD code, but running on Linux. As a result
>   sometimes the version(FreeBSD) blocks apply for bionic, but 
> sometimes
>   the version(linux) blocks are right. I basically had to 
> rewrite
>   the complete core.stdc bindings. This is an issue because 
> druntime
>   and phobos do not distinguish between OS/Kernel and C library.
>
> * Wrong constants or macros in the C bindings are very hard to 
> spot -
>   you'll only notice those at runtime
>
> * When statically linking the phobos/druntime library you are 
> no warned
>   about missing symbols - For shared libraries  
> -Wl,--no-undefined can
>   be used, however, there are some issues with that as well:
>   
> (http://stackoverflow.com/questions/2356168/force-gcc-to-notify-about-undefined-references-in-shared-libraries
>   second answer)
>
> * Bionic just implements some functions as macros and never 
> exports
>   those as functions (htons, etc). Because of the last point 
> it's easy
>   to miss that
>
> Ideally all of the core.stdc bindings should be generated
> automatically. This is possible if we can run code (using 
> offsetof,
> alignof, etc) but it's not that easy for cross compilation. I 
> thought
> about hooking into the GCC C frontend to do that, but I had no 
> time to
> look at it yet.
>
> * All those issues also apply to phobos, where phobos uses 
> custom C
>   bindings / extern(C) declarations.
>
> * I had to edit some stuff in std.stdio (because Android has no 
> wide
>   character/fwide support). Templates can be annoying in this 
> case:
>   some if(isOutputRange!T) chains hid an error in the IO code, 
> it took
>   me some time to find that problem. The reported error was 
> completely
>   misleading (cannot put dchar[] into LockingTextWriter or 
> something)
>
> * When adding new, system specific code to a module and using 
> selective
>   imports, that may affect other modules (can't remember which 
> compiler
>   bug this was). This means that adding an import in one module 
> might
>   break another module on another architecture.
>
> * Porting the GC doesn't seem to be too difficult, but some 
> care is
>   needed to get stack scanning/TLS scanning right (If you have 
> random
>   crashes, it's either the GC not working(probably not scanning
>   stack/tls) or fno-section-anchors missing)
>
> * Always use "-fno-section-anchors". It's not needed for simple 
> code,
>   but I was chasing a weird bug in derelict, till I realized I 
> didn't
>   compile derelict with "-fno-section-anchors".
>
> * Right now, issue 284 is a little annoying. At least unittest 
> and
>   phobos/druntime as shared libraries won't work at all till 
> that's
>   fixed.
>
> * AFAIK the unittests cannot be run when cross-compiling right 
> now?
>
> * There might be more issues like this one where phobos is 
> checking for
>   a wrong status code:
>   (https://github.com/D-Programming-Language/phobos/pull/487)
>
> * For systems where long double isn't available, fixing 
> core.stdc.math
>   is annoying. I have to implement a proper solution which works
>   for all systems without long double.
>
> However, all that considered most issues are when interfacing 
> C. The D
> code most of the time 'just works'.
Seems like you got pretty far with your Android port: are you 
planning on submitting any of these patches back upstream?


More information about the Digitalmars-d mailing list