[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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281278 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Kleckner 2016-09-13 00:01:23 +00:00
parent 6603cadc46
commit 8488298403
3 changed files with 23 additions and 25 deletions

View File

@ -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<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(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<llvm::DIType>(getTypeOrNull(QualType(Ty, 0)));

View File

@ -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();

View File

@ -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;