diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-11-03 20:44:50 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-11-03 20:44:50 +0000 |
| commit | e19abab9a78bd5e2d878b76aff329d0b10ecd737 (patch) | |
| tree | 1dafbed154de7d1a310ec95580f414e5204c74ef /lld/ELF/InputFiles.cpp | |
| parent | 946242b5d2798fd130d0ef34e231b20d2c84e86d (diff) | |
| download | bcm5719-llvm-e19abab9a78bd5e2d878b76aff329d0b10ecd737.tar.gz bcm5719-llvm-e19abab9a78bd5e2d878b76aff329d0b10ecd737.zip | |
Now that the ELFFile constructor does nothing, create it when needed.
This avoids duplicating the buffer in InputFile.
llvm-svn: 285965
Diffstat (limited to 'lld/ELF/InputFiles.cpp')
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index f1fd58ddaf5..a56361c7fd7 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -110,11 +110,10 @@ template <class ELFT> static ELFKind getELFKind() { } 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>::getElfSymbols(bool OnlyGlobals) { 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::ObjectFile<ELFT>::getMipsGp0() const { 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>::getShtGroupSignature(ArrayRef<Elf_Shdr> Sections, 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(MemoryBufferRef M) 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<ELFT>::parseSoName() { 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_Versym *&Versym) { 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_Versym *&Versym) { // 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; |

