[LTO] Fix symbols which were internalized incorrectly.

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
This commit is contained in:
Davide Italiano 2016-04-02 02:10:40 +00:00
parent 242bbdb7bf
commit 4fda708624
3 changed files with 35 additions and 0 deletions

View 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;
}

View File

@ -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
}

View File

@ -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()