[lld] r311534 - [ELF] - Fix for "Bug 34238 - LTO is optimizing away symbols referenced from linker scripts"

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 23 01:37:22 PDT 2017


Author: grimar
Date: Wed Aug 23 01:37:22 2017
New Revision: 311534

URL: http://llvm.org/viewvc/llvm-project?rev=311534&view=rev
Log:
[ELF] - Fix for "Bug 34238 - LTO is optimizing away symbols referenced from linker scripts"

Code suggested by Rui Ueyama in PR34238 comments.

Previously LTO optimized away symbols referenced from linker script
because did not see that them are used from regular objects.

Patch adds such symbols as undefined earlier, before running LTO,
what sets IsUsedInRegularObj for them and fixes the issue.

Differential revision: https://reviews.llvm.org/D37009

Added:
    lld/trunk/test/ELF/lto/linker-script-symbols.ll
Modified:
    lld/trunk/ELF/Driver.cpp

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=311534&r1=311533&r2=311534&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Wed Aug 23 01:37:22 2017
@@ -1012,6 +1012,11 @@ template <class ELFT> void LinkerDriver:
   for (InputFile *F : Files)
     Symtab->addFile<ELFT>(F);
 
+  // Some symbols (such as __ehdr_start) are defined lazily only when there
+  // are undefined symbols for them, so we add these to trigger that logic.
+  for (StringRef Sym : Script->Opt.ReferencedSymbols)
+    Symtab->addUndefined<ELFT>(Sym);
+
   // If an entry symbol is in a static archive, pull out that file now
   // to complete the symbol table. After this, no new names except a
   // few linker-synthesized ones will be added to the symbol table.
@@ -1047,11 +1052,6 @@ template <class ELFT> void LinkerDriver:
   if (ErrorCount)
     return;
 
-  // Some symbols (such as __ehdr_start) are defined lazily only when there
-  // are undefined symbols for them, so we add these to trigger that logic.
-  for (StringRef Sym : Script->Opt.ReferencedSymbols)
-    Symtab->addUndefined<ELFT>(Sym);
-
   // Apply symbol renames for -wrap and -defsym
   Symtab->applySymbolRenames();
 

Added: lld/trunk/test/ELF/lto/linker-script-symbols.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/linker-script-symbols.ll?rev=311534&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/linker-script-symbols.ll (added)
+++ lld/trunk/test/ELF/lto/linker-script-symbols.ll Wed Aug 23 01:37:22 2017
@@ -0,0 +1,29 @@
+; REQUIRES: x86
+; RUN: llvm-as %s -o %t.o
+; RUN: echo "foo = bar;" > %t.script
+
+; RUN: ld.lld -m elf_x86_64 %t.o -o %t2 --script %t.script -save-temps
+; RUN: llvm-readobj -symbols %t2.lto.o | FileCheck %s
+
+; CHECK-NOT:  zed
+; CHECK:      Symbol {
+; CHECK:        Name: bar
+; CHECK-NEXT:   Value:
+; CHECK-NEXT:   Size:
+; CHECK-NEXT:   Binding: Global
+; CHECK-NEXT:   Type: Function
+; CHECK-NEXT:   Other:
+; CHECK-NEXT:   Section:
+; CHECK-NEXT: }
+; CHECK-NOT:  zed
+
+target triple = "x86_64-unknown-linux-gnu"
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @bar() {
+  ret void
+}
+
+define void @zed() {
+  ret void
+}




More information about the llvm-commits mailing list