Author: rnk Date: Mon Sep 12 19:01:23 2016 New Revision: 281278 URL: http://llvm.org/viewvc/llvm-project?rev=281278&view=rev Log: [DebugInfo] Deduplicate debug info limiting logic
We should be doing the same checks when a type is completed as we do when a complete type is used during emission. Previously, we duplicated the logic, and it got out of sync. This could be observed with dllimported classes. Also reduce a test case for this slightly. Implementing review feedback from David Blaikie on r281057. Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp cfe/trunk/test/CodeGenCXX/debug-info-dllimport-base-class.cpp Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=281278&r1=281277&r2=281278&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Sep 12 19:01:23 2016 @@ -1644,27 +1644,6 @@ void CGDebugInfo::completeType(const Rec completeRequiredType(RD); } -void CGDebugInfo::completeRequiredType(const RecordDecl *RD) { - if (DebugKind <= codegenoptions::DebugLineTablesOnly) - return; - - // If this is a dynamic class and we're emitting limited debug info, wait - // until the vtable is emitted to complete the class debug info. - if (DebugKind <= codegenoptions::LimitedDebugInfo) { - if (const auto *CXXDecl = dyn_cast<CXXRecordDecl>(RD)) - if (CXXDecl->isDynamicClass()) - return; - } - - if (DebugTypeExtRefs && RD->isFromASTFile()) - return; - - QualType Ty = CGM.getContext().getRecordType(RD); - llvm::DIType *T = getTypeOrNull(Ty); - if (T && T->isForwardDecl()) - completeClassData(RD); -} - void CGDebugInfo::completeClassData(const RecordDecl *RD) { if (DebugKind <= codegenoptions::DebugLineTablesOnly) return; @@ -1763,6 +1742,16 @@ static bool shouldOmitDefinition(codegen return false; } +void CGDebugInfo::completeRequiredType(const RecordDecl *RD) { + if (shouldOmitDefinition(DebugKind, DebugTypeExtRefs, RD, CGM.getLangOpts())) + return; + + QualType Ty = CGM.getContext().getRecordType(RD); + llvm::DIType *T = getTypeOrNull(Ty); + if (T && T->isForwardDecl()) + completeClassData(RD); +} + llvm::DIType *CGDebugInfo::CreateType(const RecordType *Ty) { RecordDecl *RD = Ty->getDecl(); llvm::DIType *T = cast_or_null<llvm::DIType>(getTypeOrNull(QualType(Ty, 0))); Modified: cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp?rev=281278&r1=281277&r2=281278&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp (original) +++ cfe/trunk/test/CodeGenCXX/debug-info-class-nolimit.cpp Mon Sep 12 19:01:23 2016 @@ -6,10 +6,7 @@ // more general than that. struct UnicodeString; -struct GetFwdDecl { - static UnicodeString format; -}; -GetFwdDecl force_fwd_decl; +UnicodeString *force_fwd_decl; struct UnicodeString { private: virtual ~UnicodeString(); Modified: cfe/trunk/test/CodeGenCXX/debug-info-dllimport-base-class.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-dllimport-base-class.cpp?rev=281278&r1=281277&r2=281278&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-dllimport-base-class.cpp (original) +++ cfe/trunk/test/CodeGenCXX/debug-info-dllimport-base-class.cpp Mon Sep 12 19:01:23 2016 @@ -4,6 +4,10 @@ // be imported from a DLL. Otherwise, the debugger wouldn't be able to show the // members. +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ImportedAfterCompletion", +// CHECK-NOT: DIFlagFwdDecl +// CHECK-SAME: ){{$}} + // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "OutOfLineCtor", // CHECK-SAME: DIFlagFwdDecl // CHECK-SAME: ){{$}} @@ -16,6 +20,13 @@ // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: ){{$}} + +struct ImportedAfterCompletion; +ImportedAfterCompletion *force_fwd_decl; +struct __declspec(dllimport) ImportedAfterCompletion { + virtual ~ImportedAfterCompletion(); +}; + struct OutOfLineCtor { OutOfLineCtor(); virtual void Foo(); @@ -35,6 +46,7 @@ struct ImportedMethod { }; int main() { + ImportedAfterCompletion c; OutOfLineCtor o; DerivedFromImported d; ImportedMethod m; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits