[PATCH] D25545: ELF: Simplify handling of *_start/*_end symbols.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 12 19:33:17 PDT 2016


pcc created this revision.
pcc added a reviewer: ruiu.
pcc added a subscriber: llvm-commits.

We were previously using the (static) addSynthetic function to create
*_start/*_end symbols. This function was doing almost the same thing as
addOptionalSynthetic, except that it would also create the symbol in the
case where it is unreferenced. Because the symbol has hidden visibility,
creating it in that case would have no effect other than adding another
entry to the static symbol table. Remove addSynthetic and change callers to
use addOptionalSynthetic instead.


https://reviews.llvm.org/D25545

Files:
  lld/ELF/Writer.cpp
  lld/test/ELF/gc-sections.s


Index: lld/test/ELF/gc-sections.s
===================================================================
--- lld/test/ELF/gc-sections.s
+++ lld/test/ELF/gc-sections.s
@@ -21,8 +21,6 @@
 # NOGC: Name: c
 # NOGC: Name: x
 # NOGC: Name: y
-# NOGC: Name: __preinit_array_start
-# NOGC: Name: __preinit_array_end
 # NOGC: Name: d
 
 # GC1:     Name: .eh_frame
@@ -38,8 +36,6 @@
 # GC1:     Name: c
 # GC1-NOT: Name: x
 # GC1-NOT: Name: y
-# GC1:     Name: __preinit_array_start
-# GC1:     Name: __preinit_array_end
 # GC1-NOT: Name: d
 
 # GC2:     Name: .eh_frame
@@ -55,8 +51,6 @@
 # GC2:     Name: c
 # GC2-NOT: Name: x
 # GC2-NOT: Name: y
-# GC2:     Name: __preinit_array_start
-# GC2:     Name: __preinit_array_end
 # GC2:     Name: d
 
 .globl _start, d
Index: lld/ELF/Writer.cpp
===================================================================
--- lld/ELF/Writer.cpp
+++ lld/ELF/Writer.cpp
@@ -557,14 +557,6 @@
   return Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, StOther);
 }
 
-template <class ELFT>
-static void addSynthetic(StringRef Name, OutputSectionBase<ELFT> *Sec,
-                         typename ELFT::uint Val) {
-  SymbolBody *S = Symtab<ELFT>::X->find(Name);
-  if (!S || S->isUndefined() || S->isShared())
-    Symtab<ELFT>::X->addSynthetic(Name, Sec, Val, STV_HIDDEN);
-}
-
 // The beginning and the ending of .rel[a].plt section are marked
 // with __rel[a]_iplt_{start,end} symbols if it is a statically linked
 // executable. The runtime needs these symbols in order to resolve
@@ -948,13 +940,9 @@
 template <class ELFT> void Writer<ELFT>::addStartEndSymbols() {
   auto Define = [&](StringRef Start, StringRef End,
                     OutputSectionBase<ELFT> *OS) {
-    if (OS) {
-      addSynthetic(Start, OS, 0);
-      addSynthetic(End, OS, DefinedSynthetic<ELFT>::SectionEnd);
-    } else {
-      addOptionalSynthetic(Start, (OutputSectionBase<ELFT> *)nullptr, 0);
-      addOptionalSynthetic(End, (OutputSectionBase<ELFT> *)nullptr, 0);
-    }
+    // These symbols resolve to the image base if the section does not exist.
+    addOptionalSynthetic(Start, OS, 0);
+    addOptionalSynthetic(End, OS, OS ? DefinedSynthetic<ELFT>::SectionEnd : 0);
   };
 
   Define("__preinit_array_start", "__preinit_array_end",


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25545.74470.patch
Type: text/x-patch
Size: 2249 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161013/a3e42761/attachment.bin>


More information about the llvm-commits mailing list