[lld] r265371 - ELF: Preserve MustBeInDynSym for bitcode symbols.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 4 17:47:56 PDT 2016


Author: pcc
Date: Mon Apr  4 19:47:55 2016
New Revision: 265371

URL: http://llvm.org/viewvc/llvm-project?rev=265371&view=rev
Log:
ELF: Preserve MustBeInDynSym for bitcode symbols.

Make sure to copy the MustBeInDynSym field when replacing shared symbols with
bitcode symbols, and when replacing bitcode symbols with regular symbols
in addCombinedLtoObject. Fixes interposition of DSO symbols with bitcode
symbols in the main executable.

Differential Revision: http://reviews.llvm.org/D18780

Added:
    lld/trunk/test/ELF/lto/Inputs/dynsym.s
    lld/trunk/test/ELF/lto/dynsym.ll
Modified:
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/ELF/Symbols.cpp

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=265371&r1=265370&r2=265371&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Mon Apr  4 19:47:55 2016
@@ -112,6 +112,8 @@ template <class ELFT> void SymbolTable<E
     Sym->Body->setUsedInRegularObj();
     if (!Sym->Body->isUndefined() && Body->isUndefined())
       continue;
+    if (Sym->Body->MustBeInDynSym)
+      Body->MustBeInDynSym = true;
     Sym->Body = Body;
   }
   ObjectFiles.emplace_back(Obj);

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=265371&r1=265370&r2=265371&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Mon Apr  4 19:47:55 2016
@@ -205,8 +205,10 @@ template <class ELFT> int SymbolBody::co
   // and in DSOs, so that the symbols in the executable can interrupt
   // symbols in the DSO at runtime.
   if (isShared() != Other->isShared())
-    if (isa<DefinedRegular<ELFT>>(isShared() ? Other : this))
+    if (isa<Defined>(isShared() ? Other : this)) {
+      IsUsedInRegularObj = Other->IsUsedInRegularObj = true;
       MustBeInDynSym = Other->MustBeInDynSym = true;
+    }
 
   if (L != R)
     return -1;

Added: lld/trunk/test/ELF/lto/Inputs/dynsym.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/Inputs/dynsym.s?rev=265371&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/Inputs/dynsym.s (added)
+++ lld/trunk/test/ELF/lto/Inputs/dynsym.s Mon Apr  4 19:47:55 2016
@@ -0,0 +1,3 @@
+.globl foo
+foo:
+ret

Added: lld/trunk/test/ELF/lto/dynsym.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/dynsym.ll?rev=265371&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/dynsym.ll (added)
+++ lld/trunk/test/ELF/lto/dynsym.ll Mon Apr  4 19:47:55 2016
@@ -0,0 +1,25 @@
+; REQUIRES: x86
+; RUN: llvm-mc -filetype=obj -o %t.o %p/Inputs/dynsym.s
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t.so -shared
+; RUN: llvm-as %s -o %t2.o
+; RUN: ld.lld -m elf_x86_64 %t2.o %t.so -o %t
+; RUN: llvm-readobj -dyn-symbols %t | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @_start() {
+  call void @foo()
+  ret void
+}
+
+; CHECK:      Name: foo
+; CHECK-NEXT: Value:
+; CHECK-NEXT: Size:
+; CHECK-NEXT: Binding:
+; CHECK-NEXT: Type:
+; CHECK-NEXT: Other:
+; CHECK-NEXT: Section: .text
+define void @foo() {
+  ret void
+}




More information about the llvm-commits mailing list