r188642 - Revert "Revert "DebugInfo: Omit debug info for dynamic classes in TUs that do not have the vtable for that class""
Adrian Prantl
aprantl at apple.com
Mon Aug 19 11:50:22 PDT 2013
Hi David,
This patch adds several blocks of code without any explanatory comments, which makes it hard to understand what’s going on. Would you mind commenting a bit on what you are doing here?
I’m thinking particularly of
>
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Sun Aug 18 12:59:12 2013
> @@ -644,8 +644,24 @@ llvm::DIDescriptor CGDebugInfo::createCo
>
> if (const RecordDecl *RD = dyn_cast<RecordDecl>(Context)) {
> if (!RD->isDependentType()) {
> - llvm::DIType Ty = getOrCreateLimitedType(
> - CGM.getContext().getRecordType(RD)->castAs<RecordType>(), getOrCreateMainFile());
> + llvm::DICompositeType T(getTypeOrNull(CGM.getContext().getRecordType(RD)));
> + llvm::DICompositeType Ty(getOrCreateLimitedType(
> + CGM.getContext().getRecordType(RD)->castAs<RecordType>(),
> + getOrCreateMainFile()));
> + if (!Ty.getTypeArray().getNumElements()) {
> + if (T) {
> + llvm::DIArray PrevMem = T.getTypeArray();
> + unsigned NumElements = PrevMem.getNumElements();
> + if (NumElements == 1 && !PrevMem.getElement(0))
> + NumElements = 0;
> + SmallVector<llvm::Value *, 16> EltTys;
> + EltTys.reserve(NumElements);
> + for (unsigned i = 0; i != NumElements; ++i)
> + EltTys.push_back(PrevMem.getElement(i));
> + llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);
> + Ty.setTypeArray(Elements);
> + }
> + }
> return llvm::DIDescriptor(Ty);
> }
> }
> @@ -865,7 +881,7 @@ CollectRecordLambdaFields(const CXXRecor
> }
> }
and
> -/// getStaticDataMemberDeclaration - If D is an out-of-class definition of
> -/// a static data member of a class, find its corresponding in-class
> -/// declaration.
> -llvm::DIDerivedType CGDebugInfo::getStaticDataMemberDeclaration(const VarDecl *D) {
> - if (D->isStaticDataMember()) {
> - llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator
> - MI = StaticDataMemberCache.find(D->getCanonicalDecl());
> - if (MI != StaticDataMemberCache.end())
> - // Verify the info still exists.
> - if (llvm::Value *V = MI->second)
> - return llvm::DIDerivedType(cast<llvm::MDNode>(V));
> +/// If D is an out-of-class definition of a static data member of a class, find
> +/// its corresponding in-class declaration.
> +llvm::DIDerivedType
> +CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const VarDecl *D) {
> + if (!D->isStaticDataMember())
> + return llvm::DIDerivedType();
> + llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI =
> + StaticDataMemberCache.find(D->getCanonicalDecl());
> + if (MI != StaticDataMemberCache.end()) {
> + assert(MI->second && "Static data member declaration should still exist");
> + return llvm::DIDerivedType(cast<llvm::MDNode>(MI->second));
> + }
> + llvm::DICompositeType Ctxt(
> + getContextDescriptor(cast<Decl>(D->getDeclContext())));
> + llvm::DIDerivedType T = CreateRecordStaticField(D, Ctxt);
> + Ctxt.addMember(T);
> + return T;
> +}
> +
> +llvm::DIDerivedType
> +CGDebugInfo::getOrCreateStaticDataMemberDeclaration(const VarDecl *D,
> + llvm::DICompositeType Ctxt) {
> + llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI =
> + StaticDataMemberCache.find(D->getCanonicalDecl());
> + if (MI != StaticDataMemberCache.end()) {
> + assert(MI->second && "Static data member declaration should still exist");
> + return llvm::DIDerivedType(cast<llvm::MDNode>(MI->second));
> }
> - return llvm::DIDerivedType();
> + return CreateRecordStaticField(D, Ctxt);
> }
and
> @@ -3108,7 +3163,7 @@ void CGDebugInfo::EmitGlobalVariable(con
> return;
> llvm::DIGlobalVariable GV = DBuilder.createStaticVariable(
> Unit, Name, Name, Unit, getLineNumber(VD->getLocation()), Ty, true, Init,
> - getStaticDataMemberDeclaration(cast<VarDecl>(VD)));
> + getOrCreateStaticDataMemberDeclarationOrNull(cast<VarDecl>(VD)));
> DeclCache.insert(std::make_pair(VD->getCanonicalDecl(), llvm::WeakVH(GV)));
> }
thanks,
Adrian
More information about the cfe-commits
mailing list