From 0a8f1fe6f7a89f5e71979fd9a910cf0607cf4f55 Mon Sep 17 00:00:00 2001 From: Eugene Leviant Date: Mon, 7 Nov 2016 09:04:06 +0000 Subject: [PATCH] [ELF] Make InputSection::writeTo virtual Differential revision: https://reviews.llvm.org/D26281 llvm-svn: 286100 --- lld/ELF/InputSection.cpp | 12 +++++------- lld/ELF/InputSection.h | 13 +++++++++---- lld/ELF/SyntheticSections.cpp | 12 ++++++------ lld/ELF/SyntheticSections.h | 3 ++- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index d1c96fd..42db014 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -79,13 +79,6 @@ InputSectionBase::InputSectionBase(elf::ObjectFile *File, this->Offset = Hdr->sh_offset; } -template size_t InputSectionBase::getSize() const { - if (auto *D = dyn_cast>(this)) - if (D->getThunksSize() > 0) - return D->getThunkOff() + D->getThunksSize(); - return Data.size(); -} - // Returns a string for an error message. template static std::string getName(SectionT *Sec) { return (Sec->getFile()->getName() + "(" + Sec->Name + ")").str(); @@ -207,6 +200,11 @@ bool InputSection::classof(const InputSectionData *S) { return S->kind() == Base::Regular; } +template size_t InputSection::getSize() const { + return getThunksSize() > 0 ? getThunkOff() + getThunksSize() + : this->Data.size(); +} + template InputSectionBase *InputSection::getRelocatedSection() { assert(this->Type == SHT_RELA || this->Type == SHT_REL); diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 62fc5e6..78eeb9f 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -52,6 +52,8 @@ private: unsigned SectionKind : 3; public: + virtual ~InputSectionData() = default; + InputSectionData(InputSectionData &&) = default; Kind kind() const { return (Kind)SectionKind; } unsigned Live : 1; // for garbage collection @@ -66,6 +68,9 @@ public: return llvm::makeArrayRef((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 UncompressedData; @@ -113,9 +118,6 @@ public: // this but instead this->Repl. InputSectionBase *Repl; - // Returns the size of this section (even if this is a common or BSS.) - size_t getSize() const; - static InputSectionBase Discarded; ObjectFile *getFile() const { return File; } @@ -243,7 +245,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); + void writeTo(uint8_t *Buf) override; // Relocation sections that refer to this one. llvm::TinyPtrVector RelocSections; @@ -270,6 +272,9 @@ public: // Size of chunk with thunks code. uint64_t getThunksSize() const; + // Size of section in bytes. + size_t getSize() const override; + template void relocateNonAlloc(uint8_t *Buf, llvm::ArrayRef Rels); diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index a3655d1..34d2bb8 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -95,14 +95,14 @@ BuildIdSection::BuildIdSection(size_t HashSize) ".note.gnu.build-id"), HashSize(HashSize) { this->Live = true; +} - Buf.resize(16 + HashSize); +template void BuildIdSection::writeTo(uint8_t *Buf) { const endianness E = ELFT::TargetEndianness; - write32(Buf.data(), 4); // Name size - write32(Buf.data() + 4, HashSize); // Content size - write32(Buf.data() + 8, NT_GNU_BUILD_ID); // Type - memcpy(Buf.data() + 12, "GNU", 4); // Name string - this->Data = ArrayRef(Buf); + write32(Buf, 4); // Name size + write32(Buf + 4, HashSize); // Content size + write32(Buf + 8, NT_GNU_BUILD_ID); // Type + memcpy(Buf + 12, "GNU", 4); // Name string } template diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index 9cf622a..86763a3 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -30,6 +30,8 @@ public: // .note.gnu.build-id section. template class BuildIdSection : public InputSection { public: + void writeTo(uint8_t *Buf) override; + size_t getSize() const override { return 16 + HashSize; } virtual void writeBuildId(llvm::MutableArrayRef Buf) = 0; virtual ~BuildIdSection() = default; @@ -37,7 +39,6 @@ public: protected: BuildIdSection(size_t HashSize); - std::vector Buf; void computeHash(llvm::MutableArrayRef Buf, -- 2.7.4