mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-04 00:55:49 +03:00
[svn r271] Fixed debug info for implicit 'this' param.
Fixed debug info for arguments passed byval (ref and out params still missing).
This commit is contained in:
parent
6565e9e09f
commit
53dedd765b
4 changed files with 61 additions and 1 deletions
|
@ -587,6 +587,17 @@ void DtoDefineFunc(FuncDeclaration* fd)
|
||||||
fd->vresult->ir.irLocal->value = new llvm::AllocaInst(DtoType(fd->vresult->type),"function_vresult",allocaPoint);
|
fd->vresult->ir.irLocal->value = new llvm::AllocaInst(DtoType(fd->vresult->type),"function_vresult",allocaPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// give 'this' argument debug info (and storage)
|
||||||
|
if (f->llvmUsesThis && global.params.symdebug)
|
||||||
|
{
|
||||||
|
LLValue** thisvar = &fd->ir.irFunc->thisVar;
|
||||||
|
assert(*thisvar);
|
||||||
|
LLValue* thismem = new llvm::AllocaInst((*thisvar)->getType(), "newthis", allocaPoint);
|
||||||
|
DtoDwarfLocalVariable(thismem, fd->vthis);
|
||||||
|
gIR->ir->CreateStore(*thisvar, thismem);
|
||||||
|
*thisvar = thismem;
|
||||||
|
}
|
||||||
|
|
||||||
// give arguments storage
|
// give arguments storage
|
||||||
if (fd->parameters)
|
if (fd->parameters)
|
||||||
{
|
{
|
||||||
|
@ -597,8 +608,16 @@ void DtoDefineFunc(FuncDeclaration* fd)
|
||||||
VarDeclaration* vd = argsym->isVarDeclaration();
|
VarDeclaration* vd = argsym->isVarDeclaration();
|
||||||
assert(vd);
|
assert(vd);
|
||||||
|
|
||||||
if (!vd->needsStorage || vd->nestedref || vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type))
|
// FIXME: llvm seems to want an alloca for debug info
|
||||||
|
if (!vd->needsStorage || vd->nestedref || vd->isRef() || vd->isOut())
|
||||||
continue;
|
continue;
|
||||||
|
// debug info for normal aggr params seem to work fine
|
||||||
|
else if (DtoIsPassedByRef(vd->type))
|
||||||
|
{
|
||||||
|
if (global.params.symdebug)
|
||||||
|
DtoDwarfLocalVariable(vd->ir.getIrValue(), vd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
LLValue* a = vd->ir.irLocal->value;
|
LLValue* a = vd->ir.irLocal->value;
|
||||||
assert(a);
|
assert(a);
|
||||||
|
|
|
@ -765,6 +765,7 @@ tangotests/c.d
|
||||||
tangotests/classes1.d
|
tangotests/classes1.d
|
||||||
tangotests/constructors.d
|
tangotests/constructors.d
|
||||||
tangotests/debug1.d
|
tangotests/debug1.d
|
||||||
|
tangotests/debug10.d
|
||||||
tangotests/debug2.d
|
tangotests/debug2.d
|
||||||
tangotests/debug3.d
|
tangotests/debug3.d
|
||||||
tangotests/debug4.d
|
tangotests/debug4.d
|
||||||
|
@ -772,6 +773,7 @@ tangotests/debug5.d
|
||||||
tangotests/debug6.d
|
tangotests/debug6.d
|
||||||
tangotests/debug7.d
|
tangotests/debug7.d
|
||||||
tangotests/debug8.d
|
tangotests/debug8.d
|
||||||
|
tangotests/debug9.d
|
||||||
tangotests/e.d
|
tangotests/e.d
|
||||||
tangotests/f.d
|
tangotests/f.d
|
||||||
tangotests/files1.d
|
tangotests/files1.d
|
||||||
|
|
21
tangotests/debug10.d
Normal file
21
tangotests/debug10.d
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
module tangotests.debug10;
|
||||||
|
|
||||||
|
struct Vec2
|
||||||
|
{
|
||||||
|
float x,y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Vec2 v2;
|
||||||
|
char[] str = "hello";
|
||||||
|
int i = void;
|
||||||
|
float f = 3.14;
|
||||||
|
func(v2, v2, str, i, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void func(Vec2 v2, ref Vec2 rv2, char[] str, out int i, ref float f)
|
||||||
|
{
|
||||||
|
int* fail;
|
||||||
|
*fail = 0;
|
||||||
|
}
|
18
tangotests/debug9.d
Normal file
18
tangotests/debug9.d
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
module tangotests.debug9;
|
||||||
|
|
||||||
|
struct Foo
|
||||||
|
{
|
||||||
|
int a,b,c;
|
||||||
|
|
||||||
|
void func()
|
||||||
|
{
|
||||||
|
int* fail;
|
||||||
|
*fail = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Foo foo = Foo(1,10,73);
|
||||||
|
foo.func();
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue