mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-12 02:43:14 +01:00
976 lines
29 KiB
Diff
976 lines
29 KiB
Diff
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/import/object.di druntime/import/object.di
|
|
--- druntime-orig/import/object.di 2010-09-03 12:28:52.000000000 +0400
|
|
+++ druntime/import/object.di 2010-10-27 00:22:27.444925001 +0400
|
|
@@ -130,7 +130,7 @@
|
|
Interface[] interfaces;
|
|
TypeInfo_Class base;
|
|
void* destructor;
|
|
- void(*classInvariant)(Object);
|
|
+ void function(Object) classInvariant;
|
|
uint m_flags;
|
|
// 1: // is IUnknown or is derived from IUnknown
|
|
// 2: // has no possible pointers into GC memory
|
|
@@ -140,7 +140,7 @@
|
|
// 32: // has typeinfo member
|
|
void* deallocator;
|
|
OffsetTypeInfo[] m_offTi;
|
|
- void* defaultConstructor;
|
|
+ void function(Object) defaultConstructor; // default Constructor
|
|
const(MemberInfo[]) function(string) xgetMembers;
|
|
|
|
static TypeInfo_Class find(in char[] classname);
|
|
@@ -179,7 +179,7 @@
|
|
|
|
class TypeInfo_Const : TypeInfo
|
|
{
|
|
- TypeInfo next;
|
|
+ TypeInfo base;
|
|
}
|
|
|
|
class TypeInfo_Invariant : TypeInfo_Const
|
|
@@ -288,7 +288,6 @@
|
|
interface TraceInfo
|
|
{
|
|
int opApply(scope int delegate(ref char[]));
|
|
- string toString();
|
|
}
|
|
|
|
string msg;
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/core/atomic.d druntime/src/core/atomic.d
|
|
--- druntime-orig/src/core/atomic.d 2010-09-03 12:28:52.000000000 +0400
|
|
+++ druntime/src/core/atomic.d 2010-10-05 15:55:10.893150001 +0400
|
|
@@ -89,6 +89,117 @@
|
|
return false;
|
|
}
|
|
}
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+// LDC Atomics Implementation
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
+else version( LDC )
|
|
+{
|
|
+ import ldc.intrinsics;
|
|
+
|
|
+ T atomicOp(string op, T, V1)( ref shared T val, V1 mod )
|
|
+ if( is( NakedType!(V1) == NakedType!(T) ) )
|
|
+ {
|
|
+ // binary operators
|
|
+ //
|
|
+ // + - * / % ^^ &
|
|
+ // | ^ << >> >>> ~ in
|
|
+ // == != < <= > >=
|
|
+ static if( op == "+" || op == "-" || op == "*" || op == "/" ||
|
|
+ op == "%" || op == "^^" || op == "&" || op == "|" ||
|
|
+ op == "^" || op == "<<" || op == ">>" || op == ">>>" ||
|
|
+ op == "~" || // skip "in"
|
|
+ op == "==" || op == "!=" || op == "<" || op == "<=" ||
|
|
+ op == ">" || op == ">=" )
|
|
+ {
|
|
+ T get = val; // compiler can do atomic load
|
|
+ mixin( "return get " ~ op ~ " mod;" );
|
|
+ }
|
|
+ else
|
|
+ // assignment operators
|
|
+ //
|
|
+ // += -= *= /= %= ^^= &=
|
|
+ // |= ^= <<= >>= >>>= ~=
|
|
+ static if( op == "+=" || op == "-=" || op == "*=" || op == "/=" ||
|
|
+ op == "%=" || op == "^^=" || op == "&=" || op == "|=" ||
|
|
+ op == "^=" || op == "<<=" || op == ">>=" || op == ">>>=" ) // skip "~="
|
|
+ {
|
|
+ T get, set;
|
|
+
|
|
+ do
|
|
+ {
|
|
+ get = set = atomicLoad!(msync.raw)( val );
|
|
+ mixin( "set " ~ op ~ " mod;" );
|
|
+ } while( !cas( &val, get, set ) );
|
|
+ return set;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ static assert( false, "Operation not supported." );
|
|
+ }
|
|
+ }
|
|
+
|
|
+ bool cas(T,V1,V2)( shared(T)* here, const V1 ifThis, const V2 writeThis )
|
|
+ if( is( NakedType!(V1) == NakedType!(T) ) &&
|
|
+ is( NakedType!(V2) == NakedType!(T) ) )
|
|
+
|
|
+ {
|
|
+ T oldval = void;
|
|
+ static if (is(T P == U*, U))
|
|
+ {
|
|
+ oldval = cast(T)llvm_atomic_cmp_swap!(size_t)(cast(shared size_t*)&writeThis, cast(size_t)ifThis, cast(size_t)here);
|
|
+ }
|
|
+ else static if (is(T == bool))
|
|
+ {
|
|
+ oldval = llvm_atomic_cmp_swap!(ubyte)(cast(shared ubyte*)&writeThis, ifThis?1:0, here?1:0)?0:1;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ oldval = llvm_atomic_cmp_swap!(T)(here, ifThis, writeThis);
|
|
+ }
|
|
+ return oldval == ifThis;
|
|
+ }
|
|
+
|
|
+
|
|
+ private
|
|
+ {
|
|
+ enum msync
|
|
+ {
|
|
+ raw, /// not sequenced
|
|
+ acq, /// hoist-load + hoist-store barrier
|
|
+ rel, /// sink-load + sink-store barrier
|
|
+ seq, /// fully sequenced (acq + rel)
|
|
+ }
|
|
+
|
|
+ T atomicLoad(msync ms = msync.seq, T)( const ref shared T val )
|
|
+ {
|
|
+ llvm_memory_barrier(
|
|
+ ms == msync.acq || ms == msync.seq,
|
|
+ ms == msync.acq || ms == msync.seq,
|
|
+ ms == msync.rel || ms == msync.seq,
|
|
+ ms == msync.rel || ms == msync.seq,
|
|
+ false);
|
|
+ static if (is(T P == U*, U)) // pointer
|
|
+ {
|
|
+ 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);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+// x86_32 Atomic Function Implementation
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
else version( AsmX86_32 )
|
|
{
|
|
T atomicOp(string op, T, V1)( ref shared T val, V1 mod )
|
|
@@ -396,6 +507,12 @@
|
|
}
|
|
}
|
|
}
|
|
+
|
|
+
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+// x86_64 Atomic Function Implementation
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
+
|
|
else version( AsmX86_64 )
|
|
{
|
|
T atomicOp(string op, T, V1)( ref shared T val, V1 mod )
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/core/stdc/math.d druntime/src/core/stdc/math.d
|
|
--- druntime-orig/src/core/stdc/math.d 2010-09-03 12:28:52.000000000 +0400
|
|
+++ druntime/src/core/stdc/math.d 2010-10-26 16:47:04.036925000 +0400
|
|
@@ -17,6 +17,7 @@
|
|
|
|
extern (C):
|
|
nothrow:
|
|
+pure: // LDC
|
|
|
|
alias float float_t;
|
|
alias double double_t;
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/core/stdc/stdlib.d druntime/src/core/stdc/stdlib.d
|
|
--- druntime-orig/src/core/stdc/stdlib.d 2010-08-05 05:39:08.000000000 +0400
|
|
+++ druntime/src/core/stdc/stdlib.d 2010-10-26 19:26:03.996925001 +0400
|
|
@@ -92,3 +92,13 @@
|
|
{
|
|
void* alloca(size_t size); // non-standard
|
|
}
|
|
+else version( LDC )
|
|
+{
|
|
+ pragma(alloca)
|
|
+ void* alloca(size_t size);
|
|
+}
|
|
+else version( GNU )
|
|
+{
|
|
+ private import gcc.builtins;
|
|
+ alias gcc.builtins.__builtin_alloca alloca;
|
|
+}
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/gc/gcbits.d druntime/src/gc/gcbits.d
|
|
--- druntime-orig/src/gc/gcbits.d 2010-08-08 04:10:24.000000000 +0400
|
|
+++ druntime/src/gc/gcbits.d 2010-10-01 20:49:51.268892001 +0400
|
|
@@ -26,6 +26,10 @@
|
|
{
|
|
version = bitops;
|
|
}
|
|
+else version (LDC)
|
|
+{
|
|
+ version = bitops;
|
|
+}
|
|
else version (GNU)
|
|
{
|
|
// use the unoptimized version
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/gc/gcx.d druntime/src/gc/gcx.d
|
|
--- druntime-orig/src/gc/gcx.d 2010-08-27 01:23:26.000000000 +0400
|
|
+++ druntime/src/gc/gcx.d 2010-10-07 22:27:41.879253001 +0400
|
|
@@ -1464,7 +1464,8 @@
|
|
|
|
|
|
void initialize()
|
|
- { int dummy;
|
|
+ {
|
|
+ int dummy;
|
|
|
|
(cast(byte*)&this)[0 .. Gcx.sizeof] = 0;
|
|
stackBottom = cast(char*)&dummy;
|
|
@@ -2200,7 +2201,7 @@
|
|
if ((cast(size_t)p & ~(PAGESIZE-1)) == pcache)
|
|
continue;
|
|
|
|
- auto pool = findPool(p);
|
|
+ auto pool = findPool(p);
|
|
if (pool)
|
|
{
|
|
size_t offset = cast(size_t)(p - pool.baseAddr);
|
|
@@ -2270,80 +2271,129 @@
|
|
__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,r8,r9,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 r8 [RBP], R8 ;
|
|
+ movq r9 [RBP], R9 ;
|
|
+ movq r10[RBP], R10 ;
|
|
+ movq r11[RBP], R11 ;
|
|
+ movq r12[RBP], R12 ;
|
|
+ movq r13[RBP], R13 ;
|
|
+ movq r14[RBP], R14 ;
|
|
+ movq r15[RBP], R15 ;
|
|
+ movq sp[RBP], RSP ;
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ static assert( false, "Architecture not supported." );
|
|
+ }
|
|
+ }
|
|
else version( D_InlineAsm_X86 )
|
|
{
|
|
- asm
|
|
- {
|
|
- pushad ;
|
|
- mov sp[EBP],ESP ;
|
|
- }
|
|
+ asm
|
|
+ {
|
|
+ pushad ;
|
|
+ mov sp[EBP],ESP ;
|
|
+ }
|
|
+ }
|
|
+ else version ( D_InlineAsm_X86_64 )
|
|
+ {
|
|
+ asm
|
|
+ {
|
|
+ push RAX ;
|
|
+ push RBX ;
|
|
+ push RCX ;
|
|
+ push RDX ;
|
|
+ push RSI ;
|
|
+ push RDI ;
|
|
+ push RBP ;
|
|
+ push R8 ;
|
|
+ push R9 ;
|
|
+ push R10 ;
|
|
+ push R11 ;
|
|
+ push R12 ;
|
|
+ push R13 ;
|
|
+ push R14 ;
|
|
+ push R15 ;
|
|
+ push EAX ; // 16 byte align the stack
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ static assert( false, "Architecture not supported." );
|
|
}
|
|
- else version ( D_InlineAsm_X86_64 )
|
|
- {
|
|
- asm
|
|
- {
|
|
- push RAX ;
|
|
- push RBX ;
|
|
- push RCX ;
|
|
- push RDX ;
|
|
- push RSI ;
|
|
- push RDI ;
|
|
- push RBP ;
|
|
- push R8 ;
|
|
- push R9 ;
|
|
- push R10 ;
|
|
- push R11 ;
|
|
- push R12 ;
|
|
- push R13 ;
|
|
- push R14 ;
|
|
- push R15 ;
|
|
- push EAX ; // 16 byte align the stack
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- static assert( false, "Architecture not supported." );
|
|
- }
|
|
|
|
result = fullcollect(sp);
|
|
|
|
- version( GNU )
|
|
- {
|
|
- // registers will be popped automatically
|
|
- }
|
|
- else version( D_InlineAsm_X86 )
|
|
- {
|
|
- asm
|
|
- {
|
|
- popad;
|
|
- }
|
|
- }
|
|
- else version ( D_InlineAsm_X86_64 )
|
|
- {
|
|
- asm
|
|
- {
|
|
- pop EAX ; // 16 byte align the stack
|
|
- pop R15 ;
|
|
- pop R14 ;
|
|
- pop R13 ;
|
|
- pop R12 ;
|
|
- pop R11 ;
|
|
- pop R10 ;
|
|
- pop R9 ;
|
|
- pop R8 ;
|
|
- pop RBP ;
|
|
- pop RDI ;
|
|
- pop RSI ;
|
|
- pop RDX ;
|
|
- pop RCX ;
|
|
- pop RBX ;
|
|
- pop RAX ;
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- static assert( false, "Architecture not supported." );
|
|
- }
|
|
+ version( GNU )
|
|
+ {
|
|
+ // registers will be popped automatically
|
|
+ }
|
|
+ else version(LDC)
|
|
+ {
|
|
+ // nothing to do
|
|
+ }
|
|
+ else version( D_InlineAsm_X86 )
|
|
+ {
|
|
+ asm
|
|
+ {
|
|
+ popad;
|
|
+ }
|
|
+ }
|
|
+ else version ( D_InlineAsm_X86_64 )
|
|
+ {
|
|
+ asm
|
|
+ {
|
|
+ pop EAX ; // 16 byte align the stack
|
|
+ pop R15 ;
|
|
+ pop R14 ;
|
|
+ pop R13 ;
|
|
+ pop R12 ;
|
|
+ pop R11 ;
|
|
+ pop R10 ;
|
|
+ pop R9 ;
|
|
+ pop R8 ;
|
|
+ pop RBP ;
|
|
+ pop RDI ;
|
|
+ pop RSI ;
|
|
+ pop RDX ;
|
|
+ pop RCX ;
|
|
+ pop RBX ;
|
|
+ pop RAX ;
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ static assert( false, "Architecture not supported." );
|
|
+ }
|
|
return result;
|
|
}
|
|
|
|
@@ -2357,7 +2407,7 @@
|
|
Pool* pool;
|
|
|
|
debug(COLLECT_PRINTF) printf("Gcx.fullcollect()\n");
|
|
- //printf("\tpool address range = %p .. %p\n", minAddr, maxAddr);
|
|
+ //printf("\tpool address range = %p .. %p\n", minAddr, maxAddr);
|
|
|
|
thread_suspendAll();
|
|
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/object_.d druntime/src/object_.d
|
|
--- druntime-orig/src/object_.d 2010-10-26 18:47:41.840925001 +0400
|
|
+++ druntime/src/object_.d 2010-10-26 19:27:09.224925000 +0400
|
|
@@ -1073,7 +1073,7 @@
|
|
|
|
abstract class MemberInfo
|
|
{
|
|
- string name();
|
|
+ string name() { return ""; }; // LDC: FIXME:
|
|
}
|
|
|
|
class MemberInfo_field : MemberInfo
|
|
@@ -1663,7 +1663,6 @@
|
|
{
|
|
int len = 0;
|
|
ModuleReference *mr;
|
|
-
|
|
for (mr = _Dmodule_ref; mr; mr = mr.next)
|
|
len++;
|
|
_moduleinfo_array = new ModuleInfo*[len];
|
|
@@ -2025,7 +2024,6 @@
|
|
_d_monitor_create(h);
|
|
m = getMonitor(h);
|
|
}
|
|
-
|
|
IMonitor i = m.impl;
|
|
|
|
if (i is null)
|
|
@@ -2124,7 +2122,7 @@
|
|
size_t _aaLen(void* p);
|
|
void* _aaGet(void** pp, TypeInfo keyti, size_t valuesize, ...);
|
|
void* _aaGetRvalue(void* p, TypeInfo keyti, size_t valuesize, ...);
|
|
- void* _aaIn(void* p, TypeInfo keyti);
|
|
+ void* _aaIn(void* p, TypeInfo keyti, ...);
|
|
void _aaDel(void* p, TypeInfo keyti, ...);
|
|
void[] _aaValues(void* p, size_t keysize, size_t valuesize);
|
|
void[] _aaKeys(void* p, size_t keysize, size_t valuesize);
|
|
@@ -2169,7 +2167,7 @@
|
|
return *cast(Key[]*) &a;
|
|
}
|
|
|
|
- int opApply(scope int delegate(ref Key, ref Value) dg)
|
|
+ int opApply(scope int delegate(ref Key, ref const Value) dg)
|
|
{
|
|
return _aaApply2(p, aligntsize(Key.sizeof), cast(_dg2_t)dg);
|
|
}
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/aaA.d druntime/src/rt/aaA.d
|
|
--- druntime-orig/src/rt/aaA.d 2010-08-05 05:39:06.000000000 +0400
|
|
+++ druntime/src/rt/aaA.d 2010-10-29 10:48:36.165035001 +0400
|
|
@@ -204,7 +204,7 @@
|
|
* Add entry for key if it is not already there.
|
|
*/
|
|
|
|
-void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, ...)
|
|
+void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, void *pkey)
|
|
in
|
|
{
|
|
assert(aa);
|
|
@@ -218,7 +218,6 @@
|
|
}
|
|
body
|
|
{
|
|
- auto pkey = cast(void *)(&valuesize + 1);
|
|
size_t i;
|
|
aaA *e;
|
|
//printf("keyti = %p\n", keyti);
|
|
@@ -274,13 +273,12 @@
|
|
* Returns null if it is not already there.
|
|
*/
|
|
|
|
-void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, ...)
|
|
+void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void *pkey)
|
|
{
|
|
//printf("_aaGetRvalue(valuesize = %u)\n", valuesize);
|
|
if (!aa.a)
|
|
return null;
|
|
|
|
- auto pkey = cast(void *)(&valuesize + 1);
|
|
auto keysize = aligntsize(keyti.tsize());
|
|
auto len = aa.a.b.length;
|
|
|
|
@@ -312,7 +310,7 @@
|
|
* !=null in aa, return pointer to value
|
|
*/
|
|
|
|
-void* _aaIn(AA aa, TypeInfo keyti, ...)
|
|
+void* _aaIn(AA aa, TypeInfo keyti, void *pkey)
|
|
in
|
|
{
|
|
}
|
|
@@ -324,8 +322,6 @@
|
|
{
|
|
if (aa.a)
|
|
{
|
|
- auto pkey = cast(void *)(&keyti + 1);
|
|
-
|
|
//printf("_aaIn(), .length = %d, .ptr = %x\n", aa.a.length, cast(uint)aa.a.ptr);
|
|
auto len = aa.a.b.length;
|
|
|
|
@@ -357,9 +353,8 @@
|
|
* If key is not in aa[], do nothing.
|
|
*/
|
|
|
|
-void _aaDel(AA aa, TypeInfo keyti, ...)
|
|
+void _aaDel(AA aa, TypeInfo keyti, void *pkey)
|
|
{
|
|
- auto pkey = cast(void *)(&keyti + 1);
|
|
aaA *e;
|
|
|
|
if (aa.a && aa.a.b.length)
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/adi.d druntime/src/rt/adi.d
|
|
--- druntime-orig/src/rt/adi.d 2010-08-05 05:39:06.000000000 +0400
|
|
+++ druntime/src/rt/adi.d 2010-10-29 11:49:52.065035002 +0400
|
|
@@ -35,6 +35,8 @@
|
|
extern (C) void gc_free( void* p );
|
|
}
|
|
|
|
+version (DMD) version (X86)
|
|
+ version = DMD_X86;
|
|
|
|
struct Array
|
|
{
|
|
@@ -48,7 +50,7 @@
|
|
* reversed.
|
|
*/
|
|
|
|
-extern (C) long _adReverseChar(char[] a)
|
|
+extern (C) char[] _adReverseChar(char[] a)
|
|
{
|
|
if (a.length > 1)
|
|
{
|
|
@@ -108,7 +110,7 @@
|
|
hi = hi - 1 + (stridehi - stridelo);
|
|
}
|
|
}
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
|
|
unittest
|
|
@@ -143,7 +145,7 @@
|
|
* reversed.
|
|
*/
|
|
|
|
-extern (C) long _adReverseWchar(wchar[] a)
|
|
+extern (C) wchar[] _adReverseWchar(wchar[] a)
|
|
{
|
|
if (a.length > 1)
|
|
{
|
|
@@ -201,7 +203,7 @@
|
|
hi = hi - 1 + (stridehi - stridelo);
|
|
}
|
|
}
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
|
|
unittest
|
|
@@ -225,10 +227,10 @@
|
|
* Support for array.reverse property.
|
|
*/
|
|
|
|
-extern (C) long _adReverse(Array a, size_t szelem)
|
|
+extern (C) void[] _adReverse(void[] a, size_t szelem)
|
|
out (result)
|
|
{
|
|
- assert(result is *cast(long*)(&a));
|
|
+ assert(result.ptr is a.ptr);
|
|
}
|
|
body
|
|
{
|
|
@@ -267,7 +269,7 @@
|
|
//gc_free(tmp);
|
|
}
|
|
}
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
|
|
unittest
|
|
@@ -311,7 +313,7 @@
|
|
* Sort array of chars.
|
|
*/
|
|
|
|
-extern (C) long _adSortChar(char[] a)
|
|
+extern (C) char[] _adSortChar(char[] a)
|
|
{
|
|
if (a.length > 1)
|
|
{
|
|
@@ -326,14 +328,14 @@
|
|
}
|
|
delete da;
|
|
}
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
|
|
/**********************************************
|
|
* Sort array of wchars.
|
|
*/
|
|
|
|
-extern (C) long _adSortWchar(wchar[] a)
|
|
+extern (C) wchar[] _adSortWchar(wchar[] a)
|
|
{
|
|
if (a.length > 1)
|
|
{
|
|
@@ -348,7 +350,7 @@
|
|
}
|
|
delete da;
|
|
}
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
|
|
/***************************************
|
|
@@ -358,7 +360,7 @@
|
|
* 0 not equal
|
|
*/
|
|
|
|
-extern (C) int _adEq(Array a1, Array a2, TypeInfo ti)
|
|
+extern (C) int _adEq(void[] a1, void[] a2, TypeInfo ti)
|
|
{
|
|
debug(adi) printf("_adEq(a1.length = %d, a2.length = %d)\n", a1.length, a2.length);
|
|
if (a1.length != a2.length)
|
|
@@ -379,7 +381,7 @@
|
|
return 1; // equal
|
|
}
|
|
|
|
-extern (C) int _adEq2(Array a1, Array a2, TypeInfo ti)
|
|
+extern (C) int _adEq2(void[] a1, void[] a2, TypeInfo ti)
|
|
{
|
|
debug(adi) printf("_adEq2(a1.length = %d, a2.length = %d)\n", a1.length, a2.length);
|
|
if (a1.length != a2.length)
|
|
@@ -405,7 +407,7 @@
|
|
* Support for array compare test.
|
|
*/
|
|
|
|
-extern (C) int _adCmp(Array a1, Array a2, TypeInfo ti)
|
|
+extern (C) int _adCmp(void[] a1, void[] a2, TypeInfo ti)
|
|
{
|
|
debug(adi) printf("adCmp()\n");
|
|
auto len = a1.length;
|
|
@@ -435,7 +437,7 @@
|
|
return (a1.length > a2.length) ? 1 : -1;
|
|
}
|
|
|
|
-extern (C) int _adCmp2(Array a1, Array a2, TypeInfo ti)
|
|
+extern (C) int _adCmp2(void[] a1, void[] a2, TypeInfo ti)
|
|
{
|
|
debug(adi) printf("_adCmp2(a1.length = %d, a2.length = %d)\n", a1.length, a2.length);
|
|
return ti.compare(&a1, &a2);
|
|
@@ -461,9 +463,9 @@
|
|
* Support for array compare test.
|
|
*/
|
|
|
|
-extern (C) int _adCmpChar(Array a1, Array a2)
|
|
+extern (C) int _adCmpChar(void[] a1, void[] a2)
|
|
{
|
|
- version (X86)
|
|
+ version (DMD_X86)
|
|
{
|
|
asm
|
|
{ naked ;
|
|
@@ -569,8 +571,8 @@
|
|
|
|
ret ;
|
|
}
|
|
- }
|
|
- else
|
|
+ }
|
|
+ else
|
|
{
|
|
int len;
|
|
int c;
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/alloca.d druntime/src/rt/alloca.d
|
|
--- druntime-orig/src/rt/alloca.d 2010-08-05 05:39:06.000000000 +0400
|
|
+++ druntime/src/rt/alloca.d 2010-10-08 22:31:50.989547000 +0400
|
|
@@ -12,6 +12,9 @@
|
|
*/
|
|
module rt.alloca;
|
|
|
|
+version (DMD)
|
|
+{
|
|
+
|
|
/+
|
|
#if DOS386
|
|
extern size_t _x386_break;
|
|
@@ -133,3 +136,5 @@
|
|
ret ;
|
|
}
|
|
}
|
|
+
|
|
+}
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/lifetime.d druntime/src/rt/lifetime.d
|
|
--- druntime-orig/src/rt/lifetime.d 2010-08-05 05:39:06.000000000 +0400
|
|
+++ druntime/src/rt/lifetime.d 2010-10-29 10:40:39.533035001 +0400
|
|
@@ -92,6 +92,18 @@
|
|
return gc_malloc(sz);
|
|
}
|
|
|
|
+version (LDC)
|
|
+{
|
|
+
|
|
+/**
|
|
+ * for allocating a single POD value
|
|
+ */
|
|
+extern (C) void* _d_allocmemoryT(TypeInfo ti)
|
|
+{
|
|
+ return gc_malloc(ti.tsize(), !(ti.flags() & 1) ? BlkAttr.NO_SCAN : 0);
|
|
+}
|
|
+
|
|
+} // version (LDC)
|
|
|
|
/**
|
|
*
|
|
@@ -670,7 +682,7 @@
|
|
* ti is the type of the resulting array, or pointer to element.
|
|
* (For when the array is initialized to 0)
|
|
*/
|
|
-extern (C) ulong _d_newarrayT(TypeInfo ti, size_t length)
|
|
+extern (C) void[] _d_newarrayT(TypeInfo ti, size_t length)
|
|
{
|
|
ulong result;
|
|
auto size = ti.next.tsize(); // array element size
|
|
@@ -702,7 +714,7 @@
|
|
__setArrayAllocLength(info, size, isshared);
|
|
result = cast(ulong)length + (cast(ulong)cast(size_t)arrstart << 32);
|
|
}
|
|
- return result;
|
|
+ return *cast(void[]*)&result;
|
|
|
|
Loverflow:
|
|
onOutOfMemoryError();
|
|
@@ -711,7 +723,7 @@
|
|
/**
|
|
* For when the array has a non-zero initializer.
|
|
*/
|
|
-extern (C) ulong _d_newarrayiT(TypeInfo ti, size_t length)
|
|
+extern (C) void[] _d_newarrayiT(TypeInfo ti, size_t length)
|
|
{
|
|
ulong result;
|
|
auto size = ti.next.tsize(); // array element size
|
|
@@ -764,7 +776,7 @@
|
|
__setArrayAllocLength(info, size, isshared);
|
|
result = cast(ulong)length + (cast(ulong)cast(uint)arrstart << 32);
|
|
}
|
|
- return result;
|
|
+ return *cast(void[]*)&result;
|
|
|
|
Loverflow:
|
|
onOutOfMemoryError();
|
|
@@ -773,7 +785,7 @@
|
|
/**
|
|
*
|
|
*/
|
|
-extern (C) ulong _d_newarraymT(TypeInfo ti, int ndims, ...)
|
|
+extern (C) void[] _d_newarraymT(TypeInfo ti, int ndims, ...)
|
|
{
|
|
ulong result;
|
|
|
|
@@ -823,14 +835,14 @@
|
|
}
|
|
va_end(q);
|
|
}
|
|
- return result;
|
|
+ return *cast(void[]*)&result;
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
*/
|
|
-extern (C) ulong _d_newarraymiT(TypeInfo ti, int ndims, ...)
|
|
+extern (C) void[] _d_newarraymiT(TypeInfo ti, int ndims, ...)
|
|
{
|
|
ulong result;
|
|
|
|
@@ -881,7 +893,7 @@
|
|
}
|
|
va_end(q);
|
|
}
|
|
- return result;
|
|
+ return *cast(void[]*)&result;
|
|
}
|
|
|
|
|
|
@@ -1381,7 +1393,7 @@
|
|
* Append y[] to array pointed to by px
|
|
* size is size of each array element.
|
|
*/
|
|
-extern (C) long _d_arrayappendT(TypeInfo ti, Array *px, byte[] y)
|
|
+extern (C) void[] _d_arrayappendT(TypeInfo ti, Array *px, byte[] y)
|
|
{
|
|
// only optimize array append where ti is not a shared type
|
|
auto sizeelem = ti.next.tsize(); // array element size
|
|
@@ -1468,7 +1480,7 @@
|
|
L1:
|
|
px.length = newlength;
|
|
memcpy(px.data + length * sizeelem, y.ptr, y.length * sizeelem);
|
|
- return *cast(long*)px;
|
|
+ return *cast(void[]*)px;
|
|
}
|
|
|
|
|
|
@@ -1552,21 +1564,36 @@
|
|
return newcap;
|
|
}
|
|
|
|
+version (LDC)
|
|
+{
|
|
+
|
|
+/**
|
|
+ * Appends a single element to an array.
|
|
+ */
|
|
+extern (C) void[] _d_arrayappendcT(TypeInfo ti, byte[] *x, byte *argp)
|
|
+{
|
|
+ return _d_arrayappendT(ti, cast(Array*)x, argp[0..1]);
|
|
+}
|
|
+
|
|
+}
|
|
+else
|
|
+{
|
|
|
|
/**
|
|
*
|
|
*/
|
|
-extern (C) long _d_arrayappendcT(TypeInfo ti, Array *x, ...)
|
|
+extern (C) void[] _d_arrayappendcT(TypeInfo ti, Array *x, ...)
|
|
{
|
|
byte *argp = cast(byte*)(&ti + 2);
|
|
return _d_arrayappendT(ti, x, argp[0..1]);
|
|
}
|
|
|
|
+}
|
|
|
|
/**
|
|
* Append dchar to char[]
|
|
*/
|
|
-extern (C) long _d_arrayappendcd(ref char[] x, dchar c)
|
|
+extern (C) void[] _d_arrayappendcd(ref char[] x, dchar c)
|
|
{
|
|
// c could encode into from 1 to 4 characters
|
|
char[4] buf = void;
|
|
@@ -1612,7 +1639,7 @@
|
|
/**
|
|
* Append dchar to wchar[]
|
|
*/
|
|
-extern (C) long _d_arrayappendwd(ref wchar[] x, dchar c)
|
|
+extern (C) void[] _d_arrayappendwd(ref wchar[] x, dchar c)
|
|
{
|
|
// c could encode into from 1 to 2 w characters
|
|
wchar[2] buf = void;
|
|
@@ -1798,7 +1825,7 @@
|
|
/**
|
|
*
|
|
*/
|
|
-extern (C) long _adDupT(TypeInfo ti, Array2 a)
|
|
+extern (C) void[] _adDupT(TypeInfo ti, void[] a)
|
|
out (result)
|
|
{
|
|
auto sizeelem = ti.next.tsize(); // array element size
|
|
@@ -1819,7 +1846,7 @@
|
|
r.length = a.length;
|
|
memcpy(r.ptr, a.ptr, size);
|
|
}
|
|
- return *cast(long*)(&r);
|
|
+ return *cast(void[]*)(&r);
|
|
}
|
|
|
|
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/qsort.d druntime/src/rt/qsort.d
|
|
--- druntime-orig/src/rt/qsort.d 2010-08-05 05:39:06.000000000 +0400
|
|
+++ druntime/src/rt/qsort.d 2010-10-07 13:59:06.815253002 +0400
|
|
@@ -44,7 +44,7 @@
|
|
structures. The default value is optimized for a high cost for compares. */
|
|
|
|
|
|
-extern (C) long _adSort(Array a, TypeInfo ti)
|
|
+extern (C) void[] _adSort(void[] a, TypeInfo ti)
|
|
{
|
|
byte* base;
|
|
byte*[40] stack; // stack
|
|
@@ -124,7 +124,7 @@
|
|
limit = sp[1];
|
|
}
|
|
else // else stack empty, all done
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
assert(0);
|
|
}
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/qsort2.d druntime/src/rt/qsort2.d
|
|
--- druntime-orig/src/rt/qsort2.d 2010-08-05 05:39:06.000000000 +0400
|
|
+++ druntime/src/rt/qsort2.d 2010-10-07 14:01:41.359253001 +0400
|
|
@@ -31,14 +31,14 @@
|
|
return tiglobal.compare(p1, p2);
|
|
}
|
|
|
|
-extern (C) long _adSort(Array a, TypeInfo ti)
|
|
+extern (C) void[] _adSort(void[] a, TypeInfo ti)
|
|
{
|
|
synchronized
|
|
{
|
|
tiglobal = ti;
|
|
qsort(a.ptr, a.length, cast(size_t)ti.tsize(), &cmp);
|
|
}
|
|
- return *cast(long*)(&a);
|
|
+ return a;
|
|
}
|
|
|
|
|
|
diff -U 3 -H -d -r -N -x '*.mak' -x tk -x backend -x debug -x release -x '*_pch.h' -x Makefile -x '*.rej' -x '*~' -x '*.log' -x .svn -x '*pro.user' -x .directory -x cmake_install -x CMakeFiles -x .preprocessed.tmp -x 'Makefile.*' -x '*.orig' -- druntime-orig/src/rt/trace.d druntime/src/rt/trace.d
|
|
--- druntime-orig/src/rt/trace.d 2010-08-07 09:46:06.000000000 +0400
|
|
+++ druntime/src/rt/trace.d 2010-10-01 21:01:58.444892002 +0400
|
|
@@ -855,7 +855,7 @@
|
|
version (OSX)
|
|
{ // 16 byte align stack
|
|
asm
|
|
- { naked ;
|
|
+ {
|
|
pushad ;
|
|
sub ESP,12 ;
|
|
}
|
|
@@ -870,7 +870,7 @@
|
|
else
|
|
{
|
|
asm
|
|
- { naked ;
|
|
+ {
|
|
pushad ;
|
|
}
|
|
trace_epi();
|