From e24f740ec883203d7bac7edd21631ef1dc6d2b8e Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Mon, 23 Jan 2017 16:57:14 +0000 Subject: [PATCH] Revert "DebugInfo: Omit class definitions even in the presence of available_externally vtables" Patch crashing on a bootstrapping sanitizer bot: http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/679 Reverting while I investigate. This reverts commit r292768. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@292801 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 29 +++++++-------------- lib/CodeGen/CGDebugInfo.h | 1 - lib/CodeGen/CGVTables.cpp | 7 +++-- test/CodeGenCXX/debug-info-class-optzns.cpp | 16 ------------ 4 files changed, 13 insertions(+), 40 deletions(-) delete mode 100644 test/CodeGenCXX/debug-info-class-optzns.cpp diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 702ae01acf..c3dd53f12e 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -1714,26 +1714,7 @@ 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()) - return true; - for (const CXXMethodDecl *MD : RD->methods()) - if (MD->hasAttr()) - return true; - return false; -} - void CGDebugInfo::completeClassData(const RecordDecl *RD) { - if (auto *CXXRD = dyn_cast(RD)) - if (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); @@ -1779,6 +1760,16 @@ 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()) + return true; + for (const CXXMethodDecl *MD : RD->methods()) + if (MD->hasAttr()) + return true; + return false; +} + static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind, bool DebugTypeExtRefs, const RecordDecl *RD, const LangOptions &LangOpts) { diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index ea451d0548..ac2e8dd2e0 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -409,7 +409,6 @@ 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); diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index 24c7f15a08..04c5cfe536 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -744,10 +744,9 @@ CodeGenModule::getVTableLinkage(const CXXRecordDecl *RD) { switch (keyFunction->getTemplateSpecializationKind()) { case TSK_Undeclared: case TSK_ExplicitSpecialization: - assert((def || CodeGenOpts.OptimizationLevel > 0 || - CodeGenOpts.getDebugInfo() != codegenoptions::NoDebugInfo) && - "Shouldn't query vtable linkage without key function, " - "optimizations, or debug info"); + assert((def || CodeGenOpts.OptimizationLevel > 0) && + "Shouldn't query vtable linkage without key function or " + "optimizations"); if (!def && CodeGenOpts.OptimizationLevel > 0) return llvm::GlobalVariable::AvailableExternallyLinkage; diff --git a/test/CodeGenCXX/debug-info-class-optzns.cpp b/test/CodeGenCXX/debug-info-class-optzns.cpp deleted file mode 100644 index 08f045659b..0000000000 --- a/test/CodeGenCXX/debug-info-class-optzns.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// 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 -// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "foo" -// CHECK-SAME: DIFlagFwdDecl - -struct foo { - virtual void f(); -}; - -foo f; -- 2.40.0