Mercurial > projects > ldc
view runtime/README @ 1410:cc2d8a7388c7
Count the sret register as well when keeping track of how many integer registers
are available for extern(C) functions on x86-64.
Interestingly, llvm-g++ seems to have a very similar bug: http://llvm.org/pr4242
(So this breaks ABI-compatibility with llvm-gcc for this corner case, but gains
it with gcc...)
To clarify, this is about code like this:
{{{
struct S { void*[3] data; }
struct T { void*[2] data; }
// The T should be passed in memory, and p in the last int register.
extern(C) S fail(int, int, int, int, T t, void* p) {
S s;
s.data[0] = t.data[0];
s.data[1] = t.data[1];
s.data[2] = p;
return s;
}
}}}
which should generate code functionally equivalent to this:
{{{
extern(C) S* succeed(S* s, int, int, int, int, T t, void* p) {
s.data[0] = t.data[0];
s.data[1] = t.data[1];
s.data[2] = p;
return s;
}
}}}
(with the same definitions for S and T)
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Fri, 22 May 2009 13:17:06 +0200 |
parents | 2ddee23bd70e |
children |
line wrap: on
line source
This should help get the runtime built. FOR D1: ======= 1) Do a checkout of tango trunk into the ldc root dir (along dmd, gen, runtime etc). * $ ls * dmd dmd2 gen ir ... * $ svn co http://svn.dsource.org/projects/tango/trunk tango 2) Compile the runtime * sh build.sh FOR D2: ======= Highly experimental!!! 1) Do a checkout of druntime trunk into the ldc root dir (along dmd, gen, runtime etc). * $ ls * dmd dmd2 gen ir ... * $ svn co http://svn.dsource.org/projects/druntime/trunk druntime 2) Patch druntime * cd runtime * sh patch-druntime.sh 3) Compile druntime * cd ../druntime/src * sh build-ldc.sh ======= Enjoy!