[LTO] Fix symbols which were internalized incorrectly.
authorDavide Italiano <davide@freebsd.org>
Sat, 2 Apr 2016 02:10:40 +0000 (02:10 +0000)
committerDavide Italiano <davide@freebsd.org>
Sat, 2 Apr 2016 02:10:40 +0000 (02:10 +0000)
If a symbol is defined in an archive, when we replace its body
the isUsedInRegularObj wasn't set correctly. Internalize makes
its decision based on that bit so we ended up internalizing
symbols that we shouldn't (because they're referenced).
This should fix. Thanks to Peter and Rafael for discussion
and help diagnosing the issue!

Found during LTO of unittests.

llvm-svn: 265208

lld/ELF/SymbolTable.cpp
lld/test/ELF/lto/Inputs/archive-2.ll [new file with mode: 0644]
lld/test/ELF/lto/archive-2.ll [new file with mode: 0644]

index 992a376..8bea378 100644 (file)
@@ -223,6 +223,7 @@ template <class ELFT> void SymbolTable<ELFT>::resolve(SymbolBody *New) {
     }
     // Found a definition for something also in an archive.
     // Ignore the archive definition.
+    New->setUsedInRegularObj();
     Sym->Body = New;
     return;
   }
diff --git a/lld/test/ELF/lto/Inputs/archive-2.ll b/lld/test/ELF/lto/Inputs/archive-2.ll
new file mode 100644 (file)
index 0000000..8236cfe
--- /dev/null
@@ -0,0 +1,6 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @_start() {
+  ret void
+}
diff --git a/lld/test/ELF/lto/archive-2.ll b/lld/test/ELF/lto/archive-2.ll
new file mode 100644 (file)
index 0000000..6712d60
--- /dev/null
@@ -0,0 +1,28 @@
+; REQUIRES: x86
+; RUN: llvm-as %S/Inputs/archive-2.ll -o %t1.o
+; RUN: rm -f %t.a
+; RUN: llvm-ar rcs %t.a %t1.o
+; RUN: llvm-as %s -o %t2.o
+; RUN: ld.lld -m elf_x86_64 %t2.o %t.a -o %t3
+; RUN: llvm-readobj -t %t3 | FileCheck %s
+; RUN: ld.lld -m elf_x86_64 %t2.o --whole-archive %t.a -o %t3 -shared
+; RUN: llvm-readobj -t %t3 | FileCheck %s
+
+; CHECK:      Name: _start (
+; CHECK-NEXT: Value:
+; CHECK-NEXT: Size:
+; CHECK-NEXT: Binding: Global
+; CHECK-NEXT: Type: Function
+; CHECK-NEXT: Other: 0
+; CHECK-NEXT: Section: .text
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @g() {
+  call void @_start()
+  ret void
+}
+
+declare void @_start()
+