]> granicus.if.org Git - clang/commitdiff
Simplify linkage code for static local vars.
authorEli Friedman <eli.friedman@gmail.com>
Mon, 1 Jul 2013 20:53:07 +0000 (20:53 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 1 Jul 2013 20:53:07 +0000 (20:53 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185381 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDecl.cpp
lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h
test/CodeGenCXX/linkage.cpp

index 62cd7442ec3c7418ee0354f13b489b1cd896917c..49364e6b563c07d2cf67364c6809678b537af79a 100644 (file)
@@ -124,60 +124,14 @@ void CodeGenFunction::EmitVarDecl(const VarDecl &D) {
     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);
index cfb9e78368714be2f2d981bea98dc3f7b33e1615..250442caae63bb9ec0faea66e981498902b81f59 100644 (file)
@@ -515,11 +515,7 @@ void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
 
 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)
index a5fca36a937bcfb90cff98901786a0a00cf167bb..b4e234f4a7996892d498d8726525107ec9fb869c 100644 (file)
@@ -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));
index c7feaefeb85d90f16acab7f7b869c96b168759f6..4aba1b32822df3a0844433ce85528017c0912b4f 100644 (file)
@@ -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() {