summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Leviant <evgeny.leviant@gmail.com>2016-11-07 09:04:06 +0000
committerEugene Leviant <evgeny.leviant@gmail.com>2016-11-07 09:04:06 +0000
commit0a8f1fe6f7a89f5e71979fd9a910cf0607cf4f55 (patch)
treeab7dfd961e75b131ee8a62dca1e9d4adb78d0974
parenta5672e0c4bd11a29cff908d9d61652c00aa1b6e3 (diff)
downloadbcm5719-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.cpp12
-rw-r--r--lld/ELF/InputSection.h13
-rw-r--r--lld/ELF/SyntheticSections.cpp12
-rw-r--r--lld/ELF/SyntheticSections.h3
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,
OpenPOWER on IntegriCloud