summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Linker/LinkModules.cpp6
-rw-r--r--llvm/test/Linker/Inputs/pr27044.ll12
-rw-r--r--llvm/test/Linker/pr27044.ll6
3 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp
index f6e0f060cc0..c07c47ef687 100644
--- a/llvm/lib/Linker/LinkModules.cpp
+++ b/llvm/lib/Linker/LinkModules.cpp
@@ -447,6 +447,12 @@ void ModuleLinker::addLazyFor(GlobalValue &GV, IRMover::ValueAdder Add) {
if (!SC)
return;
for (GlobalValue *GV2 : LazyComdatMembers[SC]) {
+ GlobalValue *DGV = getLinkedToGlobal(GV2);
+ bool LinkFromSrc = true;
+ if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2))
+ return;
+ if (!LinkFromSrc)
+ continue;
if (shouldInternalizeLinkedSymbols())
Internalize.insert(GV2->getName());
Add(*GV2);
diff --git a/llvm/test/Linker/Inputs/pr27044.ll b/llvm/test/Linker/Inputs/pr27044.ll
index 907643c115d..c949a93243e 100644
--- a/llvm/test/Linker/Inputs/pr27044.ll
+++ b/llvm/test/Linker/Inputs/pr27044.ll
@@ -1,7 +1,19 @@
$foo = comdat any
+$bar = comdat any
+
define linkonce_odr i32 @f1() comdat($foo) {
ret i32 1
}
+
define void @f2() comdat($foo) {
+ call i32 @g2()
ret void
}
+
+define linkonce_odr i32 @g1() comdat($bar) {
+ ret i32 1
+}
+
+define linkonce_odr i32 @g2() comdat($bar) {
+ ret i32 1
+}
diff --git a/llvm/test/Linker/pr27044.ll b/llvm/test/Linker/pr27044.ll
index 58d21656f58..59e6c50bbfa 100644
--- a/llvm/test/Linker/pr27044.ll
+++ b/llvm/test/Linker/pr27044.ll
@@ -1,8 +1,14 @@
; RUN: llvm-link -S %s %p/Inputs/pr27044.ll -o - | FileCheck %s
; CHECK: define i32 @f1() {
+; CHECK: define i32 @g1() {
; CHECK: define void @f2() comdat($foo) {
+; CHECK: define linkonce_odr i32 @g2() comdat($bar) {
define i32 @f1() {
ret i32 0
}
+
+define i32 @g1() {
+ ret i32 0
+}
OpenPOWER on IntegriCloud