summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-04-25 17:08:41 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-04-25 17:08:41 +0000
commit01bbd1b1c379acfd740be2d2a5845db508b2825d (patch)
tree51584b6e5a83079454e42f97a066794b31717f7e /clang/lib/CodeGen/CodeGenModule.cpp
parentde519a2d828d12239affcb378910b504570bd616 (diff)
downloadbcm5719-llvm-01bbd1b1c379acfd740be2d2a5845db508b2825d.tar.gz
bcm5719-llvm-01bbd1b1c379acfd740be2d2a5845db508b2825d.zip
CodeGen: Cleanup variable linkage calculation
Almost all linkage calculation for VarDecls occured inside of GetLLVMLinkageVarDefinition except for static data members. Centralize the logic so that it can be more readily reused. No functionality change. llvm-svn: 207241
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index bac9b22befc..34673bf29ad 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1565,6 +1565,18 @@ bool CodeGenModule::isTypeConstant(QualType Ty, bool ExcludeCtor) {
return true;
}
+static bool isVarDeclInlineInitializedStaticDataMember(const VarDecl *VD) {
+ if (!VD->isStaticDataMember())
+ return false;
+ const VarDecl *InitDecl;
+ const Expr *InitExpr = VD->getAnyInitializer(InitDecl);
+ if (!InitExpr)
+ return false;
+ if (InitDecl->isThisDeclarationADefinition())
+ return false;
+ return true;
+}
+
/// GetOrCreateLLVMGlobal - If the specified mangled name is not in the module,
/// create and return an llvm GlobalVariable with the specified type. If there
/// is something in the module with the specified name, return it potentially
@@ -1633,8 +1645,7 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
// If required by the ABI, treat declarations of static data members with
// inline initializers as definitions.
if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() &&
- D->isStaticDataMember() && D->hasInit() &&
- !D->isThisDeclarationADefinition())
+ isVarDeclInlineInitializedStaticDataMember(D))
EmitGlobalVarDefinition(D);
}
@@ -1900,13 +1911,6 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
else if (D->hasAttr<DLLExportAttr>())
GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
- // If required by the ABI, give definitions of static data members with inline
- // initializers linkonce_odr linkage.
- if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() &&
- D->isStaticDataMember() && InitExpr &&
- !InitDecl->isThisDeclarationADefinition())
- GV->setLinkage(llvm::GlobalVariable::LinkOnceODRLinkage);
-
if (Linkage == llvm::GlobalVariable::CommonLinkage)
// common vars aren't constant even if declared const.
GV->setConstant(false);
@@ -1992,6 +1996,11 @@ CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, bool isConstant) {
// Itanium-specified entry point, which has the normal linkage of the
// variable.
return llvm::GlobalValue::InternalLinkage;
+ else if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() &&
+ isVarDeclInlineInitializedStaticDataMember(D))
+ // If required by the ABI, give definitions of static data members with inline
+ // initializers linkonce_odr linkage.
+ return llvm::GlobalVariable::LinkOnceODRLinkage;
// C++ doesn't have tentative definitions and thus cannot have common linkage.
else if (!getLangOpts().CPlusPlus &&
!isVarDeclStrongDefinition(D, CodeGenOpts.NoCommon))
OpenPOWER on IntegriCloud