[D-runtime] Supporting different C libraries and architectures

Iain Buclaw ibuclaw at ubuntu.com
Sun Feb 26 09:10:23 PST 2012


On 25 February 2012 17:31, Johannes Pfau <johannespfau at googlemail.com> wrote:
> This is probably less a problem for DMDs druntime, but we hit this issue
> with gdc and the android port now, so I thought I'll also post this message
> here, maybe someone has a good idea.
>
> Android uses a custom C library (Bionic) which is not 100% Posix compatible.
> With the current approach of supporting different systems using version()
> blocks, this will lead to lots of changes in all the core/* files. And it
> will get much worse once we try to support other C libraries (newlib for
> DS/Wii homebrew, uclibc/dietlibc/eglibc for embedded linux, etc). The
> current aproach is already broken for Android, as druntime assumes
> version(linux) --> glibc which is not true. One such broken example is the
> usage of the glibc "backtrace" function.
>
> Here's the original message sent to the D.gnu newsgroup:
>
> ________________________________
> As recently discussed in a pull request it would be great if we could
> make it easier to port druntime to different architectures. Special
> casing every C library, every architecture and every OS using version
> blocks could lead to difficult to maintain code, so we need a better
> solution.
>
> As far as I can see, the biggest differences are caused by different C
> libraries, not by different architectures (except 32bit vs 64 bit
> differences). For example glibc headers seem to be very similar for arm
> and x86, but bionic vs. glibc brings more differences. Bionic initially
> didn't support anything wchar_t related, so core.stdc.wchar_ and
> core.stdc.wctype couldn't work with android at all. And C libraries
> vary even more in the subset of posix functionality they support.
>
> We need a directory scheme to support
> * Different C libraries
>   * on different OS (glibc/bsd glibc/linux)
>   * on the same OS (glibc on linux, bionic on linux, uclibc on
>     linux, ...)
> * Different architectures (ARM, X86, MIPS, PPC, SH4, ...)
>
> I propose the following directory layout, but of course
> better solutions are appreciated:
>
> druntime
> |-core
> |---stdc
> |---sync
> |---sys
> |-----posix
> |-gc
> |-gcstub
> |-rt
> |-gcc
> |---arch
> |-----glibc
> |-------core
> |---------stdc
> |---------sync
> |---------sys
> |-----------posix
> |-----bionic
> |-------stdc
> |-------sync
> |-------core
> |---------sys
> |-----------posix
> |-----newlib
> |-------stdc
> |-------sync
> |-------core
> |---------sys
> |-----------posix
>

So I gather from what your proposing that ie: core.stdc.stdio will
look like the following?

module core.stdc.stdio;

version (GLibc)
  public import gcc.glibc.core.stdc.stdio;
else version (Bionic)
  public import gcc.bionic.core.stdc.stdio;
// etc.


-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';


More information about the D-runtime mailing list