From 25a0d3dd64e4c0873036140587f48ec00893f9f2 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 3 Apr 2015 22:12:18 +0000 Subject: [PATCH] ELF: Merge ELF{Object,DSO}Reader implementations. The two classes are the same other than a few exceptions. This patch merges them using templates. llvm-svn: 234060 --- lld/lib/ReaderWriter/ELF/ELFReader.h | 55 ++++++---------------------- 1 file changed, 12 insertions(+), 43 deletions(-) diff --git a/lld/lib/ReaderWriter/ELF/ELFReader.h b/lld/lib/ReaderWriter/ELF/ELFReader.h index ad16a09b8ce1..657cd9d0a807 100644 --- a/lld/lib/ReaderWriter/ELF/ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/ELFReader.h @@ -18,17 +18,17 @@ namespace lld { namespace elf { -template class FileT> -class ELFObjectReader : public Reader { +template class FileT, + int FileMagic> +class ELFReader : public Reader { public: typedef llvm::object::Elf_Ehdr_Impl Elf_Ehdr; - ELFObjectReader(ContextT &ctx) : _ctx(ctx) {} + ELFReader(ContextT &ctx) : _ctx(ctx) {} bool canParse(file_magic magic, StringRef, const MemoryBuffer &buf) const override { - return (magic == llvm::sys::fs::file_magic::elf_relocatable && - elfHeader(buf)->e_machine == ContextT::machine); + return magic == FileMagic && elfHeader(buf)->e_machine == ContextT::machine; } std::error_code @@ -45,51 +45,20 @@ public: } const Elf_Ehdr *elfHeader(const MemoryBuffer &buf) const { - const uint8_t *data = - reinterpret_cast(buf.getBuffer().data()); - return (reinterpret_cast(data)); + return reinterpret_cast(buf.getBuffer().data()); } protected: ContextT &_ctx; }; +template class FileT> +using ELFObjectReader = ELFReader; + template -class ELFDSOReader : public Reader { -public: - typedef llvm::object::Elf_Ehdr_Impl Elf_Ehdr; - - ELFDSOReader(ContextT &ctx) : _ctx(ctx) {} - - bool canParse(file_magic magic, StringRef, - const MemoryBuffer &buf) const override { - return (magic == llvm::sys::fs::file_magic::elf_shared_object && - elfHeader(buf)->e_machine == ContextT::machine); - } - - std::error_code - loadFile(std::unique_ptr mb, const class Registry &, - std::vector> &result) const override { - std::size_t maxAlignment = - 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); - auto f = - createELF(llvm::object::getElfArchType(mb->getBuffer()), - maxAlignment, std::move(mb), _ctx); - if (std::error_code ec = f.getError()) - return ec; - result.push_back(std::move(*f)); - return std::error_code(); - } - - const Elf_Ehdr *elfHeader(const MemoryBuffer &buf) const { - const uint8_t *data = - reinterpret_cast(buf.getBuffer().data()); - return (reinterpret_cast(data)); - } - -protected: - ContextT &_ctx; -}; +using ELFDSOReader = ELFReader; } // namespace elf } // namespace lld