OSDN Git Service

Fix another case where we were unconditionally linking linkonce GVs.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 24 Mar 2016 15:23:01 +0000 (15:23 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 24 Mar 2016 15:23:01 +0000 (15:23 +0000)
With this I think that now llvm-link,  lld and the gold plugin should
agree on which symbol is kept.

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

lib/Linker/LinkModules.cpp
test/Linker/Inputs/pr27044.ll
test/Linker/pr27044.ll

index f6e0f06..c07c47e 100644 (file)
@@ -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);
index 907643c..c949a93 100644 (file)
@@ -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
+}
index 58d2165..59e6c50 100644 (file)
@@ -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
+}