diff options
author | Nico Rieck <nico.rieck@gmail.com> | 2014-05-29 16:50:46 +0000 |
---|---|---|
committer | Nico Rieck <nico.rieck@gmail.com> | 2014-05-29 16:50:46 +0000 |
commit | b4662c3e5a543540bdde3c1326a6db12eaeac591 (patch) | |
tree | 9b0acdf6c47541894f5c187cf766fadb559f0062 /clang/lib/CodeGen | |
parent | 078d2f89cd6adf8ed6e464c2432f9a55b2cb1534 (diff) | |
download | bcm5719-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.cpp | 9 |
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. |