From db9e9d83b61f7f084f235eb87314f673c19c0350 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sat, 4 Apr 2015 02:07:30 +0000 Subject: [PATCH] ELF: Teach File classes about their file magics. So that we can remove one template parameter from ELFReader. ELF port is heavily templatized, and I want to reduce the usage where possible. llvm-svn: 234074 --- lld/lib/ReaderWriter/ELF/DynamicFile.h | 4 ++++ lld/lib/ReaderWriter/ELF/ELFFile.h | 5 ++++- lld/lib/ReaderWriter/ELF/ELFReader.h | 12 +++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lld/lib/ReaderWriter/ELF/DynamicFile.h b/lld/lib/ReaderWriter/ELF/DynamicFile.h index 50c37c6..9b2f2c9 100644 --- a/lld/lib/ReaderWriter/ELF/DynamicFile.h +++ b/lld/lib/ReaderWriter/ELF/DynamicFile.h @@ -45,6 +45,10 @@ public: StringRef getDSOName() const override { return _soname; } + static bool canParse(file_magic magic) { + return magic == file_magic::elf_shared_object; + } + protected: std::error_code doParse() override { std::error_code ec; diff --git a/lld/lib/ReaderWriter/ELF/ELFFile.h b/lld/lib/ReaderWriter/ELF/ELFFile.h index 4e1654b..1485e53 100644 --- a/lld/lib/ReaderWriter/ELF/ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/ELFFile.h @@ -22,7 +22,6 @@ namespace elf { /// \brief Read a binary, find out based on the symbol table contents what kind /// of symbol it is and create corresponding atoms for it template class ELFFile : public File { - typedef llvm::object::Elf_Sym_Impl Elf_Sym; typedef llvm::object::Elf_Shdr_Impl Elf_Shdr; typedef llvm::object::Elf_Rel_Impl Elf_Rel; @@ -102,6 +101,10 @@ public: _ordinal(0), _doStringsMerge(ctx.mergeCommonStrings()), _useWrap(ctx.wrapCalls().size()), _ctx(ctx) {} + static bool canParse(file_magic magic) { + return magic == file_magic::elf_relocatable; + } + virtual Reference::KindArch kindArch(); /// \brief Create symbols from LinkingContext. diff --git a/lld/lib/ReaderWriter/ELF/ELFReader.h b/lld/lib/ReaderWriter/ELF/ELFReader.h index da1c7ca..04d726b 100644 --- a/lld/lib/ReaderWriter/ELF/ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/ELFReader.h @@ -18,8 +18,7 @@ namespace lld { namespace elf { -template class FileT, - int FileMagic> +template class FileT> class ELFReader : public Reader { public: typedef llvm::object::Elf_Ehdr_Impl Elf_Ehdr; @@ -28,7 +27,8 @@ public: bool canParse(file_magic magic, StringRef, const MemoryBuffer &buf) const override { - return magic == FileMagic && elfHeader(buf)->e_machine == ContextT::machine; + return (FileT::canParse(magic) && + elfHeader(buf)->e_machine == ContextT::machine); } std::error_code @@ -57,12 +57,10 @@ protected: }; template class FileT> -using ELFObjectReader = ELFReader; +using ELFObjectReader = ELFReader; template -using ELFDSOReader = ELFReader; +using ELFDSOReader = ELFReader; } // namespace elf } // namespace lld -- 2.7.4