[lld] r281210 - Store an ArrayRef for Data in InputSectionData.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 12 06:13:53 PDT 2016
Author: rafael
Date: Mon Sep 12 08:13:53 2016
New Revision: 281210
URL: http://llvm.org/viewvc/llvm-project?rev=281210&view=rev
Log:
Store an ArrayRef for Data in InputSectionData.
Modified:
lld/trunk/ELF/ICF.cpp
lld/trunk/ELF/InputSection.cpp
lld/trunk/ELF/InputSection.h
lld/trunk/ELF/MarkLive.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=281210&r1=281209&r2=281210&view=diff
==============================================================================
--- lld/trunk/ELF/ICF.cpp (original)
+++ lld/trunk/ELF/ICF.cpp Mon Sep 12 08:13:53 2016
@@ -233,8 +233,7 @@ bool ICF<ELFT>::equalsConstant(const Inp
}
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>
Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=281210&r1=281209&r2=281210&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Mon Sep 12 08:13:53 2016
@@ -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 InputSectio
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 InputSectionB
// 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 InputSectionB
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<
}
// 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>::MergeInputSecti
: 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>::g
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>::MipsRegin
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>::MipsOptio
: 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>::MipsAbiF
: 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>
Modified: lld/trunk/ELF/InputSection.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=281210&r1=281209&r2=281210&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.h (original)
+++ lld/trunk/ELF/InputSection.h Mon Sep 12 08:13:53 2016
@@ -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);
Modified: lld/trunk/ELF/MarkLive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MarkLive.cpp?rev=281210&r1=281209&r2=281210&view=diff
==============================================================================
--- lld/trunk/ELF/MarkLive.cpp (original)
+++ lld/trunk/ELF/MarkLive.cpp Mon Sep 12 08:13:53 2016
@@ -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));
}
Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=281210&r1=281209&r2=281210&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Mon Sep 12 08:13:53 2016
@@ -534,7 +534,7 @@ static void scanRelocs(InputSectionBase<
};
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;
More information about the llvm-commits
mailing list