summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
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
commitb4662c3e5a543540bdde3c1326a6db12eaeac591 (patch)
tree9b0acdf6c47541894f5c187cf766fadb559f0062 /clang/lib/CodeGen
parent078d2f89cd6adf8ed6e464c2432f9a55b2cb1534 (diff)
downloadbcm5719-llvm-b4662c3e5a543540bdde3c1326a6db12eaeac591.tar.gz
bcm5719-llvm-b4662c3e5a543540bdde3c1326a6db12eaeac591.zip
MS ABI: Emit static data members with proper linkage
llvm-svn: 209826
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 484373b20ec..f42e67de0e8 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/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.
OpenPOWER on IntegriCloud