[lld] r265208 - [LTO] Fix symbols which were internalized incorrectly.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 1 19:10:40 PDT 2016


Author: davide
Date: Fri Apr  1 21:10:40 2016
New Revision: 265208

URL: http://llvm.org/viewvc/llvm-project?rev=265208&view=rev
Log:
[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.

Added:
    lld/trunk/test/ELF/lto/Inputs/archive-2.ll
    lld/trunk/test/ELF/lto/archive-2.ll
Modified:
    lld/trunk/ELF/SymbolTable.cpp

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=265208&r1=265207&r2=265208&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Fri Apr  1 21:10:40 2016
@@ -223,6 +223,7 @@ template <class ELFT> void SymbolTable<E
     }
     // Found a definition for something also in an archive.
     // Ignore the archive definition.
+    New->setUsedInRegularObj();
     Sym->Body = New;
     return;
   }

Added: lld/trunk/test/ELF/lto/Inputs/archive-2.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/Inputs/archive-2.ll?rev=265208&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/Inputs/archive-2.ll (added)
+++ lld/trunk/test/ELF/lto/Inputs/archive-2.ll Fri Apr  1 21:10:40 2016
@@ -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
+}

Added: lld/trunk/test/ELF/lto/archive-2.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/archive-2.ll?rev=265208&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/archive-2.ll (added)
+++ lld/trunk/test/ELF/lto/archive-2.ll Fri Apr  1 21:10:40 2016
@@ -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()
+




More information about the llvm-commits mailing list