mirror of https://github.com/microsoft/clang.git
[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:
parent
6603cadc46
commit
8488298403
|
@ -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)));
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue