472 changes: 295 additions & 177 deletions src/rt/tracegc.d
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@

module rt.tracegc;

import core.stdc.stdio;
//version = tracegc;

import rt.profilegc;

version (tracegc) import core.stdc.stdio;

version (none)
{
Expand Down Expand Up @@ -89,83 +93,117 @@ extern (C) void* _d_newitemiT(in TypeInfo _ti);

extern (C) Object _d_newclassTrace(string file, int line, string funcname, const ClassInfo ci)
{
printf("_d_newclassTrace class = %s file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ci.name,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_newclassTrace class = %s file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ci.name,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ci.name, ci.init.length);
return _d_newclass(ci);
}

extern (C) void[] _d_newarrayTTrace(string file, int line, string funcname, const TypeInfo ti, size_t length)
{
printf("_d_newarrayTTrace type = %s length = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_newarrayTTrace type = %s length = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.tsize * length);
return _d_newarrayT(ti, length);
}

extern (C) void[] _d_newarrayiTTrace(string file, int line, string funcname, const TypeInfo ti, size_t length)
{
printf("_d_newarrayiTTrace type = %s length = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_newarrayiTTrace type = %s length = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.tsize * length);
return _d_newarrayiT(ti, length);
}

extern (C) void[] _d_newarraymTXTrace(string file, int line, string funcname, const TypeInfo ti, size_t[] dims)
{
printf("_d_newarraymTXTrace type = %s dims = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)dims.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_newarraymTXTrace type = %s dims = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)dims.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
size_t n = 1;
foreach (dim; dims)
n *= dim;
accumulate(file, line, funcname, ti.toString(), ti.tsize * n);
return _d_newarraymTX(ti, dims);
}

extern (C) void[] _d_newarraymiTXTrace(string file, int line, string funcname, const TypeInfo ti, size_t[] dims)
{
printf("_d_newarraymiTXTrace type = %s dims = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)dims.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_newarraymiTXTrace type = %s dims = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)dims.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
size_t n = 1;
foreach (dim; dims)
n *= dim;
accumulate(file, line, funcname, ti.toString(), ti.tsize * n);
return _d_newarraymiTX(ti, dims);
}

extern (C) void* _d_newitemTTrace(string file, int line, string funcname, in TypeInfo _ti)
extern (C) void* _d_newitemTTrace(string file, int line, string funcname, in TypeInfo ti)
{
printf("_d_newitemTTrace type = %s file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)_ti.toString().ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
return _d_newitemT(_ti);
version (tracegc)
{
printf("_d_newitemTTrace type = %s file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.tsize);
return _d_newitemT(ti);
}

extern (C) void* _d_newitemiTTrace(string file, int line, string funcname, in TypeInfo _ti)
extern (C) void* _d_newitemiTTrace(string file, int line, string funcname, in TypeInfo ti)
{
printf("_d_newitemiTTrace type = %s file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)_ti.toString().ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
return _d_newitemiT(_ti);
version (tracegc)
{
printf("_d_newitemiTTrace type = %s file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.tsize);
return _d_newitemiT(ti);
}


Expand All @@ -179,80 +217,101 @@ extern (C) void _d_delmemory(void* *p);

extern (C) void _d_callfinalizerTrace(string file, int line, string funcname, void* p)
{
printf("_d_callfinalizerTrace %p file = '%.*s' line = %d function = '%.*s'\n",
p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_callfinalizerTrace %p file = '%.*s' line = %d function = '%.*s'\n",
p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_callfinalizer(p);
}

extern (C) void _d_callinterfacefinalizerTrace(string file, int line, string funcname, void *p)
{
printf("_d_callinterfacefinalizerTrace %p file = '%.*s' line = %d function = '%.*s'\n",
p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_callinterfacefinalizerTrace %p file = '%.*s' line = %d function = '%.*s'\n",
p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_callinterfacefinalizer(p);
}

extern (C) void _d_delclassTrace(string file, int line, string funcname, Object* p)
{
printf("_d_delclassTrace %p file = '%.*s' line = %d function = '%.*s'\n",
*p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_delclassTrace %p file = '%.*s' line = %d function = '%.*s'\n",
*p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_delclass(p);
}

extern (C) void _d_delinterfaceTrace(string file, int line, string funcname, void** p)
{
printf("_d_delinterfaceTrace %p file = '%.*s' line = %d function = '%.*s'\n",
*p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_delinterfaceTrace %p file = '%.*s' line = %d function = '%.*s'\n",
*p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_delinterface(p);
}

extern (C) void _d_delstructTrace(string file, int line, string funcname, void** p, TypeInfo_Struct inf)
{
printf("_d_delstructTrace %p type = %s file = '%.*s' line = %d function = '%.*s'\n",
*p,
cast(char *)inf.toString().ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_delstructTrace %p type = %s file = '%.*s' line = %d function = '%.*s'\n",
*p,
cast(char *)inf.toString().ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_delstruct(p, inf);
}

extern (C) void _d_delarray_tTrace(string file, int line, string funcname, void[]* p, const TypeInfo_Struct ti)
{
printf("_d_delarray_tTrace %p[%llu] type = %s file = '%.*s' line = %d function = '%.*s'\n",
(*p).ptr, cast(ulong)(*p).length,
ti ? cast(char *)ti.toString().ptr : cast(char*)"".ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_delarray_tTrace %p[%llu] type = %s file = '%.*s' line = %d function = '%.*s'\n",
(*p).ptr, cast(ulong)(*p).length,
ti ? cast(char *)ti.toString().ptr : cast(char*)"".ptr,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_delarray_t(p, ti);
}

extern (C) void _d_delmemoryTrace(string file, int line, string funcname, void* *p)
{
printf("_d_delmemoryTrace %p file = '%.*s' line = %d function = '%.*s'\n",
*p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_delmemoryTrace %p file = '%.*s' line = %d function = '%.*s'\n",
*p,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
_d_delmemory(p);
}

Expand All @@ -262,27 +321,35 @@ extern (C) void* _d_assocarrayliteralTX(const TypeInfo_AssociativeArray ti, void

extern (C) void* _d_arrayliteralTXTrace(string file, int line, string funcname, const TypeInfo ti, size_t length)
{
printf("_d_arrayliteralTXTrace type = %s length = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arrayliteralTXTrace type = %s length = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.next.tsize * length);
return _d_arrayliteralTX(ti, length);
}

extern (C) void* _d_assocarrayliteralTXTrace(string file, int line, string funcname,
const TypeInfo_AssociativeArray ti, void[] keys, void[] vals)
{
printf("_d_assocarrayliteralTXTrace type = %s keys = %llu values = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)keys.length,
cast(ulong)vals.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_assocarrayliteralTXTrace type = %s keys = %llu values = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)keys.length,
cast(ulong)vals.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), (ti.key.tsize + ti.value.tsize) * keys.length);
return _d_assocarrayliteralTX(ti, keys, vals);
}

Expand All @@ -293,26 +360,37 @@ extern (C) void[] _d_arraycatnTX(const TypeInfo ti, byte[][] arrs);

extern (C) byte[] _d_arraycatTTrace(string file, int line, string funcname, const TypeInfo ti, byte[] x, byte[] y)
{
printf("_d_arraycatT type = %s x = %llu y = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)x.length,
cast(ulong)y.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arraycatT type = %s x = %llu y = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)x.length,
cast(ulong)y.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), (x.length + y.length) * ti.next.tsize);
return _d_arraycatT(ti, x, y);
}

extern (C) void[] _d_arraycatnTXTrace(string file, int line, string funcname, const TypeInfo ti, byte[][] arrs)
{
printf("_d_arraycatnTX type = %s arrs = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)arrs.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arraycatnTX type = %s arrs = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)arrs.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
size_t length;
foreach (b; arrs)
length += b.length;
accumulate(file, line, funcname, ti.toString(), length * ti.next.tsize);
return _d_arraycatnTX(ti, arrs);
}

Expand All @@ -323,51 +401,79 @@ extern (C) void[] _d_arrayappendwd(ref byte[] x, dchar c);

extern (C) void[] _d_arrayappendTTrace(string file, int line, string funcname, const TypeInfo ti, ref byte[] x, byte[] y)
{
printf("_d_arrayappendT type = %s x = %llu y = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)x.length,
cast(ulong)y.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arrayappendT type = %s x = %llu y = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)x.length,
cast(ulong)y.length,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.next.tsize * y.length);
return _d_arrayappendT(ti, x, y);
}

extern (C) byte[] _d_arrayappendcTXTrace(string file, int line, string funcname, const TypeInfo ti, ref byte[] px, size_t n)
{
printf("_d_arrayappendcTX type = %s x = %llu n = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)px.length,
cast(ulong)n,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arrayappendcTX type = %s x = %llu n = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)px.length,
cast(ulong)n,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.next.tsize * n);
return _d_arrayappendcTX(ti, px, n);
}

extern (C) void[] _d_arrayappendcdTrace(string file, int line, string funcname, ref byte[] x, dchar c)
{
printf("_d_arrayappendcd x = %llu c = x%x file = '%.*s' line = %d function = '%.*s'\n",
cast(ulong)x.length,
c,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arrayappendcd x = %llu c = x%x file = '%.*s' line = %d function = '%.*s'\n",
cast(ulong)x.length,
c,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
size_t n;
if (c <= 0x7F)
n = 1;
else if (c <= 0x7FF)
n = 2;
else if (c <= 0xFFFF)
n = 3;
else if (c <= 0x10FFFF)
n = 4;
else
assert(0);
accumulate(file, line, funcname, "char[]", n * char.sizeof);
return _d_arrayappendcd(x, c);
}

extern (C) void[] _d_arrayappendwdTrace(string file, int line, string funcname, ref byte[] x, dchar c)
{
printf("_d_arrayappendwd x = %llu c = x%x file = '%.*s' line = %d function = '%.*s'\n",
cast(ulong)x.length,
c,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arrayappendwd x = %llu c = x%x file = '%.*s' line = %d function = '%.*s'\n",
cast(ulong)x.length,
c,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
size_t n = 1 + (c > 0xFFFF);
accumulate(file, line, funcname, "wchar[]", n * wchar.sizeof);
return _d_arrayappendwd(x, c);
}

Expand All @@ -376,27 +482,35 @@ extern (C) void[] _d_arraysetlengthiT(const TypeInfo ti, size_t newlength, void[

extern (C) void[] _d_arraysetlengthTTrace(string file, int line, string funcname, const TypeInfo ti, size_t newlength, void[]* p)
{
printf("_d_arraysetlengthT type = %s length = %llu newlength = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)(*p).length,
cast(ulong)newlength,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arraysetlengthT type = %s length = %llu newlength = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)(*p).length,
cast(ulong)newlength,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.next.tsize * newlength);
return _d_arraysetlengthT(ti, newlength, p);
}

extern (C) void[] _d_arraysetlengthiTTrace(string file, int line, string funcname, const TypeInfo ti, size_t newlength, void[]* p)
{
printf("_d_arraysetlengthiT type = %s length = %llu newlength = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)(*p).length,
cast(ulong)newlength,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_arraysetlengthiT type = %s length = %llu newlength = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(char *)ti.toString().ptr,
cast(ulong)(*p).length,
cast(ulong)newlength,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, ti.toString(), ti.next.tsize * newlength);
return _d_arraysetlengthiT(ti, newlength, p);
}

Expand All @@ -405,12 +519,16 @@ extern (C) void* _d_allocmemory(size_t sz);

extern (C) void* _d_allocmemoryTrace(string file, int line, string funcname, size_t sz)
{
printf("_d_allocmemory sz = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(ulong)sz,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
version (tracegc)
{
printf("_d_allocmemory sz = %llu file = '%.*s' line = %d function = '%.*s'\n",
cast(ulong)sz,
file.length, file.ptr,
line,
funcname.length, funcname.ptr
);
}
accumulate(file, line, funcname, "closure", sz);
return _d_allocmemory(sz);
}

Expand Down