Compact SectionPiece.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 5 Oct 2016 18:40:00 +0000 (18:40 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 5 Oct 2016 18:40:00 +0000 (18:40 +0000)
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

lld/ELF/InputSection.cpp
lld/ELF/InputSection.h
lld/ELF/OutputSections.cpp

index 2f265e3..1e9e96e 100644 (file)
@@ -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);
     }
index 3454915..b5ff603 100644 (file)
@@ -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;
 };
 
index bce9d59..683c15c 100644 (file)
@@ -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;
   }