diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-09-12 13:13:53 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-09-12 13:13:53 +0000 |
| commit | c7e1e034980d26faef3a7c4f22b73a04feeefa38 (patch) | |
| tree | 7bf00026c369123f0322b305553b6d532a1328d6 | |
| parent | 54f1614ec1cb4bda333ae61f328d009865f4c456 (diff) | |
| download | bcm5719-llvm-c7e1e034980d26faef3a7c4f22b73a04feeefa38.tar.gz bcm5719-llvm-c7e1e034980d26faef3a7c4f22b73a04feeefa38.zip | |
Store an ArrayRef for Data in InputSectionData.
llvm-svn: 281210
| -rw-r--r-- | lld/ELF/ICF.cpp | 3 | ||||
| -rw-r--r-- | lld/ELF/InputSection.cpp | 50 | ||||
| -rw-r--r-- | lld/ELF/InputSection.h | 13 | ||||
| -rw-r--r-- | lld/ELF/MarkLive.cpp | 2 | ||||
| -rw-r--r-- | lld/ELF/Relocations.cpp | 2 |
5 files changed, 34 insertions, 36 deletions
diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp index 5fa7aa04f48..52d7cba55b2 100644 --- a/lld/ELF/ICF.cpp +++ b/lld/ELF/ICF.cpp @@ -233,8 +233,7 @@ bool ICF<ELFT>::equalsConstant(const InputSection<ELFT> *A, } return A->getSectionHdr()->sh_flags == B->getSectionHdr()->sh_flags && - A->getSize() == B->getSize() && - A->getSectionData() == B->getSectionData(); + A->getSize() == B->getSize() && A->Data == B->Data; } template <class ELFT> diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 55a39059263..320b8abbf3b 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -29,11 +29,19 @@ using namespace lld; using namespace lld::elf; template <class ELFT> +static ArrayRef<uint8_t> getSectionContents(elf::ObjectFile<ELFT> *File, + const typename ELFT::Shdr *Hdr) { + if (!File || Hdr->sh_type == SHT_NOBITS) + return {}; + return check(File->getObj().getSectionContents(Hdr)); +} + +template <class ELFT> InputSectionBase<ELFT>::InputSectionBase(elf::ObjectFile<ELFT> *File, const Elf_Shdr *Hdr, StringRef Name, Kind SectionKind) - : InputSectionData(SectionKind, Name, Hdr->sh_flags & SHF_COMPRESSED, - !Config->GcSections), + : InputSectionData(SectionKind, Name, getSectionContents(File, Hdr), + Hdr->sh_flags & SHF_COMPRESSED, !Config->GcSections), Header(Hdr), File(File), Repl(this) { // The ELF spec states that a value of 0 means the section has // no alignment constraits. @@ -47,14 +55,6 @@ template <class ELFT> size_t InputSectionBase<ELFT>::getSize() const { return Header->sh_size; } -template <class ELFT> -ArrayRef<uint8_t> InputSectionBase<ELFT>::getSectionData() const { - if (Compressed) - return ArrayRef<uint8_t>((const uint8_t *)UncompressedData.get(), - UncompressedDataSize); - return check(this->File->getObj().getSectionContents(this->Header)); -} - // Returns a string for an error message. template <class SectionT> static std::string getName(SectionT *Sec) { return (Sec->getFile()->getName() + "(" + Sec->Name + ")").str(); @@ -94,8 +94,6 @@ template <class ELFT> void InputSectionBase<ELFT>::uncompress() { // A compressed section consists of a header of Elf_Chdr type // followed by compressed data. - ArrayRef<uint8_t> Data = - check(this->File->getObj().getSectionContents(this->Header)); if (Data.size() < sizeof(Elf_Chdr)) fatal("corrupt compressed section"); @@ -106,11 +104,13 @@ template <class ELFT> void InputSectionBase<ELFT>::uncompress() { fatal(getName(this) + ": unsupported compression type"); StringRef Buf((const char *)Data.data(), Data.size()); - UncompressedDataSize = Hdr->ch_size; + size_t UncompressedDataSize = Hdr->ch_size; UncompressedData.reset(new char[UncompressedDataSize]); if (zlib::uncompress(Buf, UncompressedData.get(), UncompressedDataSize) != zlib::StatusOK) fatal(getName(this) + ": error uncompressing section"); + Data = ArrayRef<uint8_t>((uint8_t *)UncompressedData.get(), + UncompressedDataSize); } template <class ELFT> @@ -406,7 +406,7 @@ template <class ELFT> void InputSection<ELFT>::writeTo(uint8_t *Buf) { } // Copy section contents from source object file to output file. - ArrayRef<uint8_t> Data = this->getSectionData(); + ArrayRef<uint8_t> Data = this->Data; memcpy(Buf + OutSecOff, Data.data(), Data.size()); // Iterate over all relocation sections that apply to this section. @@ -490,7 +490,7 @@ void EhInputSection<ELFT>::split() { template <class ELFT> template <class RelTy> void EhInputSection<ELFT>::split(ArrayRef<RelTy> Rels) { - ArrayRef<uint8_t> Data = this->getSectionData(); + ArrayRef<uint8_t> Data = this->Data; unsigned RelI = 0; for (size_t Off = 0, End = Data.size(); Off != End;) { size_t Size = readEhRecordSize<ELFT>(Data.slice(Off)); @@ -557,7 +557,7 @@ MergeInputSection<ELFT>::MergeInputSection(elf::ObjectFile<ELFT> *F, : InputSectionBase<ELFT>(F, Header, Name, InputSectionBase<ELFT>::Merge) {} template <class ELFT> void MergeInputSection<ELFT>::splitIntoPieces() { - ArrayRef<uint8_t> Data = this->getSectionData(); + ArrayRef<uint8_t> Data = this->Data; uintX_t EntSize = this->Header->sh_entsize; if (this->Header->sh_flags & SHF_STRINGS) this->Pieces = splitStrings(Data, EntSize); @@ -584,9 +584,7 @@ SectionPiece *MergeInputSection<ELFT>::getSectionPiece(uintX_t Offset) { template <class ELFT> const SectionPiece * MergeInputSection<ELFT>::getSectionPiece(uintX_t Offset) const { - ArrayRef<uint8_t> D = this->getSectionData(); - StringRef Data((const char *)D.data(), D.size()); - uintX_t Size = Data.size(); + uintX_t Size = this->Data.size(); if (Offset >= Size) fatal(getName(this) + ": entry is past the end of the section"); @@ -639,13 +637,13 @@ MipsReginfoInputSection<ELFT>::MipsReginfoInputSection(elf::ObjectFile<ELFT> *F, StringRef Name) : InputSectionBase<ELFT>(F, Hdr, Name, InputSectionBase<ELFT>::MipsReginfo) { + ArrayRef<uint8_t> Data = this->Data; // Initialize this->Reginfo. - ArrayRef<uint8_t> D = this->getSectionData(); - if (D.size() != sizeof(Elf_Mips_RegInfo<ELFT>)) { + if (Data.size() != sizeof(Elf_Mips_RegInfo<ELFT>)) { error(getName(this) + ": invalid size of .reginfo section"); return; } - Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(D.data()); + Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(Data.data()); } template <class ELFT> @@ -660,7 +658,7 @@ MipsOptionsInputSection<ELFT>::MipsOptionsInputSection(elf::ObjectFile<ELFT> *F, : InputSectionBase<ELFT>(F, Hdr, Name, InputSectionBase<ELFT>::MipsOptions) { // Find ODK_REGINFO option in the section's content. - ArrayRef<uint8_t> D = this->getSectionData(); + ArrayRef<uint8_t> D = this->Data; while (!D.empty()) { if (D.size() < sizeof(Elf_Mips_Options<ELFT>)) { error(getName(this) + ": invalid size of .MIPS.options section"); @@ -686,12 +684,12 @@ MipsAbiFlagsInputSection<ELFT>::MipsAbiFlagsInputSection( : InputSectionBase<ELFT>(F, Hdr, Name, InputSectionBase<ELFT>::MipsAbiFlags) { // Initialize this->Flags. - ArrayRef<uint8_t> D = this->getSectionData(); - if (D.size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) { + ArrayRef<uint8_t> Data = this->Data; + if (Data.size() != sizeof(Elf_Mips_ABIFlags<ELFT>)) { error("invalid size of .MIPS.abiflags section"); return; } - Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(D.data()); + Flags = reinterpret_cast<const Elf_Mips_ABIFlags<ELFT> *>(Data.data()); } template <class ELFT> diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 23e3a547ebb..ad63e16f69c 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -42,9 +42,10 @@ public: // The garbage collector sets sections' Live bits. // If GC is disabled, all sections are considered live by default. - InputSectionData(Kind SectionKind, StringRef Name, bool Compressed, bool Live) + InputSectionData(Kind SectionKind, StringRef Name, ArrayRef<uint8_t> Data, + bool Compressed, bool Live) : SectionKind(SectionKind), Live(Live), Compressed(Compressed), - Name(Name) {} + Name(Name), Data(Data) {} private: unsigned SectionKind : 3; @@ -61,9 +62,10 @@ public: StringRef Name; + ArrayRef<uint8_t> Data; + // If a section is compressed, this has the uncompressed section data. std::unique_ptr<char[]> UncompressedData; - size_t UncompressedDataSize = 0; std::vector<Relocation> Relocations; }; @@ -84,7 +86,8 @@ protected: public: InputSectionBase() - : InputSectionData(Regular, "", false, false), Repl(this) {} + : InputSectionData(Regular, "", ArrayRef<uint8_t>(), false, false), + Repl(this) {} InputSectionBase(ObjectFile<ELFT> *File, const Elf_Shdr *Header, StringRef Name, Kind SectionKind); @@ -110,8 +113,6 @@ public: // section. uintX_t getOffset(uintX_t Offset) const; - ArrayRef<uint8_t> getSectionData() const; - void uncompress(); void relocate(uint8_t *Buf, uint8_t *BufEnd); diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index c2316084a73..90327133e06 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -54,7 +54,7 @@ struct ResolvedReloc { template <class ELFT> static typename ELFT::uint getAddend(InputSectionBase<ELFT> &Sec, const typename ELFT::Rel &Rel) { - return Target->getImplicitAddend(Sec.getSectionData().begin(), + return Target->getImplicitAddend(Sec.Data.begin(), Rel.getType(Config->Mips64EL)); } diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index af72aaa6bb4..2dce30aaf40 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -534,7 +534,7 @@ static void scanRelocs(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) { }; const elf::ObjectFile<ELFT> &File = *C.getFile(); - ArrayRef<uint8_t> SectionData = C.getSectionData(); + ArrayRef<uint8_t> SectionData = C.Data; const uint8_t *Buf = SectionData.begin(); ArrayRef<EhSectionPiece> Pieces; |

