changeset 1388:5a54b39af6d6

Add debug info for all class fields, including those from super classes...
author Tomas Lindquist Olsen <tomas.l.olsen gmail com>
date Sun, 17 May 2009 17:55:53 +0200
parents 5855958073a9
children 0bafe24a329f
files gen/todebug.cpp
diffstat 1 files changed, 36 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/gen/todebug.cpp	Sun May 17 17:10:26 2009 +0200
+++ b/gen/todebug.cpp	Sun May 17 17:55:53 2009 +0200
@@ -215,6 +215,28 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
+static void add_base_fields(
+    ClassDeclaration* sd,
+    llvm::DICompileUnit compileUnit,
+    llvm::DICompileUnit definedCU,
+    std::vector<LLConstant*>& elems)
+{
+    if (sd->baseClass)
+    {
+        add_base_fields(sd->baseClass, compileUnit, definedCU, elems);
+    }
+
+    ArrayIter<VarDeclaration> it(sd->fields);
+    size_t narr = sd->fields.dim;
+    elems.reserve(narr);
+    for (; !it.done(); it.next())
+    {
+        VarDeclaration* vd = it.get();
+        LLGlobalVariable* ptr = dwarfMemberType(vd->loc.linnum, vd->type, compileUnit, definedCU, vd->toChars(), vd->offset).getGV();
+        elems.push_back(DBG_CAST(ptr));
+    }
+}
+
 //FIXME: This does not use llvm's DIFactory as it can't 
 //   handle recursive types properly.
 static llvm::DICompositeType dwarfCompositeType(Type* type, llvm::DICompileUnit compileUnit)
@@ -301,14 +323,21 @@
         std::vector<LLConstant*> elems;
         if (!ir->aggrdecl->isInterfaceDeclaration()) // plain interfaces don't have one
         {
-            ArrayIter<VarDeclaration> it(sd->fields);
-            size_t narr = sd->fields.dim;
-            elems.reserve(narr);
-            for (; !it.done(); it.next())
+            if (t->ty == Tstruct)
             {
-                VarDeclaration* vd = it.get();
-                LLGlobalVariable* ptr = dwarfMemberType(vd->loc.linnum, vd->type, compileUnit, definedCU, vd->toChars(), vd->offset).getGV();
-                elems.push_back(DBG_CAST(ptr));
+                ArrayIter<VarDeclaration> it(sd->fields);
+                size_t narr = sd->fields.dim;
+                elems.reserve(narr);
+                for (; !it.done(); it.next())
+                {
+                    VarDeclaration* vd = it.get();
+                    LLGlobalVariable* ptr = dwarfMemberType(vd->loc.linnum, vd->type, compileUnit, definedCU, vd->toChars(), vd->offset).getGV();
+                    elems.push_back(DBG_CAST(ptr));
+                }
+            }
+            else
+            {
+                add_base_fields(ir->aggrdecl->isClassDeclaration(), compileUnit, definedCU, elems);
             }
         }