Also copy private linkage globals when needed.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 2 Dec 2015 20:57:33 +0000 (20:57 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 2 Dec 2015 20:57:33 +0000 (20:57 +0000)
This was an omission when handling COFF style comdats with local keys.
Should fix the sanitizer-windows bot.

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

lib/Linker/LinkModules.cpp
test/Linker/Inputs/comdat15.ll [new file with mode: 0644]
test/Linker/comdat15.ll [new file with mode: 0644]

index 3e54e279573e249b457d7b148d829172b9a60f50..e90ce166962ee0efaedb9725065e497d67adcd7e 100644 (file)
@@ -1426,7 +1426,7 @@ bool ModuleLinker::linkGlobalValueProto(GlobalValue *SGV) {
     std::tie(SK, LinkFromSrc) = ComdatsChosen[SC];
     C = DstM.getOrInsertComdat(SC->getName());
     C->setSelectionKind(SK);
-    if (SGV->hasInternalLinkage())
+    if (SGV->hasLocalLinkage())
       LinkFromSrc = true;
   } else if (DGV) {
     if (shouldLinkFromSource(LinkFromSrc, *DGV, *SGV))
diff --git a/test/Linker/Inputs/comdat15.ll b/test/Linker/Inputs/comdat15.ll
new file mode 100644 (file)
index 0000000..5d2d41b
--- /dev/null
@@ -0,0 +1,6 @@
+$a1 = comdat any
+@baz = private global i32 42, comdat($a1)
+@a1 = internal alias i32, i32* @baz
+define i32* @abc() {
+  ret i32* @a1
+}
diff --git a/test/Linker/comdat15.ll b/test/Linker/comdat15.ll
new file mode 100644 (file)
index 0000000..cf90026
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: llvm-link -S %s %p/Inputs/comdat15.ll -o - | FileCheck %s
+
+$a1 = comdat any
+@bar = global i32 0, comdat($a1)
+
+; CHECK: @bar = global i32 0, comdat($a1)
+; CHECK: @baz = private global i32 42, comdat($a1)
+; CHECK: @a1 = internal alias i32, i32* @baz
+