diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-10-05 18:40:00 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-10-05 18:40:00 +0000 |
commit | 32aca87bf8a1fc191abf685ec3e4ff4eb55895c9 (patch) | |
tree | 67f2321505a1c3fdf30adba7cf4b794005462678 | |
parent | e81d2fa9bb6d2dd56aea00a01d0b521a43ddbb54 (diff) | |
download | bcm5719-llvm-32aca87bf8a1fc191abf685ec3e4ff4eb55895c9.tar.gz bcm5719-llvm-32aca87bf8a1fc191abf685ec3e4ff4eb55895c9.zip |
Compact SectionPiece.
It is pretty easy to get the data from the InputSection, so we don't
have to store it.
This opens the way for storing the hash instead.
llvm-svn: 283357
-rw-r--r-- | lld/ELF/InputSection.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/InputSection.h | 12 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 4 |
3 files changed, 14 insertions, 8 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 2f265e35ae6..1e9e96eb631 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -28,6 +28,10 @@ using namespace llvm::support::endian; using namespace lld; using namespace lld::elf; +ArrayRef<uint8_t> InputSectionData::getData(const SectionPiece &P) const { + return Data.slice(P.InputOff, P.size()); +} + template <class ELFT> static ArrayRef<uint8_t> getSectionContents(elf::ObjectFile<ELFT> *File, const typename ELFT::Shdr *Hdr) { @@ -638,7 +642,7 @@ template <class ELFT> void MergeInputSection<ELFT>::finalizePieces() { if (Piece.OutputOff == size_t(-1)) { // Offsets of tail-merged strings are computed lazily. auto *OutSec = static_cast<MergeOutputSection<ELFT> *>(this->OutSec); - ArrayRef<uint8_t> D = Piece.data(); + ArrayRef<uint8_t> D = this->getData(Piece); StringRef S((const char *)D.data(), D.size()); Piece.OutputOff = OutSec->getOffset(S); } diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 34549156f6b..b5ff603a87c 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -23,6 +23,7 @@ namespace elf { class DefinedCommon; class SymbolBody; +struct SectionPiece; template <class ELFT> class ICF; template <class ELFT> class DefinedRegular; @@ -63,6 +64,7 @@ public: StringRef Name; ArrayRef<uint8_t> Data; + ArrayRef<uint8_t> getData(const SectionPiece &P) const; // If a section is compressed, this has the uncompressed section data. std::unique_ptr<char[]> UncompressedData; @@ -123,10 +125,8 @@ template <class ELFT> InputSectionBase<ELFT> InputSectionBase<ELFT>::Discarded; // SectionPiece represents a piece of splittable section contents. struct SectionPiece { SectionPiece(size_t Off, ArrayRef<uint8_t> Data, bool Live = false) - : InputOff(Off), Data((const uint8_t *)Data.data()), Size(Data.size()), - Live(Live || !Config->GcSections) {} + : InputOff(Off), Size(Data.size()), Live(Live || !Config->GcSections) {} - ArrayRef<uint8_t> data() { return {Data, Size}; } size_t size() const { return Size; } size_t InputOff; @@ -136,7 +136,6 @@ private: // We use bitfields because SplitInputSection is accessed by // std::upper_bound very often. // We want to save bits to make it cache friendly. - const uint8_t *Data; uint32_t Size : 31; public: @@ -182,7 +181,10 @@ private: struct EhSectionPiece : public SectionPiece { EhSectionPiece(size_t Off, ArrayRef<uint8_t> Data, unsigned FirstRelocation) - : SectionPiece(Off, Data), FirstRelocation(FirstRelocation) {} + : SectionPiece(Off, Data), Data(Data.data()), + FirstRelocation(FirstRelocation) {} + const uint8_t *Data; + ArrayRef<uint8_t> data() { return {Data, size()}; } unsigned FirstRelocation; }; diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index bce9d5983e2..683c15c6060 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -1191,7 +1191,7 @@ template <class ELFT> void EhOutputSection<ELFT>::writeTo(uint8_t *Buf) { size_t CieOffset = Cie->Piece->OutputOff; writeCieFde<ELFT>(Buf + CieOffset, Cie->Piece->data()); - for (SectionPiece *Fde : Cie->FdePieces) { + for (EhSectionPiece *Fde : Cie->FdePieces) { size_t Off = Fde->OutputOff; writeCieFde<ELFT>(Buf + Off, Fde->data()); @@ -1244,7 +1244,7 @@ void MergeOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) { for (SectionPiece &Piece : Sec->Pieces) { if (!Piece.Live) continue; - uintX_t OutputOffset = Builder.add(toStringRef(Piece.data())); + uintX_t OutputOffset = Builder.add(toStringRef(Sec->getData(Piece))); if (!shouldTailMerge()) Piece.OutputOff = OutputOffset; } |