[Issue 5478] New: API/ABI differences/issues in d-runtime
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Jan 23 09:53:12 PST 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5478
Summary: API/ABI differences/issues in d-runtime
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: normal
Priority: P2
Component: druntime
AssignedTo: sean at invisibleduck.org
ReportedBy: ibuclaw at ubuntu.com
--- Comment #0 from Iain Buclaw <ibuclaw at ubuntu.com> 2011-01-23 09:51:06 PST ---
I'm going to create this here as further discussion of this ML topic:
http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=127599
Other bug reports that may be relevant (to which I'm loosely basing this post
on bug802).
http://d.puremagic.com/issues/show_bug.cgi?id=802
http://d.puremagic.com/issues/show_bug.cgi?id=3155
I'll simply document differences between GDC and DMD, however differences
between LDC and DMD/GDC is very much welcome as a further addition.
Current notable differences between GDC/DMD:
=== _aaGetX ===
DMD: void* _aaGetX(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey)
GDC: void* _aaGetp(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey)
DMD uses calling convention and architecture dependent code to get pkey in
_aaGet.
rt/aaA.d:215 return _aaGetX(aa, keyti, valuesize, cast(void*)(&valuesize + 1));
Though I presume the DMD compiler uses a similar technique to GDC and simply
calls _aaGetX directly.
=== _aaGetRvalueX ===
DMD: void* _aaGetRvalueX(AA aa, TypeInfo keyti, size_t valuesize, void* pkey)
GDC: void* _aaGetRvaluep(AA aa, TypeInfo keyti, size_t valuesize, void* pkey)
Ditto above.
=== _aaInX ===
DMD: void* _aaInX(AA aa, TypeInfo keyti, void* pkey)
GDC: void* _aaInp(AA aa, TypeInfo keyti, void* pkey)
Ditto above.
=== _aaDelX ===
DMD: void _aaDelX(AA aa, TypeInfo keyti, void* pkey)
GDC: void _aaDelp(AA aa, TypeInfo keyti, void* pkey)
Ditto above.
=== _d_assocarrayliteralTX ===
DMD: BB* _d_assocarrayliteralTX(TypeInfo_AssociativeArray ti, void[] keys,
void[] values)
GDC: BB* _d_assocarrayliteralTp(TypeInfo_AssociativeArray ti, size_t length,
void *keys, void *values)
GDC's implementation of _d_assocarrayliteralTp is just an extension of
_d_assocarrayliteralT, and is yet been updated.
=== Array ===
Array is defined in five locations:
rt/aaA.d:57:struct Array
rt/qsort.d:31:struct Array
rt/adi.d:40:struct Array
rt/lifetime.d:964:struct Array
rt/qsort2.d:22:struct Array
=== dg_t ===
dg_t is defined in four locations:
src/rt/aaA.d:581:extern (D) typedef int delegate(void *) dg_t;
src/rt/aApplyR.d:29:extern (D) typedef int delegate(void *) dg_t;
src/rt/aApply.d:24:extern (D) typedef int delegate(void *) dg_t;
src/object_.d:2451: extern (D) typedef scope int delegate(void *) _dg_t;
=== dg2_t ===
dg2_t is defined in four locations:
src/rt/aaA.d:608:extern (D) typedef int delegate(void *, void *) dg2_t;
src/rt/aApplyR.d:491:extern (D) typedef int delegate(void *, void *) dg2_t;
src/rt/aApply.d:199:extern (D) typedef int delegate(void *, void *) dg2_t;
src/object_.d:2454: extern (D) typedef scope int delegate(void *, void *)
_dg2_t;
=== _d_newarraymT ===
DMD: void[] _d_newarraymT(TypeInfo ti, size_t ndims, ...)
GDC: void[] _d_newarraymTp(TypeInfo ti, size_t ndims, size_t* pdim)
DMD's implementation calls a new function _d_newarrayOpT which is similar to
GDC's
rt/lifetime.d:851:void[] _d_newarrayOpT(alias op)(TypeInfo ti, size_t ndims,
va_list q)
It may be worth fixing GDC to match in this case.
=== _d_newarraymiT ===
DMD: void[] _d_newarraymiT(TypeInfo ti, size_t ndims, ...)
GDC: void[] _d_newarraymiTp(TypeInfo ti, size_t ndims, size_t* pdim)
Ditto above.
=== _d_arrayappendT ===
DMD: void[] _d_arrayappendT(TypeInfo ti, ref byte[] x, byte[] y)
GDC: void[] _d_arrayappendT(TypeInfo ti, Array *px, byte[] y)
This is a change that looks yet to be merged from trunk.
=== _d_arrayappendcTX ===
DMD: byte[] _d_arrayappendcTX(TypeInfo ti, ref byte[] px, size_t n)
GDC: void[] _d_arrayappendcTp(TypeInfo ti, ref byte[] x, byte* argp)
Ditto above.
=== _d_arrayliteralTX ===
DMD: void* _d_arrayliteralTX(TypeInfo ti, size_t length)
Not in GDC, though if added will likely be named _d_arrayliteralTp.
=== _d_array_bounds ===
DMD: void _d_array_bounds(ModuleInfo* m, uint line)
GDC: void _d_array_bounds(string file, uint line)
DMD's implementation is renamed to '_d_array_boundsm' in GDC, as passing
ModuleInfo is unimplemented/yet to be implemented.
=== _d_switch_error ===
DMD: void _d_switch_error(ModuleInfo* m, uint line)
GDC: void _d_switch_error(string file, uint line)
Ditto above.
=== _d_hidden_func ===
DMD: void _d_hidden_func()
GDC: void _d_hidden_func(Object o)
DMD's implementation uses architecture dependent asm.
=== size_t/ptrdiff_t/sizediff_t ===
>From src/rt/object_.d:
> // NOTE: For some reason, this declaration method doesn't work
> // in this particular file (and this file only). It must
> // be a DMD thing.
> //alias typeof(int.sizeof) size_t;
> //alias typeof(cast(void*)0 - cast(void*)0) ptrdiff_t;
Is there still need for this to be commented out? The alternative is a PITA.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list