From 4fda708624e1453c89e0520008de4780fc4fb885 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Sat, 2 Apr 2016 02:10:40 +0000 Subject: [PATCH] [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 --- lld/ELF/SymbolTable.cpp | 1 + lld/test/ELF/lto/Inputs/archive-2.ll | 6 ++++++ lld/test/ELF/lto/archive-2.ll | 28 ++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 lld/test/ELF/lto/Inputs/archive-2.ll create mode 100644 lld/test/ELF/lto/archive-2.ll diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 992a376..8bea378 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -223,6 +223,7 @@ template void SymbolTable::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 index 0000000..8236cfe --- /dev/null +++ b/lld/test/ELF/lto/Inputs/archive-2.ll @@ -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 index 0000000..6712d60 --- /dev/null +++ b/lld/test/ELF/lto/archive-2.ll @@ -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() + -- 2.7.4