[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