diff options
| author | Eugene Leviant <evgeny.leviant@gmail.com> | 2016-11-07 09:04:06 +0000 |
|---|---|---|
| committer | Eugene Leviant <evgeny.leviant@gmail.com> | 2016-11-07 09:04:06 +0000 |
| commit | 0a8f1fe6f7a89f5e71979fd9a910cf0607cf4f55 (patch) | |
| tree | ab7dfd961e75b131ee8a62dca1e9d4adb78d0974 | |
| parent | a5672e0c4bd11a29cff908d9d61652c00aa1b6e3 (diff) | |
| download | bcm5719-llvm-0a8f1fe6f7a89f5e71979fd9a910cf0607cf4f55.tar.gz bcm5719-llvm-0a8f1fe6f7a89f5e71979fd9a910cf0607cf4f55.zip | |
[ELF] Make InputSection<ELFT>::writeTo virtual
Differential revision: https://reviews.llvm.org/D26281
llvm-svn: 286100
| -rw-r--r-- | lld/ELF/InputSection.cpp | 12 | ||||
| -rw-r--r-- | lld/ELF/InputSection.h | 13 | ||||
| -rw-r--r-- | lld/ELF/SyntheticSections.cpp | 12 | ||||
| -rw-r--r-- | 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 d1c96fd0065..42db014b6e9 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -79,13 +79,6 @@ InputSectionBase<ELFT>::InputSectionBase(elf::ObjectFile<ELFT> *File, 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(); @@ -207,6 +200,11 @@ bool InputSection<ELFT>::classof(const InputSectionData *S) { 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); diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 62fc5e6a0f2..78eeb9f134a 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<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; @@ -113,9 +118,6 @@ 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; } @@ -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<const Elf_Shdr *> 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 <class RelTy> void relocateNonAlloc(uint8_t *Buf, llvm::ArrayRef<RelTy> Rels); diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index a3655d1ca97..34d2bb88402 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -95,14 +95,14 @@ BuildIdSection<ELFT>::BuildIdSection(size_t HashSize) ".note.gnu.build-id"), HashSize(HashSize) { this->Live = true; +} - Buf.resize(16 + HashSize); +template <class ELFT> void BuildIdSection<ELFT>::writeTo(uint8_t *Buf) { const endianness E = ELFT::TargetEndianness; - 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); + 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 } template <class ELFT> diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index 9cf622a1682..86763a32529 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -30,6 +30,8 @@ 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; @@ -37,7 +39,6 @@ public: protected: BuildIdSection(size_t HashSize); - std::vector<uint8_t> Buf; void computeHash(llvm::MutableArrayRef<uint8_t> Buf, |

