Don't internalize linkonce_odr non constant variables.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 7 Feb 2014 19:04:43 +0000 (19:04 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 7 Feb 2014 19:04:43 +0000 (19:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200983 91177308-0d34-0410-b5e6-96231b3b80d8

lib/LTO/LTOModule.cpp
test/LTO/linkonce_odr_func.ll

index 669ccbbaab40bf8d6acf188e12606e718777b54c..68b7313be7283cc709f75cc19a5d741da81b9ae8 100644 (file)
@@ -349,6 +349,7 @@ void LTOModule::addDefinedFunctionSymbol(const Function *f) {
 }
 
 static bool canBeHidden(const GlobalValue *GV) {
+  // FIXME: this is duplicated with another static function in AsmPrinter.cpp
   GlobalValue::LinkageTypes L = GV->getLinkage();
 
   if (L != GlobalValue::LinkOnceODRLinkage)
@@ -357,6 +358,13 @@ static bool canBeHidden(const GlobalValue *GV) {
   if (GV->hasUnnamedAddr())
     return true;
 
+  // If it is a non constant variable, it needs to be uniqued across shared
+  // objects.
+  if (const GlobalVariable *Var = dyn_cast<GlobalVariable>(GV)) {
+    if (!Var->isConstant())
+      return false;
+  }
+
   GlobalStatus GS;
   if (GlobalStatus::analyzeGlobal(GV, GS))
     return false;
index 8a4932672f6d5868ee50e3e730949a9b43ed0d4a..a67ffc0dd48ee9d8188f97450d5d03146943aa4e 100644 (file)
@@ -1,6 +1,6 @@
 ; RUN: llvm-as < %s >%t1
 ; RUN: llvm-lto -o %t2 -dso-symbol=foo1 -dso-symbol=foo2 -dso-symbol=foo3 \
-; RUN:     -dso-symbol=foo4  %t1 -disable-opt
+; RUN:     -dso-symbol=foo4 -dso-symbol=v1 -dso-symbol=v2 %t1 -disable-opt
 ; RUN: llvm-nm %t2 | FileCheck %s
 
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
@@ -26,6 +26,12 @@ define linkonce_odr void @foo4() noinline {
   ret void
 }
 
+; CHECK: r v1
+@v1 = linkonce_odr constant i32 32
+
+; CHECK: V v2
+@v2 = linkonce_odr global i32 32
+
 declare void @f(void()*)
 
 declare void @p()