summaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorNico Rieck <nico.rieck@gmail.com>2014-05-29 16:50:46 +0000
committerNico Rieck <nico.rieck@gmail.com>2014-05-29 16:50:46 +0000
commitd7ba66580dd291e8133207503cea46b245391423 (patch)
tree96352a8d6d5e1bc6f210035f4391365275006a75 /lib/CodeGen/CodeGenModule.cpp
parent6a916a67b03e1e7d9ec740ffbe9a5080778c7ee9 (diff)
downloadclang-d7ba66580dd291e8133207503cea46b245391423.tar.gz
clang-d7ba66580dd291e8133207503cea46b245391423.tar.bz2
clang-d7ba66580dd291e8133207503cea46b245391423.tar.xz
MS ABI: Emit static data members with proper linkage
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209826 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--lib/CodeGen/CodeGenModule.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 484373b20e..f42e67de0e 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -1964,10 +1964,15 @@ llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator(
// If required by the ABI, give definitions of static data members with inline
// initializers at least linkonce_odr linkage.
+ auto const VD = dyn_cast<VarDecl>(D);
if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() &&
- isa<VarDecl>(D) &&
- isVarDeclInlineInitializedStaticDataMember(cast<VarDecl>(D)))
+ VD && isVarDeclInlineInitializedStaticDataMember(VD)) {
+ if (VD->hasAttr<DLLImportAttr>())
+ return llvm::GlobalValue::AvailableExternallyLinkage;
+ if (VD->hasAttr<DLLExportAttr>())
+ return llvm::GlobalValue::WeakODRLinkage;
return llvm::GlobalValue::LinkOnceODRLinkage;
+ }
// C++ doesn't have tentative definitions and thus cannot have common
// linkage.