[lld] r270527 - Remove Writer::ensureBss().

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon May 23 20:16:55 PDT 2016


Author: ruiu
Date: Mon May 23 22:16:51 2016
New Revision: 270527

URL: http://llvm.org/viewvc/llvm-project?rev=270527&view=rev
Log:
Remove Writer::ensureBss().

Previously, we created a .bss section when needed. We had a function
ensureBss() for that purpose. Turned out that was error-prone
because it was easy to forget to call that function before accessing
the .bss section.

This patch always make the BSS section. The section is added to the
output when it's not empty.

Modified:
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/ELF/mips-got-and-copy.s

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=270527&r1=270526&r2=270527&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Mon May 23 22:16:51 2016
@@ -98,7 +98,6 @@ private:
   void scanRelocsForThunks(const elf::ObjectFile<ELFT> &File,
                            ArrayRef<RelTy> Rels);
 
-  void ensureBss();
   void addCommonSymbols(std::vector<DefinedCommon *> &Syms);
   void addCopyRelSymbol(SharedSymbol<ELFT> *Sym);
 
@@ -129,6 +128,7 @@ template <class ELFT> void elf::writeRes
   typedef typename ELFT::Ehdr Elf_Ehdr;
 
   // Create singleton output sections.
+  OutputSection<ELFT> Bss(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
   DynamicSection<ELFT> Dynamic(*Symtab);
   EhOutputSection<ELFT> EhFrame;
   GotSection<ELFT> Got;
@@ -192,6 +192,7 @@ template <class ELFT> void elf::writeRes
     MipsRldMap->updateAlign(sizeof(uintX_t));
   }
 
+  Out<ELFT>::Bss = &Bss;
   Out<ELFT>::BuildId = BuildId.get();
   Out<ELFT>::DynStrTab = &DynStrTab;
   Out<ELFT>::DynSymTab = &DynSymTab;
@@ -211,7 +212,6 @@ template <class ELFT> void elf::writeRes
   Out<ELFT>::SymTab = SymTabSec.get();
   Out<ELFT>::VerSym = &VerSym;
   Out<ELFT>::VerNeed = &VerNeed;
-  Out<ELFT>::Bss = nullptr;
   Out<ELFT>::MipsRldMap = MipsRldMap.get();
   Out<ELFT>::Opd = nullptr;
   Out<ELFT>::OpdBuf = nullptr;
@@ -1006,17 +1006,6 @@ static bool compareSections(OutputSectio
   return false;
 }
 
-// The .bss section does not exist if no input file has a .bss section.
-// This function creates one if that's the case.
-template <class ELFT> void Writer<ELFT>::ensureBss() {
-  if (Out<ELFT>::Bss)
-    return;
-  Out<ELFT>::Bss =
-      new OutputSection<ELFT>(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
-  OwningSections.emplace_back(Out<ELFT>::Bss);
-  OutputSections.push_back(Out<ELFT>::Bss);
-}
-
 // Until this function is called, common symbols do not belong to any section.
 // This function adds them to end of BSS section.
 template <class ELFT>
@@ -1030,7 +1019,6 @@ void Writer<ELFT>::addCommonSymbols(std:
                      return A->Alignment > B->Alignment;
                    });
 
-  ensureBss();
   uintX_t Off = Out<ELFT>::Bss->getSize();
   for (DefinedCommon *C : Syms) {
     Off = alignTo(Off, C->Alignment);
@@ -1060,7 +1048,6 @@ void Writer<ELFT>::addCopyRelSymbol(Shar
   if (SymSize == 0)
     fatal("cannot create a copy relocation for " + SS->getName());
 
-  ensureBss();
   uintX_t Align = getAlignment(SS);
   uintX_t Off = alignTo(Out<ELFT>::Bss->getSize(), Align);
   Out<ELFT>::Bss->setSize(Off + SymSize);
@@ -1330,9 +1317,6 @@ template <class ELFT> void Writer<ELFT>:
     }
   }
 
-  Out<ELFT>::Bss = static_cast<OutputSection<ELFT> *>(
-      Factory.lookup(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE));
-
   // If we have a .opd section (used under PPC64 for function descriptors),
   // store a pointer to it here so that we can use it later when processing
   // relocations.
@@ -1377,9 +1361,7 @@ template <class ELFT> void Writer<ELFT>:
 
   // Scan relocations. This must be done after every symbol is declared so that
   // we can correctly decide if a dynamic relocation is needed.
-  // Check size() each time to guard against .bss being created.
-  for (unsigned I = 0; I < OutputSections.size(); ++I) {
-    OutputSectionBase<ELFT> *Sec = OutputSections[I];
+  for (OutputSectionBase<ELFT> *Sec : OutputSections) {
     Sec->forEachInputSection([&](InputSectionBase<ELFT> *S) {
       if (auto *IS = dyn_cast<InputSection<ELFT>>(S)) {
         // Set OutSecOff so that scanRelocs can use it.
@@ -1521,6 +1503,8 @@ template <class ELFT> void Writer<ELFT>:
     Add(Out<ELFT>::Plt);
   if (!Out<ELFT>::EhFrame->empty())
     Add(Out<ELFT>::EhFrameHdr);
+  if (Out<ELFT>::Bss->getSize() > 0)
+    Add(Out<ELFT>::Bss);
 }
 
 // The linker is expected to define SECNAME_start and SECNAME_end

Modified: lld/trunk/test/ELF/mips-got-and-copy.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-got-and-copy.s?rev=270527&r1=270526&r2=270527&view=diff
==============================================================================
--- lld/trunk/test/ELF/mips-got-and-copy.s (original)
+++ lld/trunk/test/ELF/mips-got-and-copy.s Mon May 23 22:16:51 2016
@@ -36,7 +36,7 @@
 # CHECK-NEXT:       Initial: 0x40014
 # CHECK-NEXT:       Value: 0x40014
 # CHECK-NEXT:       Type: Object (0x1)
-# CHECK-NEXT:       Section: .bss (0xC)
+# CHECK-NEXT:       Section: .bss (0xD)
 # CHECK-NEXT:       Name: data1@ (7)
 # CHECK-NEXT:     }
 # CHECK-NEXT:   ]




More information about the llvm-commits mailing list