Mercurial > projects > ldc
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); } }