From 6c7b1c62126cea0146777b878a4516aa23073ae2 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Tue, 13 Sep 2016 00:01:23 +0000 Subject: [PATCH] [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. llvm-svn: 281278 --- clang/lib/CodeGen/CGDebugInfo.cpp | 31 +++++++--------------- clang/test/CodeGenCXX/debug-info-class-nolimit.cpp | 5 +--- .../CodeGenCXX/debug-info-dllimport-base-class.cpp | 12 +++++++++ 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index c2878c3..c0af91f 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1644,27 +1644,6 @@ void CGDebugInfo::completeType(const RecordDecl *RD) { 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(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(codegenoptions::DebugInfoKind DebugKind, 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(getTypeOrNull(QualType(Ty, 0))); diff --git a/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp b/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp index 4b05fd6..0b3b38d 100644 --- a/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp +++ b/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp @@ -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(); diff --git a/clang/test/CodeGenCXX/debug-info-dllimport-base-class.cpp b/clang/test/CodeGenCXX/debug-info-dllimport-base-class.cpp index dc15dd0..855ecaa 100644 --- a/clang/test/CodeGenCXX/debug-info-dllimport-base-class.cpp +++ b/clang/test/CodeGenCXX/debug-info-dllimport-base-class.cpp @@ -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; -- 2.7.4