[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