summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/LTO/LTOModule.cpp8
-rw-r--r--test/LTO/linkonce_odr_func.ll8
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/LTO/LTOModule.cpp b/lib/LTO/LTOModule.cpp
index 669ccbbaab..68b7313be7 100644
--- a/lib/LTO/LTOModule.cpp
+++ b/lib/LTO/LTOModule.cpp
@@ -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;
diff --git a/test/LTO/linkonce_odr_func.ll b/test/LTO/linkonce_odr_func.ll
index 8a4932672f..a67ffc0dd4 100644
--- a/test/LTO/linkonce_odr_func.ll
+++ b/test/LTO/linkonce_odr_func.ll
@@ -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()