summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-11-01 20:28:21 +0000
committerRui Ueyama <ruiu@google.com>2016-11-01 20:28:21 +0000
commit6dc7fcbec428fbc15be90bb9ff942f93752e04c1 (patch)
treea6af5b384661c08ae467920802d9729a208bde66
parent4a2055bef9a79eb7be41260ca207d59b70939b02 (diff)
downloadbcm5719-llvm-6dc7fcbec428fbc15be90bb9ff942f93752e04c1.tar.gz
bcm5719-llvm-6dc7fcbec428fbc15be90bb9ff942f93752e04c1.zip
Create SyntheticSections.cpp.
We are going to have many more classes for linker-synthesized input sections, so it's worth to be added to a separate file than to the file for regular input sections. llvm-svn: 285740
-rw-r--r--lld/ELF/CMakeLists.txt1
-rw-r--r--lld/ELF/InputSection.cpp91
-rw-r--r--lld/ELF/InputSection.h52
-rw-r--r--lld/ELF/OutputSections.h2
-rw-r--r--lld/ELF/SyntheticSections.cpp126
-rw-r--r--lld/ELF/SyntheticSections.h74
-rw-r--r--lld/ELF/Writer.cpp1
7 files changed, 202 insertions, 145 deletions
diff --git a/lld/ELF/CMakeLists.txt b/lld/ELF/CMakeLists.txt
index e0d590d132d..65f4359b9a6 100644
--- a/lld/ELF/CMakeLists.txt
+++ b/lld/ELF/CMakeLists.txt
@@ -23,6 +23,7 @@ add_lld_library(lldELF
SymbolListFile.cpp
SymbolTable.cpp
Symbols.cpp
+ SyntheticSections.cpp
Target.cpp
Thunks.cpp
Writer.cpp
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index c6f34be5564..eb7b1dc82d6 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -19,8 +19,6 @@
#include "llvm/Support/Compression.h"
#include "llvm/Support/Endian.h"
-#include "llvm/Support/RandomNumberGenerator.h"
-#include "llvm/Support/xxhash.h"
using namespace llvm;
using namespace llvm::ELF;
@@ -852,65 +850,6 @@ InputSection<ELFT> InputSection<ELFT>::createCommonInputSection(
return Ret;
}
-template <class ELFT>
-BuildIdSection<ELFT>::BuildIdSection(size_t HashSize)
- : InputSection<ELFT>(SHF_ALLOC, SHT_NOTE, 1, ArrayRef<uint8_t>(),
- ".note.gnu.build-id") {
- Buf.resize(16 + HashSize);
- 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);
-}
-
-template <class ELFT>
-uint8_t *BuildIdSection<ELFT>::getOutputLoc(uint8_t *Start) const {
- return Start + this->OutSec->getFileOffset() + this->OutSecOff;
-}
-
-template <class ELFT>
-void BuildIdFastHash<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
- const endianness E = ELFT::TargetEndianness;
-
- // 64-bit xxhash
- uint64_t Hash = xxHash64(toStringRef(Buf));
- write64<E>(this->getOutputLoc(Buf.begin()) + 16, Hash);
-}
-
-template <class ELFT>
-void BuildIdMd5<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
- MD5 Hash;
- Hash.update(Buf);
- MD5::MD5Result Res;
- Hash.final(Res);
- memcpy(this->getOutputLoc(Buf.begin()) + 16, Res, 16);
-}
-
-template <class ELFT>
-void BuildIdSha1<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
- SHA1 Hash;
- Hash.update(Buf);
- memcpy(this->getOutputLoc(Buf.begin()) + 16, Hash.final().data(), 20);
-}
-
-template <class ELFT>
-void BuildIdUuid<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
- if (getRandomBytes(this->getOutputLoc(Buf.begin()) + 16, 16))
- error("entropy source failure");
-}
-
-template <class ELFT>
-BuildIdHexstring<ELFT>::BuildIdHexstring()
- : BuildIdSection<ELFT>(Config->BuildIdVector.size()) {}
-
-template <class ELFT>
-void BuildIdHexstring<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
- memcpy(this->getOutputLoc(Buf.begin()) + 16, Config->BuildIdVector.data(),
- Config->BuildIdVector.size());
-}
-
template class elf::InputSectionBase<ELF32LE>;
template class elf::InputSectionBase<ELF32BE>;
template class elf::InputSectionBase<ELF64LE>;
@@ -945,33 +884,3 @@ template class elf::MipsAbiFlagsInputSection<ELF32LE>;
template class elf::MipsAbiFlagsInputSection<ELF32BE>;
template class elf::MipsAbiFlagsInputSection<ELF64LE>;
template class elf::MipsAbiFlagsInputSection<ELF64BE>;
-
-template class elf::BuildIdSection<ELF32LE>;
-template class elf::BuildIdSection<ELF32BE>;
-template class elf::BuildIdSection<ELF64LE>;
-template class elf::BuildIdSection<ELF64BE>;
-
-template class elf::BuildIdFastHash<ELF32LE>;
-template class elf::BuildIdFastHash<ELF32BE>;
-template class elf::BuildIdFastHash<ELF64LE>;
-template class elf::BuildIdFastHash<ELF64BE>;
-
-template class elf::BuildIdMd5<ELF32LE>;
-template class elf::BuildIdMd5<ELF32BE>;
-template class elf::BuildIdMd5<ELF64LE>;
-template class elf::BuildIdMd5<ELF64BE>;
-
-template class elf::BuildIdSha1<ELF32LE>;
-template class elf::BuildIdSha1<ELF32BE>;
-template class elf::BuildIdSha1<ELF64LE>;
-template class elf::BuildIdSha1<ELF64BE>;
-
-template class elf::BuildIdUuid<ELF32LE>;
-template class elf::BuildIdUuid<ELF32BE>;
-template class elf::BuildIdUuid<ELF64LE>;
-template class elf::BuildIdUuid<ELF64BE>;
-
-template class elf::BuildIdHexstring<ELF32LE>;
-template class elf::BuildIdHexstring<ELF32BE>;
-template class elf::BuildIdHexstring<ELF64LE>;
-template class elf::BuildIdHexstring<ELF64BE>;
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index 338368a9dab..d54d019f596 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -339,58 +339,6 @@ public:
const llvm::object::Elf_Mips_ABIFlags<ELFT> *Flags = nullptr;
};
-template <class ELFT> class BuildIdSection : public InputSection<ELFT> {
-public:
- virtual void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) = 0;
- virtual ~BuildIdSection() = default;
-
- uint8_t *getOutputLoc(uint8_t *Start) const;
-
-protected:
- BuildIdSection(size_t HashSize);
- std::vector<uint8_t> Buf;
-};
-
-template <class ELFT>
-class BuildIdFastHash final : public BuildIdSection<ELFT> {
-public:
- BuildIdFastHash() : BuildIdSection<ELFT>(8) {}
- void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
-};
-
-template <class ELFT> class BuildIdMd5 final : public BuildIdSection<ELFT> {
-public:
- BuildIdMd5() : BuildIdSection<ELFT>(16) {}
- void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
-};
-
-template <class ELFT> class BuildIdSha1 final : public BuildIdSection<ELFT> {
-public:
- BuildIdSha1() : BuildIdSection<ELFT>(20) {}
- void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
-};
-
-template <class ELFT> class BuildIdUuid final : public BuildIdSection<ELFT> {
-public:
- BuildIdUuid() : BuildIdSection<ELFT>(16) {}
- void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
-};
-
-template <class ELFT>
-class BuildIdHexstring final : public BuildIdSection<ELFT> {
-public:
- BuildIdHexstring();
- void writeBuildId(llvm::MutableArrayRef<uint8_t>) override;
-};
-
-// Linker generated sections which can be used as inputs.
-template <class ELFT> struct In {
- static BuildIdSection<ELFT> *BuildId;
- static std::vector<InputSection<ELFT> *> Sections;
-};
-
-template <class ELFT> BuildIdSection<ELFT> *In<ELFT>::BuildId;
-template <class ELFT> std::vector<InputSection<ELFT> *> In<ELFT>::Sections;
} // namespace elf
} // namespace lld
diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h
index f90719f3467..2e039d09861 100644
--- a/lld/ELF/OutputSections.h
+++ b/lld/ELF/OutputSections.h
@@ -18,8 +18,6 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/Object/ELF.h"
-#include "llvm/Support/MD5.h"
-#include "llvm/Support/SHA1.h"
namespace lld {
namespace elf {
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
new file mode 100644
index 00000000000..5a53eb181b8
--- /dev/null
+++ b/lld/ELF/SyntheticSections.cpp
@@ -0,0 +1,126 @@
+//===- SyntheticSections.cpp ----------------------------------------------===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains linker-synthesized sections. Currently,
+// synthetic sections are created either output sections or input sections,
+// but we are rewriting code so that all synthetic sections are created as
+// input sections.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SyntheticSections.h"
+#include "Config.h"
+#include "Error.h"
+#include "InputFiles.h"
+#include "OutputSections.h"
+#include "Strings.h"
+
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/MD5.h"
+#include "llvm/Support/RandomNumberGenerator.h"
+#include "llvm/Support/SHA1.h"
+#include "llvm/Support/xxhash.h"
+
+using namespace llvm;
+using namespace llvm::ELF;
+using namespace llvm::object;
+using namespace llvm::support;
+using namespace llvm::support::endian;
+
+using namespace lld;
+using namespace lld::elf;
+
+template <class ELFT>
+BuildIdSection<ELFT>::BuildIdSection(size_t HashSize)
+ : InputSection<ELFT>(SHF_ALLOC, SHT_NOTE, 1, ArrayRef<uint8_t>(),
+ ".note.gnu.build-id") {
+ Buf.resize(16 + HashSize);
+ 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);
+}
+
+template <class ELFT>
+uint8_t *BuildIdSection<ELFT>::getOutputLoc(uint8_t *Start) const {
+ return Start + this->OutSec->getFileOffset() + this->OutSecOff;
+}
+
+template <class ELFT>
+void BuildIdFastHash<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
+ const endianness E = ELFT::TargetEndianness;
+
+ // 64-bit xxhash
+ uint64_t Hash = xxHash64(toStringRef(Buf));
+ write64<E>(this->getOutputLoc(Buf.begin()) + 16, Hash);
+}
+
+template <class ELFT>
+void BuildIdMd5<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
+ MD5 Hash;
+ Hash.update(Buf);
+ MD5::MD5Result Res;
+ Hash.final(Res);
+ memcpy(this->getOutputLoc(Buf.begin()) + 16, Res, 16);
+}
+
+template <class ELFT>
+void BuildIdSha1<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
+ SHA1 Hash;
+ Hash.update(Buf);
+ memcpy(this->getOutputLoc(Buf.begin()) + 16, Hash.final().data(), 20);
+}
+
+template <class ELFT>
+void BuildIdUuid<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
+ if (getRandomBytes(this->getOutputLoc(Buf.begin()) + 16, 16))
+ error("entropy source failure");
+}
+
+template <class ELFT>
+BuildIdHexstring<ELFT>::BuildIdHexstring()
+ : BuildIdSection<ELFT>(Config->BuildIdVector.size()) {}
+
+template <class ELFT>
+void BuildIdHexstring<ELFT>::writeBuildId(MutableArrayRef<uint8_t> Buf) {
+ memcpy(this->getOutputLoc(Buf.begin()) + 16, Config->BuildIdVector.data(),
+ Config->BuildIdVector.size());
+}
+
+template class elf::BuildIdSection<ELF32LE>;
+template class elf::BuildIdSection<ELF32BE>;
+template class elf::BuildIdSection<ELF64LE>;
+template class elf::BuildIdSection<ELF64BE>;
+
+template class elf::BuildIdFastHash<ELF32LE>;
+template class elf::BuildIdFastHash<ELF32BE>;
+template class elf::BuildIdFastHash<ELF64LE>;
+template class elf::BuildIdFastHash<ELF64BE>;
+
+template class elf::BuildIdMd5<ELF32LE>;
+template class elf::BuildIdMd5<ELF32BE>;
+template class elf::BuildIdMd5<ELF64LE>;
+template class elf::BuildIdMd5<ELF64BE>;
+
+template class elf::BuildIdSha1<ELF32LE>;
+template class elf::BuildIdSha1<ELF32BE>;
+template class elf::BuildIdSha1<ELF64LE>;
+template class elf::BuildIdSha1<ELF64BE>;
+
+template class elf::BuildIdUuid<ELF32LE>;
+template class elf::BuildIdUuid<ELF32BE>;
+template class elf::BuildIdUuid<ELF64LE>;
+template class elf::BuildIdUuid<ELF64BE>;
+
+template class elf::BuildIdHexstring<ELF32LE>;
+template class elf::BuildIdHexstring<ELF32BE>;
+template class elf::BuildIdHexstring<ELF64LE>;
+template class elf::BuildIdHexstring<ELF64BE>;
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
new file mode 100644
index 00000000000..e86da2074f1
--- /dev/null
+++ b/lld/ELF/SyntheticSections.h
@@ -0,0 +1,74 @@
+//===- SyntheticSection.h ---------------------------------------*- C++ -*-===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLD_ELF_SYNTHETIC_SECTION_H
+#define LLD_ELF_SYNTHETIC_SECTION_H
+
+#include "InputSection.h"
+
+namespace lld {
+namespace elf {
+
+template <class ELFT> class BuildIdSection : public InputSection<ELFT> {
+public:
+ virtual void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) = 0;
+ virtual ~BuildIdSection() = default;
+
+ uint8_t *getOutputLoc(uint8_t *Start) const;
+
+protected:
+ BuildIdSection(size_t HashSize);
+ std::vector<uint8_t> Buf;
+};
+
+template <class ELFT>
+class BuildIdFastHash final : public BuildIdSection<ELFT> {
+public:
+ BuildIdFastHash() : BuildIdSection<ELFT>(8) {}
+ void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
+};
+
+template <class ELFT> class BuildIdMd5 final : public BuildIdSection<ELFT> {
+public:
+ BuildIdMd5() : BuildIdSection<ELFT>(16) {}
+ void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
+};
+
+template <class ELFT> class BuildIdSha1 final : public BuildIdSection<ELFT> {
+public:
+ BuildIdSha1() : BuildIdSection<ELFT>(20) {}
+ void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
+};
+
+template <class ELFT> class BuildIdUuid final : public BuildIdSection<ELFT> {
+public:
+ BuildIdUuid() : BuildIdSection<ELFT>(16) {}
+ void writeBuildId(llvm::MutableArrayRef<uint8_t> Buf) override;
+};
+
+template <class ELFT>
+class BuildIdHexstring final : public BuildIdSection<ELFT> {
+public:
+ BuildIdHexstring();
+ void writeBuildId(llvm::MutableArrayRef<uint8_t>) override;
+};
+
+// Linker generated sections which can be used as inputs.
+template <class ELFT> struct In {
+ static BuildIdSection<ELFT> *BuildId;
+ static std::vector<InputSection<ELFT> *> Sections;
+};
+
+template <class ELFT> BuildIdSection<ELFT> *In<ELFT>::BuildId;
+template <class ELFT> std::vector<InputSection<ELFT> *> In<ELFT>::Sections;
+
+} // namespace elf
+} // namespace lld
+
+#endif
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 93540d89c1c..2c0057a8e94 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -15,6 +15,7 @@
#include "Relocations.h"
#include "Strings.h"
#include "SymbolTable.h"
+#include "SyntheticSections.h"
#include "Target.h"
#include "llvm/ADT/StringMap.h"
OpenPOWER on IntegriCloud