# HG changeset patch # User Christian Kamm # Date 1231253688 -3600 # Node ID 2ddee23bd70e77220d7075e0a9874ab004c965ce # Parent a331ce9bc74982f44b93acd4cc75aad9266b950b Get rid of ex-Tango patch. (merged into Tango) Adjust README and CMakeLists. diff -r a331ce9bc749 -r 2ddee23bd70e runtime/CMakeLists.txt --- a/runtime/CMakeLists.txt Mon Jan 05 21:11:47 2009 +0100 +++ b/runtime/CMakeLists.txt Tue Jan 06 15:54:48 2009 +0100 @@ -77,23 +77,25 @@ configure_file(${PROJECT_PARENT_DIR}/${LDC_EXE}.conf.in ${PROJECT_BINARY_DIR}/../bin/${LDC_EXE}.conf) -# patch runtime source, uses LDC_EXE for ldc / ldc2 -find_program(PATCH_EXE patch DOC "path to patch tool") -if(NOT PATCH_EXE) - message(STATUS "patch tool not found, can't automatically patch runtime sources for ldc") -else(NOT PATCH_EXE) - add_custom_command( - OUTPUT patch-runtime - COMMAND ${PATCH_EXE} -t -N -p0 -i ${PROJECT_SOURCE_DIR}/${LDC_EXE}.diff - WORKING_DIRECTORY ${RUNTIME_DIR} - ) - # rebuild cache to include sources added by patch - add_custom_command( - OUTPUT recache - COMMAND ${CMAKE_COMMAND} -H${PROJECT_PARENT_DIR} -B${PROJECT_BINARY_DIR}/.. - ) - add_custom_target(patch DEPENDS patch-runtime recache ${LDC_IMPORTS}) -endif(NOT PATCH_EXE) +# patch runtime source, uses LDC_EXE for ldc2 +if(D_VERSION EQUAL 2) + find_program(PATCH_EXE patch DOC "path to patch tool") + if(NOT PATCH_EXE) + message(STATUS "patch tool not found, can't automatically patch runtime sources for ldc") + else(NOT PATCH_EXE) + add_custom_command( + OUTPUT patch-runtime + COMMAND ${PATCH_EXE} -t -N -p0 -i ${PROJECT_SOURCE_DIR}/${LDC_EXE}.diff + WORKING_DIRECTORY ${RUNTIME_DIR} + ) + # rebuild cache to include sources added by patch + add_custom_command( + OUTPUT recache + COMMAND ${CMAKE_COMMAND} -H${PROJECT_PARENT_DIR} -B${PROJECT_BINARY_DIR}/.. + ) + add_custom_target(patch DEPENDS patch-runtime recache ${LDC_IMPORTS}) + endif(NOT PATCH_EXE) +endif(D_VERSION EQUAL 2) file(GLOB GC_D ${RUNTIME_GC_DIR}/*.d) file(GLOB_RECURSE DCRT_D ${RUNTIME_DC_DIR}/*.d) diff -r a331ce9bc749 -r 2ddee23bd70e runtime/README --- a/runtime/README Mon Jan 05 21:11:47 2009 +0100 +++ b/runtime/README Tue Jan 06 15:54:48 2009 +0100 @@ -7,12 +7,7 @@ * dmd dmd2 gen ir ... * $ svn co http://svn.dsource.org/projects/tango/trunk tango -2) Patch the runtime - - * cd runtime - * sh patch-tango.sh - -3) Compile the runtime +2) Compile the runtime * sh build.sh diff -r a331ce9bc749 -r 2ddee23bd70e runtime/ldc.diff --- a/runtime/ldc.diff Mon Jan 05 21:11:47 2009 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,895 +0,0 @@ -Index: lib/unittest.sh -=================================================================== ---- lib/unittest.sh (revision 4150) -+++ lib/unittest.sh (working copy) -@@ -18,8 +18,9 @@ - --help: This message - --run-all: Reports result instead of breaking. Do not use this if you want to - run unittest runner through a debugger. -- dmd: Builds unittests for dmd -- gdc: Builds unittests for gdc -+ dmd: Builds unittests for dmd -+ gdc: Builds unittests for gdc -+ ldc: Builds unittests for ldc - - : Builds unittests for all known compilers.' - exit 0 -@@ -86,7 +87,7 @@ - void main() {} - EOF - -- rebuild -w -d -g -L-ldl -L-lz -L-lbz2 -debug=UnitTest -debug -full -clean -unittest \ -+ rebuild -w -d -L-ldl -L-lz -L-lbz2 -debug=UnitTest -debug -full -clean -unittest \ - -version=UnitTest $EXE.d tango/core/*.d tango/core/sync/*.d tango/io/digest/*.d \ - tango/io/model/*.d tango/io/protocol/*.d tango/io/selector/*.d tango/io/*.d \ - tango/io/vfs/*.d tango/io/vfs/model/*.d \ -@@ -125,6 +126,9 @@ - gdc) - GDC=1 - ;; -+ ldc) -+ LDC=1 -+ ;; - *) - usage - ;; -@@ -132,10 +136,11 @@ - shift - done - --if [ ! "$DMD" -a ! "$GDC" ] -+if [ ! "$DMD" -a ! "$GDC" -a ! "$LDC" ] - then - DMD=1 - GDC=1 -+ LDC=1 - fi - - if [ "$DMD" = "1" ] -@@ -146,4 +151,7 @@ - then - compile gdc runUnitTest_gdc - fi -- -+if [ "$LDC" = "1" ] -+then -+ compile ldc runUnitTest_ldc -+fi -Index: lib/common/tango/core/BitManip.d -=================================================================== ---- lib/common/tango/core/BitManip.d (revision 4150) -+++ lib/common/tango/core/BitManip.d (working copy) -@@ -171,6 +171,10 @@ - */ - uint outpl( uint port_address, uint value ); - } -+else version( LDC ) -+{ -+ public import ldc.bitmanip; -+} - else - { - public import std.intrinsic; -Index: lib/common/tango/core/Thread.d -=================================================================== ---- lib/common/tango/core/Thread.d (revision 4150) -+++ lib/common/tango/core/Thread.d (working copy) -@@ -273,8 +273,50 @@ - } - body - { -- version( D_InlineAsm_X86 ) -+ version( LDC) - { -+ version(X86) -+ { -+ uint eax,ecx,edx,ebx,ebp,esi,edi; -+ asm -+ { -+ mov eax[EBP], EAX ; -+ mov ecx[EBP], ECX ; -+ mov edx[EBP], EDX ; -+ mov ebx[EBP], EBX ; -+ mov ebp[EBP], EBP ; -+ mov esi[EBP], ESI ; -+ mov edi[EBP], EDI ; -+ } -+ } -+ else version (X86_64) -+ { -+ ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r10,r11,r12,r13,r14,r15; -+ asm -+ { -+ movq rax[RBP], RAX ; -+ movq rbx[RBP], RBX ; -+ movq rcx[RBP], RCX ; -+ movq rdx[RBP], RDX ; -+ movq rbp[RBP], RBP ; -+ movq rsi[RBP], RSI ; -+ movq rdi[RBP], RDI ; -+ movq rsp[RBP], RSP ; -+ movq r10[RBP], R10 ; -+ movq r11[RBP], R11 ; -+ movq r12[RBP], R12 ; -+ movq r13[RBP], R13 ; -+ movq r14[RBP], R14 ; -+ movq r15[RBP], R15 ; -+ } -+ } -+ else -+ { -+ static assert( false, "Architecture not supported." ); -+ } -+ } -+ else version( D_InlineAsm_X86 ) -+ { - asm - { - pushad; -@@ -330,8 +372,12 @@ - } - } - -- version( D_InlineAsm_X86 ) -+ version( LDC) - { -+ // nothing to pop -+ } -+ else version( D_InlineAsm_X86 ) -+ { - asm - { - popad; -@@ -2347,6 +2393,18 @@ - version( Posix ) - version = AsmPPC_Posix; - } -+ version( LLVM_InlineAsm_X86 ) -+ { -+ version( Win32 ) -+ version = LLVM_AsmX86_Win32; -+ else version( Posix ) -+ version = LLVM_AsmX86_Posix; -+ } -+ else version( LLVM_InlineAsm_X86_64 ) -+ { -+ version( Posix ) -+ version = LLVM_AsmX86_64_Posix; -+ } - - version( Posix ) - { -@@ -2357,6 +2415,10 @@ - version( AsmX86_Win32 ) {} else - version( AsmX86_Posix ) {} else - version( AsmPPC_Posix ) {} else -+ version( LLVM_AsmX86_Win32 ) {} else -+ version( LLVM_AsmX86_Posix ) {} else -+//TODO: Enable when x86-64 Posix supports fibers -+// version( LLVM_AsmX86_64_Posix ) {} else - { - // NOTE: The ucontext implementation requires architecture specific - // data definitions to operate so testing for it must be done -@@ -2510,6 +2572,28 @@ - ret; - } - } -+ else version( LLVM_AsmX86_Posix ) -+ { -+ asm -+ { -+ // clobber registers to save -+ inc EBX; -+ inc ESI; -+ inc EDI; -+ -+ // store oldp again with more accurate address -+ mov EAX, oldp; -+ mov [EAX], ESP; -+ // load newp to begin context switch -+ mov ESP, newp; -+ } -+ } -+/+ -+ version( LLVM_AsmX86_64_Posix ) -+ { -+ //TODO: Fiber implementation here -+ } -++/ - else static if( is( ucontext_t ) ) - { - Fiber cfib = Fiber.getThis(); -@@ -2522,7 +2606,7 @@ - } - } - -- -+extern(C) int printf(char*, ...); - //////////////////////////////////////////////////////////////////////////////// - // Fiber - //////////////////////////////////////////////////////////////////////////////// -@@ -3255,6 +3339,22 @@ - push( 0x00000000 ); // ESI - push( 0x00000000 ); // EDI - } -+ else version( LLVM_AsmX86_Posix ) -+ { -+ push( cast(size_t) &fiber_entryPoint ); // EIP -+ push( 0x00000000 ); // newp -+ push( 0x00000000 ); // oldp -+ push( 0x00000000 ); // EBP -+ push( 0x00000000 ); // EBX -+ push( 0x00000000 ); // ESI -+ push( 0x00000000 ); // EDI -+ } -+//TODO: Implement x86-64 fibers -+/+ -+ else version( LLVM_AsmX86_Posix ) -+ { -+ } -++/ - else version( AsmPPC_Posix ) - { - version( StackGrowsDown ) -Index: lib/gc/basic/gcx.d -=================================================================== ---- lib/gc/basic/gcx.d (revision 4150) -+++ lib/gc/basic/gcx.d (working copy) -@@ -65,6 +65,13 @@ - } - - -+struct BlkInfo -+{ -+ void* base; -+ size_t size; -+ uint attr; -+} -+ - private - { - enum BlkAttr : uint -@@ -75,13 +82,6 @@ - ALL_BITS = 0b1111_1111 - } - -- struct BlkInfo -- { -- void* base; -- size_t size; -- uint attr; -- } -- - extern (C) void* rt_stackBottom(); - extern (C) void* rt_stackTop(); - -@@ -2178,6 +2178,49 @@ - __builtin_unwind_init(); - sp = & sp; - } -+ else version(LDC) -+ { -+ version(X86) -+ { -+ uint eax,ecx,edx,ebx,ebp,esi,edi; -+ asm -+ { -+ mov eax[EBP], EAX ; -+ mov ecx[EBP], ECX ; -+ mov edx[EBP], EDX ; -+ mov ebx[EBP], EBX ; -+ mov ebp[EBP], EBP ; -+ mov esi[EBP], ESI ; -+ mov edi[EBP], EDI ; -+ mov sp[EBP],ESP ; -+ } -+ } -+ else version (X86_64) -+ { -+ ulong rax,rbx,rcx,rdx,rbp,rsi,rdi,rsp,r10,r11,r12,r13,r14,r15; -+ asm -+ { -+ movq rax[RBP], RAX ; -+ movq rbx[RBP], RBX ; -+ movq rcx[RBP], RCX ; -+ movq rdx[RBP], RDX ; -+ movq rbp[RBP], RBP ; -+ movq rsi[RBP], RSI ; -+ movq rdi[RBP], RDI ; -+ movq rsp[RBP], RSP ; -+ movq r10[RBP], R10 ; -+ movq r11[RBP], R11 ; -+ movq r12[RBP], R12 ; -+ movq r13[RBP], R13 ; -+ movq r14[RBP], R14 ; -+ movq r15[RBP], R15 ; -+ } -+ } -+ else -+ { -+ static assert( false, "Architecture not supported." ); -+ } -+ } - else - { - asm -@@ -2191,6 +2234,10 @@ - { - // nothing to do - } -+ else version(LDC) -+ { -+ // nothing to do -+ } - else - { - asm -Index: lib/gc/basic/gcbits.d -=================================================================== ---- lib/gc/basic/gcbits.d (revision 4150) -+++ lib/gc/basic/gcbits.d (working copy) -@@ -39,6 +39,10 @@ - { - // use the unoptimized version - } -+else version(LDC) -+{ -+ // ditto -+} - else version (D_InlineAsm_X86) - { - version = Asm86; -Index: lib/build-tango.sh -=================================================================== ---- lib/build-tango.sh (revision 4150) -+++ lib/build-tango.sh (working copy) -@@ -23,7 +23,7 @@ - --debug: Will enable debug info - --warn: Will enable warnings - --verbose: Increase verbosity -- is one of {dmd, gdc, mac} and will build libtango.a, -+ is one of {dmd, gdc, ldc, mac} and will build libtango.a, - libgtango.a or universal Mac binaries respectively - - The script must be called from within lib/ and the resulting -@@ -105,7 +105,7 @@ - if filter $OBJNAME - then - if [ $VERBOSE == 1 ]; then echo "[$DC] $FILENAME"; fi -- $DC $WARN -c $INLINE $DEBUG $RELEASE -version=Posix -version=Tango -of$OBJNAME $FILENAME -+ $DC $WARN -c $INLINE $DEBUG $RELEASE -version=Tango -of$OBJNAME $FILENAME - if [ "$?" != 0 ] - then - return 1; -@@ -189,6 +189,9 @@ - gdc) - build gdmd libgtango.a libgphobos.a - ;; -+ ldc) -+ build ldc libtango-user-ldc.a build-tango.sh -+ ;; - mac) - # build Universal Binary version of the Tango library - build powerpc-apple-darwin8-gdmd libgtango.a.ppc libgphobos.a.ppc -Index: tango/text/convert/Layout.d -=================================================================== ---- tango/text/convert/Layout.d (revision 4150) -+++ tango/text/convert/Layout.d (working copy) -@@ -47,6 +47,12 @@ - alias void* Arg; - alias va_list ArgList; - } -+else version(LDC) -+ { -+ private import tango.core.Vararg; -+ alias void* Arg; -+ alias va_list ArgList; -+ } - else - { - alias void* Arg; -@@ -295,7 +301,7 @@ - foreach (i, arg; arguments) - { - arglist[i] = args; -- args += (arg.tsize + int.sizeof - 1) & ~ (int.sizeof - 1); -+ args += (arg.tsize + size_t.sizeof - 1) & ~ (size_t.sizeof - 1); - } - } - return parse (formatStr, arguments, arglist, sink); -Index: tango/net/cluster/CacheInvalidator.d -=================================================================== ---- tango/net/cluster/CacheInvalidator.d (revision 4150) -+++ tango/net/cluster/CacheInvalidator.d (working copy) -@@ -79,7 +79,7 @@ - - *******************************************************************************/ - --private class InvalidatorPayload : NetworkMessage -+package class InvalidatorPayload : NetworkMessage - { - private char[] key_; - -Index: tango/core/Vararg.d -=================================================================== ---- tango/core/Vararg.d (revision 4150) -+++ tango/core/Vararg.d (working copy) -@@ -15,6 +15,10 @@ - { - public import std.stdarg; - } -+else version( LDC ) -+{ -+ public import ldc.vararg; -+} - else - { - /** -Index: tango/core/sync/Semaphore.d -=================================================================== ---- tango/core/sync/Semaphore.d (revision 4150) -+++ tango/core/sync/Semaphore.d (working copy) -@@ -384,7 +384,8 @@ - { - synchronized( synComplete ) - { -- if( numComplete == numConsumers ) -+ // if( numComplete == numConsumers ) -+ if( numComplete == numToProduce ) - break; - } - Thread.yield(); -@@ -392,9 +393,9 @@ - - synchronized( synComplete ) - { -- assert( numComplete == numConsumers ); -+ assert( numComplete == numToProduce ); -+ // assert( numComplete == numConsumers ); - } -- - synchronized( synConsumed ) - { - assert( numConsumed == numToProduce ); -@@ -455,7 +456,8 @@ - - unittest - { -+ version(darwin){}else{ - testWait(); -- testWaitTimeout(); -+ testWaitTimeout();} - } - } -Index: tango/core/sync/Condition.d -=================================================================== ---- tango/core/sync/Condition.d (revision 4150) -+++ tango/core/sync/Condition.d (working copy) -@@ -553,8 +553,11 @@ - - unittest - { -+ version(darwin){} -+ else{ - testNotify(); - testNotifyAll(); - testWaitTimeout(); -+ } - } - } -Index: tango/core/Atomic.d -=================================================================== ---- tango/core/Atomic.d (revision 4150) -+++ tango/core/Atomic.d (working copy) -@@ -270,6 +270,167 @@ - - - //////////////////////////////////////////////////////////////////////////////// -+// LDC Atomics Implementation -+//////////////////////////////////////////////////////////////////////////////// -+ -+ -+else version( LDC ) -+{ -+ import ldc.intrinsics; -+ -+ -+ //////////////////////////////////////////////////////////////////////////// -+ // Atomic Load -+ //////////////////////////////////////////////////////////////////////////// -+ -+ -+ template atomicLoad( msync ms = msync.seq, T ) -+ { -+ T atomicLoad(ref T val) -+ { -+ llvm_memory_barrier( -+ ms == msync.hlb || ms == msync.acq || ms == msync.seq, -+ ms == msync.hsb || ms == msync.acq || ms == msync.seq, -+ ms == msync.slb || ms == msync.rel || ms == msync.seq, -+ ms == msync.ssb || ms == msync.rel || ms == msync.seq, -+ false); -+ static if (isPointerType!(T)) -+ { -+ return cast(T)llvm_atomic_load_add!(size_t)(cast(size_t*)&val, 0); -+ } -+ else static if (is(T == bool)) -+ { -+ return llvm_atomic_load_add!(ubyte)(cast(ubyte*)&val, cast(ubyte)0) ? 1 : 0; -+ } -+ else -+ { -+ return llvm_atomic_load_add!(T)(&val, cast(T)0); -+ } -+ } -+ } -+ -+ -+ //////////////////////////////////////////////////////////////////////////// -+ // Atomic Store -+ //////////////////////////////////////////////////////////////////////////// -+ -+ -+ template atomicStore( msync ms = msync.seq, T ) -+ { -+ void atomicStore( ref T val, T newval ) -+ { -+ llvm_memory_barrier( -+ ms == msync.hlb || ms == msync.acq || ms == msync.seq, -+ ms == msync.hsb || ms == msync.acq || ms == msync.seq, -+ ms == msync.slb || ms == msync.rel || ms == msync.seq, -+ ms == msync.ssb || ms == msync.rel || ms == msync.seq, -+ false); -+ static if (isPointerType!(T)) -+ { -+ llvm_atomic_swap!(size_t)(cast(size_t*)&val, cast(size_t)newval); -+ } -+ else static if (is(T == bool)) -+ { -+ llvm_atomic_swap!(ubyte)(cast(ubyte*)&val, newval?1:0); -+ } -+ else -+ { -+ llvm_atomic_swap!(T)(&val, newval); -+ } -+ } -+ } -+ -+ -+ //////////////////////////////////////////////////////////////////////////// -+ // Atomic Store If -+ //////////////////////////////////////////////////////////////////////////// -+ -+ -+ template atomicStoreIf( msync ms = msync.seq, T ) -+ { -+ bool atomicStoreIf( ref T val, T newval, T equalTo ) -+ { -+ llvm_memory_barrier( -+ ms == msync.hlb || ms == msync.acq || ms == msync.seq, -+ ms == msync.hsb || ms == msync.acq || ms == msync.seq, -+ ms == msync.slb || ms == msync.rel || ms == msync.seq, -+ ms == msync.ssb || ms == msync.rel || ms == msync.seq, -+ false); -+ T oldval = void; -+ static if (isPointerType!(T)) -+ { -+ oldval = cast(T)llvm_atomic_cmp_swap!(size_t)(cast(size_t*)&val, cast(size_t)equalTo, cast(size_t)newval); -+ } -+ else static if (is(T == bool)) -+ { -+ oldval = llvm_atomic_cmp_swap!(ubyte)(cast(ubyte*)&val, equalTo?1:0, newval?1:0)?0:1; -+ } -+ else -+ { -+ oldval = llvm_atomic_cmp_swap!(T)(&val, equalTo, newval); -+ } -+ return oldval == equalTo; -+ } -+ } -+ -+ -+ //////////////////////////////////////////////////////////////////////////// -+ // Atomic Increment -+ //////////////////////////////////////////////////////////////////////////// -+ -+ -+ template atomicIncrement( msync ms = msync.seq, T ) -+ { -+ // -+ // NOTE: This operation is only valid for integer or pointer types -+ // -+ static assert( isValidNumericType!(T) ); -+ -+ -+ T atomicIncrement( ref T val ) -+ { -+ static if (isPointerType!(T)) -+ { -+ llvm_atomic_load_add!(size_t)(cast(size_t*)&val, 1); -+ } -+ else -+ { -+ llvm_atomic_load_add!(T)(&val, cast(T)1); -+ } -+ return val; -+ } -+ } -+ -+ -+ //////////////////////////////////////////////////////////////////////////// -+ // Atomic Decrement -+ //////////////////////////////////////////////////////////////////////////// -+ -+ -+ template atomicDecrement( msync ms = msync.seq, T ) -+ { -+ // -+ // NOTE: This operation is only valid for integer or pointer types -+ // -+ static assert( isValidNumericType!(T) ); -+ -+ -+ T atomicDecrement( ref T val ) -+ { -+ static if (isPointerType!(T)) -+ { -+ llvm_atomic_load_sub!(size_t)(cast(size_t*)&val, 1); -+ } -+ else -+ { -+ llvm_atomic_load_sub!(T)(&val, cast(T)1); -+ } -+ return val; -+ } -+ } -+} -+ -+//////////////////////////////////////////////////////////////////////////////// - // x86 Atomic Function Implementation - //////////////////////////////////////////////////////////////////////////////// - -Index: tango/math/IEEE.d -=================================================================== ---- tango/math/IEEE.d (revision 4150) -+++ tango/math/IEEE.d (working copy) -@@ -1554,7 +1554,12 @@ - return (bitsdiff == 0 && !((pa[F.EXPPOS_SHORT] ^ pb[F.EXPPOS_SHORT])& F.EXPMASK)) ? 1 : 0; - } - } else { -- assert(0, "Unsupported"); -+ static if (is(X==real)){ -+ static assert(0, X.stringof~" unsupported by feqrel"); -+ } else { -+ int res=feqrel(cast(real)x,cast(real)y); -+ return ((res>X.mant_dig)?X.mant_dig:res); -+ } - } - } - -Index: tango/math/Math.d -=================================================================== ---- tango/math/Math.d (revision 4150) -+++ tango/math/Math.d (working copy) -@@ -76,6 +76,14 @@ - version = DigitalMars_D_InlineAsm_X86; - } - } -+else version(LDC) -+{ -+ import ldc.intrinsics; -+ version(X86) -+ { -+ version = LDC_X86; -+ } -+} - - /* - * Constants -@@ -298,6 +306,24 @@ - * Bugs: - * Results are undefined if |x| >= $(POWER 2,64). - */ -+version(LDC) -+{ -+ alias llvm_cos_f32 cos; -+ alias llvm_cos_f64 cos; -+ version(X86) -+ { -+ alias llvm_cos_f80 cos; -+ } -+ else -+ { -+ real cos(real x) -+ { -+ return tango.stdc.math.cosl(x); -+ } -+ } -+} -+else -+{ - real cos(real x) /* intrinsic */ - { - version(D_InlineAsm_X86) -@@ -313,6 +339,7 @@ - return tango.stdc.math.cosl(x); - } - } -+} - - debug(UnitTest) { - unittest { -@@ -333,6 +360,24 @@ - * Bugs: - * Results are undefined if |x| >= $(POWER 2,64). - */ -+version(LDC) -+{ -+ alias llvm_sin_f32 sin; -+ alias llvm_sin_f64 sin; -+ version(X86) -+ { -+ alias llvm_sin_f80 sin; -+ } -+ else -+ { -+ real sin(real x) -+ { -+ return tango.stdc.math.sinl(x); -+ } -+ } -+} -+else -+{ - real sin(real x) /* intrinsic */ - { - version(D_InlineAsm_X86) -@@ -348,6 +393,7 @@ - return tango.stdc.math.sinl(x); - } - } -+} - - debug(UnitTest) { - unittest { -@@ -374,7 +420,11 @@ - { - version (GNU) { - return tanl(x); -- } else { -+ } -+ else version(LDC) { -+ return tango.stdc.math.tanl(x); -+ } -+ else { - asm - { - fld x[EBP] ; // load theta -@@ -947,6 +997,25 @@ - * +∞ +∞ no - * ) - */ -+version(LDC) -+{ -+ alias llvm_sqrt_f32 sqrt; -+ alias llvm_sqrt_f64 sqrt; -+ version(X86) -+ { -+ alias llvm_sqrt_f80 sqrt; -+ } -+ else -+ { -+ real sqrt(real x) -+ { -+ return tango.stdc.math.sqrtl(x); -+ } -+ } -+} -+else -+{ -+ - float sqrt(float x) /* intrinsic */ - { - version(D_InlineAsm_X86) -@@ -995,6 +1064,8 @@ - } - } - -+} -+ - /** ditto */ - creal sqrt(creal z) - { -@@ -1477,7 +1548,14 @@ - } - } - } -- return tango.stdc.math.powl(x, y); -+ version(LDC_X86) -+ { -+ return llvm_pow_f80(x, y); -+ } -+ else -+ { -+ return tango.stdc.math.powl(x, y); -+ } - } - - debug(UnitTest) { -Index: tango/stdc/posix/sys/types.d -=================================================================== ---- tango/stdc/posix/sys/types.d (revision 4150) -+++ tango/stdc/posix/sys/types.d (working copy) -@@ -422,7 +422,11 @@ - } - else version( darwin ) - { -- struct pthread_spinlock_t; -+ version (LDC) -+ alias void* pthread_spinlock_t; -+ -+ else -+ struct pthread_spinlock_t; - } - else version( freebsd ) - { -Index: tango/stdc/stdlib.d -=================================================================== ---- tango/stdc/stdlib.d (revision 4150) -+++ tango/stdc/stdlib.d (working copy) -@@ -94,6 +94,11 @@ - { - void* alloca(size_t size); - } -+else version( LDC ) -+{ -+ pragma(alloca) -+ void* alloca(size_t size); -+} - else version( GNU ) - { - private import gcc.builtins; -Index: tango/stdc/stdarg.d -=================================================================== ---- tango/stdc/stdarg.d (revision 4150) -+++ tango/stdc/stdarg.d (working copy) -@@ -13,6 +13,10 @@ - { - public import std.c.stdarg; - } -+else version( LDC ) -+{ -+ public import ldc.cstdarg; -+} - else - { - alias void* va_list; -Index: tango/stdc/stdio.d -=================================================================== ---- tango/stdc/stdio.d (revision 4155) -+++ tango/stdc/stdio.d (working copy) -@@ -249,6 +249,24 @@ - stdprn = &(*_imp___iob)[4]; - } - } -+ else version (LDC) { -+ extern FILE[_NFILE]* _imp___iob; -+ -+ auto FILE* stdin; -+ auto FILE* stdout; -+ auto FILE* stderr; -+ auto FILE* stdaux; -+ auto FILE* stdprn; -+ -+ static this() -+ { -+ stdin = &(*_imp___iob)[0]; -+ stdout = &(*_imp___iob)[1]; -+ stderr = &(*_imp___iob)[2]; -+ stdaux = &(*_imp___iob)[3]; -+ stdprn = &(*_imp___iob)[4]; -+ } -+ } - else - { - extern FILE[_NFILE] _iob; diff -r a331ce9bc749 -r 2ddee23bd70e runtime/patch-tango.sh --- a/runtime/patch-tango.sh Mon Jan 05 21:11:47 2009 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#!/bin/bash - -cd ../tango -patch -p0 < ../runtime/ldc.diff