changeset 254:8187884566fa trunk

[svn r271] Fixed debug info for implicit 'this' param. Fixed debug info for arguments passed byval (ref and out params still missing).
author lindquist
date Thu, 12 Jun 2008 18:04:28 +0200
parents c6f25edd6ef3
children 4d14a1c84be7
files gen/functions.cpp llvmdc.kdevelop.filelist tangotests/debug10.d tangotests/debug9.d
diffstat 4 files changed, 61 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/gen/functions.cpp	Thu Jun 12 17:01:31 2008 +0200
+++ b/gen/functions.cpp	Thu Jun 12 18:04:28 2008 +0200
@@ -587,6 +587,17 @@
         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
     if (fd->parameters)
     {
@@ -597,8 +608,16 @@
             VarDeclaration* vd = argsym->isVarDeclaration();
             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;
+            // 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;
             assert(a);
--- a/llvmdc.kdevelop.filelist	Thu Jun 12 17:01:31 2008 +0200
+++ b/llvmdc.kdevelop.filelist	Thu Jun 12 18:04:28 2008 +0200
@@ -765,6 +765,7 @@
 tangotests/classes1.d
 tangotests/constructors.d
 tangotests/debug1.d
+tangotests/debug10.d
 tangotests/debug2.d
 tangotests/debug3.d
 tangotests/debug4.d
@@ -772,6 +773,7 @@
 tangotests/debug6.d
 tangotests/debug7.d
 tangotests/debug8.d
+tangotests/debug9.d
 tangotests/e.d
 tangotests/f.d
 tangotests/files1.d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tangotests/debug10.d	Thu Jun 12 18:04:28 2008 +0200
@@ -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;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tangotests/debug9.d	Thu Jun 12 18:04:28 2008 +0200
@@ -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();
+}