summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorErich Keane <erich.keane@intel.com>2017-12-21 02:07:46 +0000
committerErich Keane <erich.keane@intel.com>2017-12-21 02:07:46 +0000
commit40e9a74cba88c271af3407dad30006386881097b (patch)
treedc143cd6394ab10b04075edaf09072c8b18f12e3 /lib/CodeGen/CodeGenModule.cpp
parent54595410ae2b78639c6c2eacc735f8ad9a96e551 (diff)
Fix for PR32990
This fixes the bug in https://bugs.llvm.org/show_bug.cgi?id=32990. Patch By: zahiraam Differential Revision: https://reviews.llvm.org/D39063 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@321239 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--lib/CodeGen/CodeGenModule.cpp42
1 files changed, 33 insertions, 9 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 7b2599d664..f893339436 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -855,14 +855,25 @@ CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
if (isa<CXXDestructorDecl>(D) &&
- getCXXABI().useThunkForDtorVariant(cast<CXXDestructorDecl>(D),
- GD.getDtorType())) {
- // Destructor variants in the Microsoft C++ ABI are always internal or
- // linkonce_odr thunks emitted on an as-needed basis.
- return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
- : llvm::GlobalValue::LinkOnceODRLinkage;
+ Context.getTargetInfo().getCXXABI().isMicrosoft()) {
+ switch (GD.getDtorType()) {
+ case CXXDtorType::Dtor_Base:
+ break;
+ case CXXDtorType::Dtor_Comdat:
+ case CXXDtorType::Dtor_Complete:
+ if (D->hasAttr<DLLImportAttr>() &&
+ (cast<CXXDestructorDecl>(D)->getParent()->getNumVBases() ||
+ (Linkage == GVA_AvailableExternally ||
+ Linkage == GVA_StrongExternal)))
+ return llvm::Function::AvailableExternallyLinkage;
+ else
+ return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
+ : llvm::GlobalValue::LinkOnceODRLinkage;
+ case CXXDtorType::Dtor_Deleting:
+ return Linkage == GVA_Internal ? llvm::GlobalValue::InternalLinkage
+ : llvm::GlobalValue::LinkOnceODRLinkage;
+ }
}
-
if (isa<CXXConstructorDecl>(D) &&
cast<CXXConstructorDecl>(D)->isInheritingConstructor() &&
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
@@ -878,12 +889,25 @@ CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
void CodeGenModule::setFunctionDLLStorageClass(GlobalDecl GD, llvm::Function *F) {
const auto *FD = cast<FunctionDecl>(GD.getDecl());
- if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
- if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
+ if (dyn_cast_or_null<CXXDestructorDecl>(FD)) {
+ switch (GD.getDtorType()) {
+ case CXXDtorType::Dtor_Comdat:
+ case CXXDtorType::Dtor_Deleting: {
// Don't dllexport/import destructor thunks.
F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
return;
}
+ case CXXDtorType::Dtor_Complete:
+ if (FD->hasAttr<DLLImportAttr>())
+ F->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
+ else if (FD->hasAttr<DLLExportAttr>())
+ F->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
+ else
+ F->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
+ return;
+ case CXXDtorType::Dtor_Base:
+ break;
+ }
}
if (FD->hasAttr<DLLImportAttr>())