[lld] r264688 - [LTO] Include in .symtab/.dynsym symbols introduced by optimizations.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 28 17:15:52 PDT 2016


Author: davide
Date: Mon Mar 28 19:15:52 2016
New Revision: 264688

URL: http://llvm.org/viewvc/llvm-project?rev=264688&view=rev
Log:
[LTO] Include in .symtab/.dynsym symbols introduced by optimizations.

Some optimizations, e.g. SimplifyLibCalls, can replace functions with
others as part of the lowering, e.g. printf => puts.
The new symbols don't have the isUsedInRegularObj flag set so they
don't get included in the final symbol table (and dynamic symbol
table), and the dynamic linker gets confused. Include  them as a fix.

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

Added:
    lld/trunk/test/ELF/lto/Inputs/shared.s
    lld/trunk/test/ELF/lto/undefined-puts.ll
Modified:
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/ELF/Symbols.h

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=264688&r1=264687&r2=264688&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Mon Mar 28 19:15:52 2016
@@ -108,6 +108,7 @@ template <class ELFT> void SymbolTable<E
   Obj->parse(DummyGroups);
   for (SymbolBody *Body : Obj->getNonLocalSymbols()) {
     Symbol *Sym = insert(Body);
+    Sym->Body->setUsedInRegularObj();
     if (!Sym->Body->isUndefined() && Body->isUndefined())
       continue;
     Sym->Body = Body;

Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=264688&r1=264687&r2=264688&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Mon Mar 28 19:15:52 2016
@@ -89,6 +89,8 @@ public:
   bool isInGot() const { return GotIndex != -1U; }
   bool isInPlt() const { return PltIndex != -1U; }
 
+  void setUsedInRegularObj() { IsUsedInRegularObj = true; }
+
   template <class ELFT>
   typename ELFT::uint getVA(typename ELFT::uint Addend = 0) const;
 
@@ -319,7 +321,6 @@ public:
   std::unique_ptr<InputFile> getMember();
 
   void setWeak() { IsWeak = true; }
-  void setUsedInRegularObj() { IsUsedInRegularObj = true; }
 
 private:
   ArchiveFile *File;

Added: lld/trunk/test/ELF/lto/Inputs/shared.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/Inputs/shared.s?rev=264688&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/Inputs/shared.s (added)
+++ lld/trunk/test/ELF/lto/Inputs/shared.s Mon Mar 28 19:15:52 2016
@@ -0,0 +1,5 @@
+.globl  printf
+printf:
+
+.globl  puts
+puts:

Added: lld/trunk/test/ELF/lto/undefined-puts.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/undefined-puts.ll?rev=264688&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/undefined-puts.ll (added)
+++ lld/trunk/test/ELF/lto/undefined-puts.ll Mon Mar 28 19:15:52 2016
@@ -0,0 +1,28 @@
+; REQUIRES: x86
+; RUN: llvm-mc %p/Inputs/shared.s -o %t1.o -filetype=obj -triple=x86_64-unknown-linux
+; RUN: ld.lld %t1.o -o %t1.so -shared
+; RUN: llvm-as %s -o %t2.o
+; RUN: ld.lld %t1.so %t2.o -m elf_x86_64 -o %t
+; RUN: llvm-readobj -dyn-symbols -dyn-relocations %t | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+ at .str = private unnamed_addr constant [6 x i8] c"blah\0A\00", align 1
+
+define i32 @_start() {
+  %str = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0))
+  ret i32 0
+}
+
+declare i32 @printf(i8*, ...)
+
+; Check that puts symbol is present in the dynamic symbol table and
+; there's a relocation for it.
+; CHECK: Dynamic Relocations {
+; CHECK-NEXT:  0x11007 R_X86_64_PC32 puts 0xFFFFFFFFFFFFFFFC
+; CHECK-NEXT: }
+
+; CHECK: DynamicSymbols [
+; CHECK: Symbol {
+; CHECK:    Name: puts@




More information about the llvm-commits mailing list