mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-26 11:25:27 +00:00
Reapply "DebugInfo: Omit class definitions even in the presence of available_externally vtables"
Accounts for a case that caused an assertion failure by attempting to query for the vtable linkage of a non-dynamic type.t This reverts commit r292801. llvm-svn: 293462
This commit is contained in:
parent
a38cb204a3
commit
b11c87324e
@ -1714,7 +1714,27 @@ void CGDebugInfo::completeType(const RecordDecl *RD) {
|
||||
completeRequiredType(RD);
|
||||
}
|
||||
|
||||
/// Return true if the class or any of its methods are marked dllimport.
|
||||
static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) {
|
||||
if (RD->hasAttr<DLLImportAttr>())
|
||||
return true;
|
||||
for (const CXXMethodDecl *MD : RD->methods())
|
||||
if (MD->hasAttr<DLLImportAttr>())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void CGDebugInfo::completeClassData(const RecordDecl *RD) {
|
||||
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
|
||||
if (CXXRD->isDynamicClass() &&
|
||||
CGM.getVTableLinkage(CXXRD) ==
|
||||
llvm::GlobalValue::AvailableExternallyLinkage &&
|
||||
!isClassOrMethodDLLImport(CXXRD))
|
||||
return;
|
||||
completeClass(RD);
|
||||
}
|
||||
|
||||
void CGDebugInfo::completeClass(const RecordDecl *RD) {
|
||||
if (DebugKind <= codegenoptions::DebugLineTablesOnly)
|
||||
return;
|
||||
QualType Ty = CGM.getContext().getRecordType(RD);
|
||||
@ -1760,16 +1780,6 @@ static bool isDefinedInClangModule(const RecordDecl *RD) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Return true if the class or any of its methods are marked dllimport.
|
||||
static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) {
|
||||
if (RD->hasAttr<DLLImportAttr>())
|
||||
return true;
|
||||
for (const CXXMethodDecl *MD : RD->methods())
|
||||
if (MD->hasAttr<DLLImportAttr>())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind,
|
||||
bool DebugTypeExtRefs, const RecordDecl *RD,
|
||||
const LangOptions &LangOpts) {
|
||||
|
@ -409,6 +409,7 @@ public:
|
||||
void completeType(const RecordDecl *RD);
|
||||
void completeRequiredType(const RecordDecl *RD);
|
||||
void completeClassData(const RecordDecl *RD);
|
||||
void completeClass(const RecordDecl *RD);
|
||||
|
||||
void completeTemplateDefinition(const ClassTemplateSpecializationDecl &SD);
|
||||
|
||||
|
@ -744,9 +744,10 @@ CodeGenModule::getVTableLinkage(const CXXRecordDecl *RD) {
|
||||
switch (keyFunction->getTemplateSpecializationKind()) {
|
||||
case TSK_Undeclared:
|
||||
case TSK_ExplicitSpecialization:
|
||||
assert((def || CodeGenOpts.OptimizationLevel > 0) &&
|
||||
"Shouldn't query vtable linkage without key function or "
|
||||
"optimizations");
|
||||
assert((def || CodeGenOpts.OptimizationLevel > 0 ||
|
||||
CodeGenOpts.getDebugInfo() != codegenoptions::NoDebugInfo) &&
|
||||
"Shouldn't query vtable linkage without key function, "
|
||||
"optimizations, or debug info");
|
||||
if (!def && CodeGenOpts.OptimizationLevel > 0)
|
||||
return llvm::GlobalVariable::AvailableExternallyLinkage;
|
||||
|
||||
|
26
clang/test/CodeGenCXX/debug-info-class-optzns.cpp
Normal file
26
clang/test/CodeGenCXX/debug-info-class-optzns.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown_unknown -emit-llvm -debug-info-kind=limited %s -O1 -o - | FileCheck %s
|
||||
|
||||
// Ensure class definitions are not emitted to debug info just because the
|
||||
// vtable is emitted for optimization purposes (as available_externally). The
|
||||
// class definition debug info should only go where the vtable is actually
|
||||
// emitted into the object file.
|
||||
|
||||
// CHECK: @_ZTV3foo = available_externally
|
||||
|
||||
// Verify that this doesn't involve querying for the vtable of types that aren't
|
||||
// dynamic (that would cause an assertion in the case below)
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "bar<int>"
|
||||
template <typename> struct bar {};
|
||||
extern template struct bar<int>;
|
||||
bar<int> *p1;
|
||||
bar<int> a;
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo"
|
||||
// CHECK-SAME: DIFlagFwdDecl
|
||||
|
||||
struct foo {
|
||||
virtual void f();
|
||||
};
|
||||
|
||||
foo f;
|
Loading…
x
Reference in New Issue
Block a user