summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorErich Keane <erich.keane@intel.com>2018-10-22 21:20:45 +0000
committerErich Keane <erich.keane@intel.com>2018-10-22 21:20:45 +0000
commit7ef210d0531eb74c45d5f16ddd3ca48e87b601db (patch)
tree47ae49f998d64370859f4205bb8273e01d29e25e /clang/lib/CodeGen/CodeGenModule.cpp
parent95abadec0bace0093993f6320c741e2b1e0ec14b (diff)
downloadbcm5719-llvm-7ef210d0531eb74c45d5f16ddd3ca48e87b601db.tar.gz
bcm5719-llvm-7ef210d0531eb74c45d5f16ddd3ca48e87b601db.zip
Give Multiversion-inline functions linkonce linkage
Since multiversion variant functions can be inline, in C they become available-externally linkage. This ends up causing the variants to not be emitted, and not available to the linker. The solution is to make sure that multiversion functions are always emitted by marking them linkonce. Change-Id: I897aa37c7cbba0c1eb2c57ee881d5000a2113b75 llvm-svn: 344957
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index c8aea635a7e..c8e672a5672 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -3669,6 +3669,10 @@ llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator(
return llvm::GlobalVariable::WeakAnyLinkage;
}
+ if (const auto *FD = D->getAsFunction())
+ if (FD->isMultiVersion() && Linkage == GVA_AvailableExternally)
+ return llvm::GlobalVariable::LinkOnceAnyLinkage;
+
// We are guaranteed to have a strong definition somewhere else,
// so we can use available_externally linkage.
if (Linkage == GVA_AvailableExternally)
OpenPOWER on IntegriCloud