diff options
| author | Rui Ueyama <ruiu@google.com> | 2016-11-01 20:28:21 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2016-11-01 20:28:21 +0000 |
| commit | 6dc7fcbec428fbc15be90bb9ff942f93752e04c1 (patch) | |
| tree | a6af5b384661c08ae467920802d9729a208bde66 | |
| parent | 4a2055bef9a79eb7be41260ca207d59b70939b02 (diff) | |
| download | bcm5719-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.txt | 1 | ||||
| -rw-r--r-- | lld/ELF/InputSection.cpp | 91 | ||||
| -rw-r--r-- | lld/ELF/InputSection.h | 52 | ||||
| -rw-r--r-- | lld/ELF/OutputSections.h | 2 | ||||
| -rw-r--r-- | lld/ELF/SyntheticSections.cpp | 126 | ||||
| -rw-r--r-- | lld/ELF/SyntheticSections.h | 74 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 1 |
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" |

