[lld] r285965 - Now that the ELFFile constructor does nothing, create it when needed.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 3 13:44:51 PDT 2016


Author: rafael
Date: Thu Nov  3 15:44:50 2016
New Revision: 285965

URL: http://llvm.org/viewvc/llvm-project?rev=285965&view=rev
Log:
Now that the ELFFile constructor does nothing, create it when needed.

This avoids duplicating the buffer in InputFile.

Modified:
    lld/trunk/ELF/ICF.cpp
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/InputFiles.h
    lld/trunk/ELF/InputSection.cpp
    lld/trunk/ELF/MarkLive.cpp
    lld/trunk/ELF/OutputSections.cpp
    lld/trunk/ELF/Relocations.cpp

Modified: lld/trunk/ELF/ICF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ICF.cpp?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/ICF.cpp (original)
+++ lld/trunk/ELF/ICF.cpp Thu Nov  3 15:44:50 2016
@@ -219,8 +219,8 @@ bool ICF<ELFT>::equalsConstant(const Inp
   for (size_t I = 0, E = A->RelocSections.size(); I != E; ++I) {
     const Elf_Shdr *RA = A->RelocSections[I];
     const Elf_Shdr *RB = B->RelocSections[I];
-    ELFFile<ELFT> &FileA = A->File->getObj();
-    ELFFile<ELFT> &FileB = B->File->getObj();
+    ELFFile<ELFT> FileA = A->File->getObj();
+    ELFFile<ELFT> FileB = B->File->getObj();
     if (RA->sh_type == SHT_RELA) {
       if (!relocationEq(check(FileA.relas(RA)), check(FileB.relas(RB))))
         return false;
@@ -272,8 +272,8 @@ bool ICF<ELFT>::equalsVariable(const Inp
   for (size_t I = 0, E = A->RelocSections.size(); I != E; ++I) {
     const Elf_Shdr *RA = A->RelocSections[I];
     const Elf_Shdr *RB = B->RelocSections[I];
-    ELFFile<ELFT> &FileA = A->File->getObj();
-    ELFFile<ELFT> &FileB = B->File->getObj();
+    ELFFile<ELFT> FileA = A->File->getObj();
+    ELFFile<ELFT> FileB = B->File->getObj();
     if (RA->sh_type == SHT_RELA) {
       if (!variableEq(A, B, check(FileA.relas(RA)), check(FileB.relas(RB))))
         return false;

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Thu Nov  3 15:44:50 2016
@@ -110,11 +110,10 @@ template <class ELFT> static ELFKind get
 }
 
 template <class ELFT>
-ELFFileBase<ELFT>::ELFFileBase(Kind K, MemoryBufferRef MB)
-    : InputFile(K, MB), ELFObj(MB.getBuffer()) {
+ELFFileBase<ELFT>::ELFFileBase(Kind K, MemoryBufferRef MB) : InputFile(K, MB) {
   EKind = getELFKind<ELFT>();
-  EMachine = ELFObj.getHeader()->e_machine;
-  OSABI = ELFObj.getHeader()->e_ident[llvm::ELF::EI_OSABI];
+  EMachine = getObj().getHeader()->e_machine;
+  OSABI = getObj().getHeader()->e_ident[llvm::ELF::EI_OSABI];
 }
 
 template <class ELFT>
@@ -126,18 +125,18 @@ typename ELFT::SymRange ELFFileBase<ELFT
 
 template <class ELFT>
 uint32_t ELFFileBase<ELFT>::getSectionIndex(const Elf_Sym &Sym) const {
-  return check(ELFObj.getSectionIndex(&Sym, Symbols, SymtabSHNDX));
+  return check(getObj().getSectionIndex(&Sym, Symbols, SymtabSHNDX));
 }
 
 template <class ELFT>
 void ELFFileBase<ELFT>::initSymtab(ArrayRef<Elf_Shdr> Sections,
                                    const Elf_Shdr *Symtab) {
   FirstNonLocal = Symtab->sh_info;
-  Symbols = check(ELFObj.symbols(Symtab));
+  Symbols = check(getObj().symbols(Symtab));
   if (FirstNonLocal == 0 || FirstNonLocal > Symbols.size())
     fatal(getFilename(this) + ": invalid sh_info in symbol table");
 
-  StringTable = check(ELFObj.getStringTableForSymtab(*Symtab, Sections));
+  StringTable = check(getObj().getStringTableForSymtab(*Symtab, Sections));
 }
 
 template <class ELFT>
@@ -174,7 +173,7 @@ template <class ELFT> uint32_t elf::Obje
 template <class ELFT>
 void elf::ObjectFile<ELFT>::parse(DenseSet<CachedHashStringRef> &ComdatGroups) {
   // Read section and symbol tables.
-  ArrayRef<Elf_Shdr> ObjSections = check(this->ELFObj.sections());
+  ArrayRef<Elf_Shdr> ObjSections = check(this->getObj().sections());
   initializeSections(ComdatGroups, ObjSections);
   initializeSymbols(ObjSections);
 }
@@ -197,7 +196,7 @@ elf::ObjectFile<ELFT>::getShtGroupSignat
 template <class ELFT>
 ArrayRef<typename elf::ObjectFile<ELFT>::Elf_Word>
 elf::ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) {
-  const ELFFile<ELFT> &Obj = this->ELFObj;
+  const ELFFile<ELFT> &Obj = this->getObj();
   ArrayRef<Elf_Word> Entries =
       check(Obj.template getSectionContentsAsArray<Elf_Word>(&Sec));
   if (Entries.empty() || Entries[0] != GRP_COMDAT)
@@ -262,7 +261,7 @@ template <class ELFT>
 void elf::ObjectFile<ELFT>::initializeSections(
     DenseSet<CachedHashStringRef> &ComdatGroups,
     ArrayRef<Elf_Shdr> ObjSections) {
-  const ELFFile<ELFT> &Obj = this->ELFObj;
+  const ELFFile<ELFT> &Obj = this->getObj();
   uint64_t Size = ObjSections.size();
   Sections.resize(Size);
   unsigned I = -1;
@@ -344,7 +343,8 @@ template <class ELFT>
 InputSectionBase<ELFT> *
 elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec,
                                           StringRef SectionStringTable) {
-  StringRef Name = check(this->ELFObj.getSectionName(&Sec, SectionStringTable));
+  StringRef Name =
+      check(this->getObj().getSectionName(&Sec, SectionStringTable));
 
   switch (Sec.sh_type) {
   case SHT_ARM_ATTRIBUTES:
@@ -540,7 +540,8 @@ SharedFile<ELFT>::SharedFile(MemoryBuffe
 template <class ELFT>
 const typename ELFT::Shdr *
 SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const {
-  return check(this->ELFObj.getSection(&Sym, this->Symbols, this->SymtabSHNDX));
+  return check(
+      this->getObj().getSection(&Sym, this->Symbols, this->SymtabSHNDX));
 }
 
 // Partially parse the shared object file so that we can call
@@ -550,7 +551,7 @@ template <class ELFT> void SharedFile<EL
   typedef typename ELFT::uint uintX_t;
   const Elf_Shdr *DynamicSec = nullptr;
 
-  const ELFFile<ELFT> Obj = this->ELFObj;
+  const ELFFile<ELFT> Obj = this->getObj();
   ArrayRef<Elf_Shdr> Sections = check(Obj.sections());
   for (const Elf_Shdr &Sec : Sections) {
     switch (Sec.sh_type) {
@@ -614,8 +615,8 @@ SharedFile<ELFT>::parseVerdefs(const Elf
     return Verdefs;
 
   // The location of the first global versym entry.
-  Versym = reinterpret_cast<const Elf_Versym *>(this->ELFObj.base() +
-                                                VersymSec->sh_offset) +
+  const char *Base = this->MB.getBuffer().data();
+  Versym = reinterpret_cast<const Elf_Versym *>(Base + VersymSec->sh_offset) +
            this->FirstNonLocal;
 
   // We cannot determine the largest verdef identifier without inspecting
@@ -627,7 +628,7 @@ SharedFile<ELFT>::parseVerdefs(const Elf
 
   // Build the Verdefs array by following the chain of Elf_Verdef objects
   // from the start of the .gnu.version_d section.
-  const uint8_t *Verdef = this->ELFObj.base() + VerdefSec->sh_offset;
+  const char *Verdef = Base + VerdefSec->sh_offset;
   for (unsigned I = 0; I != VerdefCount; ++I) {
     auto *CurVerdef = reinterpret_cast<const Elf_Verdef *>(Verdef);
     Verdef += CurVerdef->vd_next;

Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Thu Nov  3 15:44:50 2016
@@ -100,8 +100,9 @@ public:
     return K == ObjectKind || K == SharedKind;
   }
 
-  const llvm::object::ELFFile<ELFT> &getObj() const { return ELFObj; }
-  llvm::object::ELFFile<ELFT> &getObj() { return ELFObj; }
+  llvm::object::ELFFile<ELFT> getObj() const {
+    return llvm::object::ELFFile<ELFT>(MB.getBuffer());
+  }
 
   StringRef getStringTable() const { return StringTable; }
 
@@ -110,7 +111,6 @@ public:
   Elf_Sym_Range getElfSymbols(bool OnlyGlobals);
 
 protected:
-  llvm::object::ELFFile<ELFT> ELFObj;
   ArrayRef<Elf_Sym> Symbols;
   uint32_t FirstNonLocal = 0;
   ArrayRef<Elf_Word> SymtabSHNDX;

Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Thu Nov  3 15:44:50 2016
@@ -563,7 +563,7 @@ template <class ELFT> void EhInputSectio
     return;
 
   if (RelocSection) {
-    ELFFile<ELFT> &Obj = this->File->getObj();
+    ELFFile<ELFT> Obj = this->File->getObj();
     if (RelocSection->sh_type == SHT_RELA)
       split(check(Obj.relas(RelocSection)));
     else

Modified: lld/trunk/ELF/MarkLive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MarkLive.cpp?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/MarkLive.cpp (original)
+++ lld/trunk/ELF/MarkLive.cpp Thu Nov  3 15:44:50 2016
@@ -80,7 +80,7 @@ static ResolvedReloc<ELFT> resolveReloc(
 template <class ELFT>
 static void forEachSuccessor(InputSection<ELFT> &Sec,
                              std::function<void(ResolvedReloc<ELFT>)> Fn) {
-  ELFFile<ELFT> &Obj = Sec.getFile()->getObj();
+  ELFFile<ELFT> Obj = Sec.getFile()->getObj();
   for (const typename ELFT::Shdr *RelSec : Sec.RelocSections) {
     if (RelSec->sh_type == SHT_RELA) {
       for (const typename ELFT::Rela &Rel : check(Obj.relas(RelSec)))
@@ -153,7 +153,7 @@ scanEhFrameSection(EhInputSection<ELFT>
   // .eh_frame keep other section alive and some don't.
   EH.split();
 
-  ELFFile<ELFT> &EObj = EH.getFile()->getObj();
+  ELFFile<ELFT> EObj = EH.getFile()->getObj();
   if (EH.RelocSection->sh_type == SHT_RELA)
     scanEhFrameSection(EH, check(EObj.relas(EH.RelocSection)), Enqueue);
   else

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Thu Nov  3 15:44:50 2016
@@ -1177,7 +1177,7 @@ void EhOutputSection<ELFT>::addSection(I
     return;
 
   if (const Elf_Shdr *RelSec = Sec->RelocSection) {
-    ELFFile<ELFT> &Obj = Sec->getFile()->getObj();
+    ELFFile<ELFT> Obj = Sec->getFile()->getObj();
     if (RelSec->sh_type == SHT_RELA)
       addSectionAux(Sec, check(Obj.relas(RelSec)));
     else

Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=285965&r1=285964&r2=285965&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Thu Nov  3 15:44:50 2016
@@ -776,7 +776,7 @@ static void scanRelocs(InputSectionBase<
 template <class ELFT>
 void scanRelocations(InputSectionBase<ELFT> &S,
                      const typename ELFT::Shdr &RelSec) {
-  ELFFile<ELFT> &EObj = S.getFile()->getObj();
+  ELFFile<ELFT> EObj = S.getFile()->getObj();
   if (RelSec.sh_type == SHT_RELA)
     scanRelocs(S, check(EObj.relas(&RelSec)));
   else
@@ -806,7 +806,7 @@ static void createThunks(InputSectionBas
 template <class ELFT>
 void createThunks(InputSectionBase<ELFT> &S,
                   const typename ELFT::Shdr &RelSec) {
-  ELFFile<ELFT> &EObj = S.getFile()->getObj();
+  ELFFile<ELFT> EObj = S.getFile()->getObj();
   if (RelSec.sh_type == SHT_RELA)
     createThunks(S, check(EObj.relas(&RelSec)));
   else




More information about the llvm-commits mailing list