[lld] r286235 - Revert "[ELF] Make InputSection<ELFT>::writeTo virtual"

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 8 06:47:16 PST 2016


Author: rafael
Date: Tue Nov  8 08:47:16 2016
New Revision: 286235

URL: http://llvm.org/viewvc/llvm-project?rev=286235&view=rev
Log:
Revert "[ELF] Make InputSection<ELFT>::writeTo virtual"

This reverts commit r286100.

This saves 8 bytes of every InputSection.

Modified:
    lld/trunk/ELF/InputSection.cpp
    lld/trunk/ELF/InputSection.h
    lld/trunk/ELF/SyntheticSections.cpp
    lld/trunk/ELF/SyntheticSections.h

Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=286235&r1=286234&r2=286235&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Tue Nov  8 08:47:16 2016
@@ -79,6 +79,13 @@ InputSectionBase<ELFT>::InputSectionBase
   this->Offset = Hdr->sh_offset;
 }
 
+template <class ELFT> size_t InputSectionBase<ELFT>::getSize() const {
+  if (auto *D = dyn_cast<InputSection<ELFT>>(this))
+    if (D->getThunksSize() > 0)
+      return D->getThunkOff() + D->getThunksSize();
+  return Data.size();
+}
+
 // Returns a string for an error message.
 template <class SectionT> static std::string getName(SectionT *Sec) {
   return (Sec->getFile()->getName() + "(" + Sec->Name + ")").str();
@@ -200,11 +207,6 @@ bool InputSection<ELFT>::classof(const I
   return S->kind() == Base::Regular;
 }
 
-template <class ELFT> size_t InputSection<ELFT>::getSize() const {
-  return getThunksSize() > 0 ? getThunkOff() + getThunksSize()
-                             : this->Data.size();
-}
-
 template <class ELFT>
 InputSectionBase<ELFT> *InputSection<ELFT>::getRelocatedSection() {
   assert(this->Type == SHT_RELA || this->Type == SHT_REL);

Modified: lld/trunk/ELF/InputSection.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=286235&r1=286234&r2=286235&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.h (original)
+++ lld/trunk/ELF/InputSection.h Tue Nov  8 08:47:16 2016
@@ -52,8 +52,6 @@ private:
   unsigned SectionKind : 3;
 
 public:
-  virtual ~InputSectionData() = default;
-  InputSectionData(InputSectionData &&) = default;
   Kind kind() const { return (Kind)SectionKind; }
 
   unsigned Live : 1; // for garbage collection
@@ -68,9 +66,6 @@ public:
     return llvm::makeArrayRef<T>((const T *)Data.data(), S / sizeof(T));
   }
 
-  virtual void writeTo(uint8_t *Buf) {}
-  virtual size_t getSize() const { return Data.size(); }
-
   // If a section is compressed, this has the uncompressed section data.
   std::unique_ptr<uint8_t[]> UncompressedData;
 
@@ -118,6 +113,9 @@ public:
   // this but instead this->Repl.
   InputSectionBase<ELFT> *Repl;
 
+  // Returns the size of this section (even if this is a common or BSS.)
+  size_t getSize() const;
+
   static InputSectionBase<ELFT> Discarded;
 
   ObjectFile<ELFT> *getFile() const { return File; }
@@ -245,7 +243,7 @@ public:
 
   // Write this section to a mmap'ed file, assuming Buf is pointing to
   // beginning of the output section.
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf);
 
   // Relocation sections that refer to this one.
   llvm::TinyPtrVector<const Elf_Shdr *> RelocSections;
@@ -272,9 +270,6 @@ public:
   // Size of chunk with thunks code.
   uint64_t getThunksSize() const;
 
-  // Size of section in bytes.
-  size_t getSize() const override;
-
   template <class RelTy>
   void relocateNonAlloc(uint8_t *Buf, llvm::ArrayRef<RelTy> Rels);
 

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=286235&r1=286234&r2=286235&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Tue Nov  8 08:47:16 2016
@@ -95,14 +95,14 @@ BuildIdSection<ELFT>::BuildIdSection(siz
                          ".note.gnu.build-id"),
       HashSize(HashSize) {
   this->Live = true;
-}
 
-template <class ELFT> void BuildIdSection<ELFT>::writeTo(uint8_t *Buf) {
+  Buf.resize(16 + HashSize);
   const endianness E = ELFT::TargetEndianness;
-  write32<E>(Buf, 4);                   // Name size
-  write32<E>(Buf + 4, HashSize);        // Content size
-  write32<E>(Buf + 8, NT_GNU_BUILD_ID); // Type
-  memcpy(Buf + 12, "GNU", 4);           // Name string
+  write32<E>(Buf.data(), 4);                   // Name size
+  write32<E>(Buf.data() + 4, HashSize);        // Content size
+  write32<E>(Buf.data() + 8, NT_GNU_BUILD_ID); // Type
+  memcpy(Buf.data() + 12, "GNU", 4);           // Name string
+  this->Data = ArrayRef<uint8_t>(Buf);
 }
 
 template <class ELFT>

Modified: lld/trunk/ELF/SyntheticSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=286235&r1=286234&r2=286235&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.h (original)
+++ lld/trunk/ELF/SyntheticSections.h Tue Nov  8 08:47:16 2016
@@ -24,8 +24,6 @@ public:
 // .note.gnu.build-id section.
 template <class ELFT> class BuildIdSection : public InputSection<ELFT> {
 public:
-  void writeTo(uint8_t *Buf) override;
-  size_t getSize() const override { return 16 + HashSize; }
   virtual void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) = 0;
   virtual ~BuildIdSection() = default;
 
@@ -33,6 +31,7 @@ public:
 
 protected:
   BuildIdSection(size_t HashSize);
+  std::vector<uint8_t> Buf;
 
   void
   computeHash(llvm::MutableArrayRef<uint8_t> Buf,




More information about the llvm-commits mailing list