[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:
Tomas Lindquist Olsen 2008-06-12 18:04:28 +02:00
parent 6565e9e09f
commit 53dedd765b
4 changed files with 61 additions and 1 deletions

View file

@ -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);

View file

@ -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
View 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
View 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();
}