Skip to content

Instantly share code, notes, and snippets.

@yebblies
Created December 25, 2013 13:24
Show Gist options
  • Save yebblies/8123194 to your computer and use it in GitHub Desktop.
Save yebblies/8123194 to your computer and use it in GitHub Desktop.
module target;
import defs, mars, mtype;
struct Target
{
extern(C++) static __gshared int ptrsize;
extern(C++) static __gshared int realsize;
extern(C++) static __gshared int realpad;
extern(C++) static __gshared int realalignsize;
extern(C++) static void _init()
{
mixin(dmd_trace_code);
ptrsize = 4;
if (global.params.isLinux || global.params.isFreeBSD || global.params.isOpenBSD || global.params.isSolaris)
{
realsize = 12;
realpad = 2;
realalignsize = 4;
}
else if (global.params.isOSX)
{
realsize = 16;
realpad = 6;
realalignsize = 16;
}
else if (global.params.isWindows)
{
realsize = 10;
realpad = 0;
realalignsize = 2;
}
else
assert(0);
if (global.params.is64bit)
{
if (global.params.isLinux || global.params.isFreeBSD || global.params.isSolaris)
{
realsize = 16;
realpad = 6;
realalignsize = 16;
}
}
if (global.params.isLP64)
ptrsize = 8;
}
extern(C++) static uint alignsize(Type type)
{
mixin(dmd_trace_code);
assert(type.isTypeBasic());
switch (type.ty)
{
case Tfloat80:
case Timaginary80:
case Tcomplex80:
return Target.realalignsize;
case Tcomplex32:
if (global.params.isLinux || global.params.isOSX || global.params.isFreeBSD || global.params.isOpenBSD || global.params.isSolaris)
return 4;
break;
case Tint64:
case Tuns64:
case Tfloat64:
case Timaginary64:
case Tcomplex64:
if (global.params.isLinux || global.params.isOSX || global.params.isFreeBSD || global.params.isOpenBSD || global.params.isSolaris)
return global.params.is64bit ? 8 : 4;
break;
default:
break;
}
return cast(uint)type.size(Loc());
}
extern(C++) static uint fieldalign(Type type)
{
mixin(dmd_trace_code);
return type.alignsize();
}
extern(C++) static uint critsecsize()
{
mixin(dmd_trace_code);
if (global.params.isWindows)
{
return global.params.isLP64 ? 40 : 24;
}
else if (global.params.isLinux)
{
if (global.params.is64bit)
return global.params.isLP64 ? 40 : 32;
else
return global.params.isLP64 ? 40 : 24;
}
else if (global.params.isFreeBSD)
{
return global.params.isLP64 ? 8 : 4;
}
else if (global.params.isOpenBSD)
{
return global.params.isLP64 ? 8 : 4;
}
else if (global.params.isOSX)
{
return global.params.isLP64 ? 64 : 44;
}
else if (global.params.isSolaris)
{
return 24;
}
assert(0);
return 0;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment