[lld] r320200 - Make createSyntheticSections a static helper. NFC.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 8 13:50:29 PST 2017


Author: rafael
Date: Fri Dec  8 13:50:29 2017
New Revision: 320200

URL: http://llvm.org/viewvc/llvm-project?rev=320200&view=rev
Log:
Make createSyntheticSections a static helper. NFC.

Modified:
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=320200&r1=320199&r2=320200&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Dec  8 13:50:29 2017
@@ -46,7 +46,6 @@ public:
   void run();
 
 private:
-  void createSyntheticSections();
   void copyLocalSymbols();
   void addSectionSymbols();
   void forEachRelSec(std::function<void(InputSectionBase &)> Fn);
@@ -233,99 +232,6 @@ template <class ELFT> static void addRes
   ElfSym::Edata2 = Add("_edata", -1);
 }
 
-// The main function of the writer.
-template <class ELFT> void Writer<ELFT>::run() {
-  // Create linker-synthesized sections such as .got or .plt.
-  // Such sections are of type input section.
-  createSyntheticSections();
-
-  if (!Config->Relocatable)
-    combineEhFrameSections<ELFT>();
-
-  // We need to create some reserved symbols such as _end. Create them.
-  if (!Config->Relocatable)
-    addReservedSymbols<ELFT>();
-
-  // We want to process linker script commands. When SECTIONS command
-  // is given we let it create sections.
-  Script->processSectionCommands();
-
-  // Linker scripts controls how input sections are assigned to output sections.
-  // Input sections that were not handled by scripts are called "orphans", and
-  // they are assigned to output sections by the default rule. Process that.
-  Script->addOrphanSections();
-
-  if (Config->Discard != DiscardPolicy::All)
-    copyLocalSymbols();
-
-  if (Config->CopyRelocs)
-    addSectionSymbols();
-
-  // Now that we have a complete set of output sections. This function
-  // completes section contents. For example, we need to add strings
-  // to the string table, and add entries to .got and .plt.
-  // finalizeSections does that.
-  finalizeSections();
-  if (errorCount())
-    return;
-
-  // If -compressed-debug-sections is specified, we need to compress
-  // .debug_* sections. Do it right now because it changes the size of
-  // output sections.
-  parallelForEach(OutputSections,
-                  [](OutputSection *Sec) { Sec->maybeCompress<ELFT>(); });
-
-  Script->assignAddresses();
-  Script->allocateHeaders(Phdrs);
-
-  // Remove empty PT_LOAD to avoid causing the dynamic linker to try to mmap a
-  // 0 sized region. This has to be done late since only after assignAddresses
-  // we know the size of the sections.
-  removeEmptyPTLoad();
-
-  if (!Config->OFormatBinary)
-    assignFileOffsets();
-  else
-    assignFileOffsetsBinary();
-
-  setPhdrs();
-
-  if (Config->Relocatable) {
-    for (OutputSection *Sec : OutputSections)
-      Sec->Addr = 0;
-  }
-
-  // It does not make sense try to open the file if we have error already.
-  if (errorCount())
-    return;
-  // Write the result down to a file.
-  openFile();
-  if (errorCount())
-    return;
-
-  if (!Config->OFormatBinary) {
-    writeTrapInstr();
-    writeHeader();
-    writeSections();
-  } else {
-    writeSectionsBinary();
-  }
-
-  // Backfill .note.gnu.build-id section content. This is done at last
-  // because the content is usually a hash value of the entire output file.
-  writeBuildId();
-  if (errorCount())
-    return;
-
-  // Handle -Map option.
-  writeMapFile();
-  if (errorCount())
-    return;
-
-  if (auto E = Buffer->commit())
-    error("failed to write to the output file: " + toString(std::move(E)));
-}
-
 static OutputSection *findSection(StringRef Name) {
   for (BaseCommand *Base : Script->SectionCommands)
     if (auto *Sec = dyn_cast<OutputSection>(Base))
@@ -335,7 +241,7 @@ static OutputSection *findSection(String
 }
 
 // Initialize Out members.
-template <class ELFT> void Writer<ELFT>::createSyntheticSections() {
+template <class ELFT> static void createSyntheticSections() {
   // Initialize all pointers with NULL. This is needed because
   // you can call lld::elf::main more than once as a library.
   memset(&Out::First, 0, sizeof(Out));
@@ -354,7 +260,7 @@ template <class ELFT> void Writer<ELFT>:
   InX::ShStrTab = make<StringTableSection>(".shstrtab", false);
 
   Out::ElfHeader = make<OutputSection>("", 0, SHF_ALLOC);
-  Out::ElfHeader->Size = sizeof(Elf_Ehdr);
+  Out::ElfHeader->Size = sizeof(typename ELFT::Ehdr);
   Out::ProgramHeaders = make<OutputSection>("", 0, SHF_ALLOC);
   Out::ProgramHeaders->Alignment = Config->Wordsize;
 
@@ -491,6 +397,99 @@ template <class ELFT> void Writer<ELFT>:
     Add(InX::StrTab);
 }
 
+// The main function of the writer.
+template <class ELFT> void Writer<ELFT>::run() {
+  // Create linker-synthesized sections such as .got or .plt.
+  // Such sections are of type input section.
+  createSyntheticSections<ELFT>();
+
+  if (!Config->Relocatable)
+    combineEhFrameSections<ELFT>();
+
+  // We need to create some reserved symbols such as _end. Create them.
+  if (!Config->Relocatable)
+    addReservedSymbols<ELFT>();
+
+  // We want to process linker script commands. When SECTIONS command
+  // is given we let it create sections.
+  Script->processSectionCommands();
+
+  // Linker scripts controls how input sections are assigned to output sections.
+  // Input sections that were not handled by scripts are called "orphans", and
+  // they are assigned to output sections by the default rule. Process that.
+  Script->addOrphanSections();
+
+  if (Config->Discard != DiscardPolicy::All)
+    copyLocalSymbols();
+
+  if (Config->CopyRelocs)
+    addSectionSymbols();
+
+  // Now that we have a complete set of output sections. This function
+  // completes section contents. For example, we need to add strings
+  // to the string table, and add entries to .got and .plt.
+  // finalizeSections does that.
+  finalizeSections();
+  if (errorCount())
+    return;
+
+  // If -compressed-debug-sections is specified, we need to compress
+  // .debug_* sections. Do it right now because it changes the size of
+  // output sections.
+  parallelForEach(OutputSections,
+                  [](OutputSection *Sec) { Sec->maybeCompress<ELFT>(); });
+
+  Script->assignAddresses();
+  Script->allocateHeaders(Phdrs);
+
+  // Remove empty PT_LOAD to avoid causing the dynamic linker to try to mmap a
+  // 0 sized region. This has to be done late since only after assignAddresses
+  // we know the size of the sections.
+  removeEmptyPTLoad();
+
+  if (!Config->OFormatBinary)
+    assignFileOffsets();
+  else
+    assignFileOffsetsBinary();
+
+  setPhdrs();
+
+  if (Config->Relocatable) {
+    for (OutputSection *Sec : OutputSections)
+      Sec->Addr = 0;
+  }
+
+  // It does not make sense try to open the file if we have error already.
+  if (errorCount())
+    return;
+  // Write the result down to a file.
+  openFile();
+  if (errorCount())
+    return;
+
+  if (!Config->OFormatBinary) {
+    writeTrapInstr();
+    writeHeader();
+    writeSections();
+  } else {
+    writeSectionsBinary();
+  }
+
+  // Backfill .note.gnu.build-id section content. This is done at last
+  // because the content is usually a hash value of the entire output file.
+  writeBuildId();
+  if (errorCount())
+    return;
+
+  // Handle -Map option.
+  writeMapFile();
+  if (errorCount())
+    return;
+
+  if (auto E = Buffer->commit())
+    error("failed to write to the output file: " + toString(std::move(E)));
+}
+
 static bool shouldKeepInSymtab(SectionBase *Sec, StringRef SymName,
                                const Symbol &B) {
   if (B.isFile() || B.isSection())




More information about the llvm-commits mailing list