r185381 - Simplify linkage code for static local vars.
Eli Friedman
eli.friedman at gmail.com
Mon Jul 1 13:53:07 PDT 2013
Author: efriedma
Date: Mon Jul 1 15:53:07 2013
New Revision: 185381
URL: http://llvm.org/viewvc/llvm-project?rev=185381&view=rev
Log:
Simplify linkage code for static local vars.
The key insight here is that weak linkage for a static local variable
should always mean linkonce_odr, because every file that needs it will
generate a definition. We don't actually care about the precise linkage
of the parent context. I feel a bit silly that I didn't realize this before.
Modified:
cfe/trunk/lib/CodeGen/CGDecl.cpp
cfe/trunk/lib/CodeGen/CodeGenModule.cpp
cfe/trunk/lib/CodeGen/CodeGenModule.h
cfe/trunk/test/CodeGenCXX/linkage.cpp
Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=185381&r1=185380&r2=185381&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDecl.cpp Mon Jul 1 15:53:07 2013
@@ -124,60 +124,14 @@ void CodeGenFunction::EmitVarDecl(const
llvm::GlobalValue::LinkageTypes Linkage =
llvm::GlobalValue::InternalLinkage;
- // If the function definition has some sort of weak linkage, its
- // static variables should also be weak so that they get properly
- // uniqued.
+ // If the variable is externally visible, it must have weak linkage so it
+ // can be uniqued.
if (D.isExternallyVisible()) {
- const Decl *D = CurCodeDecl;
- while (true) {
- if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
- if (!BD->getBlockManglingNumber())
- break;
-
- // This block has the linkage/visibility of its contained variables
- // determined by its owner.
- const DeclContext *DC = D->getDeclContext()->getRedeclContext();
- if (Decl *ContextDecl = BD->getBlockManglingContextDecl()) {
- if (isa<ParmVarDecl>(ContextDecl)) {
- DC = ContextDecl->getDeclContext()->getRedeclContext();
- } else {
- D = ContextDecl;
- continue;
- }
- }
-
- if (const NamedDecl *ND = dyn_cast<NamedDecl>(DC)) {
- D = ND;
- continue;
- }
-
- break;
- } else if (isa<CapturedDecl>(D)) {
- D = cast<Decl>(cast<CapturedDecl>(D)->getParent());
- } else {
- break;
- }
- }
- llvm::GlobalValue::LinkageTypes ParentLinkage;
- if (isa<FunctionDecl>(D)) {
- ParentLinkage = CGM.getFunctionLinkage(cast<FunctionDecl>(D));
- } else if (isa<VarDecl>(D)) {
- // FIXME: I'm pretty sure this is wrong...
- ParentLinkage = CGM.GetLLVMLinkageVarDefinition(cast<VarDecl>(D),
- /*constant*/false);
- } else {
- assert(isa<FieldDecl>(D) && "Expect function, variable, or field");
- // FIXME: Is this right?
- ParentLinkage = llvm::GlobalValue::LinkOnceODRLinkage;
- }
-
- if (llvm::GlobalValue::isWeakForLinker(ParentLinkage))
- Linkage = ParentLinkage;
+ Linkage = llvm::GlobalValue::LinkOnceODRLinkage;
// FIXME: We need to force the emission/use of a guard variable for
// some variables even if we can constant-evaluate them because
// we can't guarantee every translation unit will constant-evaluate them.
- // Also, we might need to fix up the linkage.
}
return EmitStaticVarDecl(D, Linkage);
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=185381&r1=185380&r2=185381&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Jul 1 15:53:07 2013
@@ -515,11 +515,7 @@ void CodeGenModule::EmitCtorList(const C
llvm::GlobalValue::LinkageTypes
CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
- return getFunctionLinkage(cast<FunctionDecl>(GD.getDecl()));
-}
-
-llvm::GlobalValue::LinkageTypes
-CodeGenModule::getFunctionLinkage(const FunctionDecl *D) {
+ const FunctionDecl *D = cast<FunctionDecl>(GD.getDecl());
GVALinkage Linkage = getContext().GetGVALinkageForFunction(D);
if (Linkage == GVA_Internal)
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=185381&r1=185380&r2=185381&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Mon Jul 1 15:53:07 2013
@@ -925,7 +925,6 @@ public:
void AddDependentLib(StringRef Lib);
llvm::GlobalVariable::LinkageTypes getFunctionLinkage(GlobalDecl GD);
- llvm::GlobalVariable::LinkageTypes getFunctionLinkage(const FunctionDecl *D);
void setFunctionLinkage(GlobalDecl GD, llvm::GlobalValue *V) {
V->setLinkage(getFunctionLinkage(GD));
Modified: cfe/trunk/test/CodeGenCXX/linkage.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/linkage.cpp?rev=185381&r1=185380&r2=185381&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/linkage.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/linkage.cpp Mon Jul 1 15:53:07 2013
@@ -211,7 +211,7 @@ namespace test16 {
}
namespace test17 {
- // CHECK-DAG: @_ZZN6test173fooILi42EEEPivE3bar = weak_odr
+ // CHECK-DAG: @_ZZN6test173fooILi42EEEPivE3bar = linkonce_odr
// CHECK-DAG: define weak_odr i32* @_ZN6test173fooILi42EEEPiv(
template<int I>
int *foo() {
More information about the cfe-commits
mailing list