forked from OSchip/llvm-project
[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:
parent
242bbdb7bf
commit
4fda708624
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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()
|
||||
|
Loading…
Reference in New Issue