[lld] r234060 - ELF: Merge ELF{Object,DSO}Reader implementations.
Rui Ueyama
ruiu at google.com
Fri Apr 3 15:12:18 PDT 2015
Author: ruiu
Date: Fri Apr 3 17:12:18 2015
New Revision: 234060
URL: http://llvm.org/viewvc/llvm-project?rev=234060&view=rev
Log:
ELF: Merge ELF{Object,DSO}Reader implementations.
The two classes are the same other than a few exceptions.
This patch merges them using templates.
Modified:
lld/trunk/lib/ReaderWriter/ELF/ELFReader.h
Modified: lld/trunk/lib/ReaderWriter/ELF/ELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFReader.h?rev=234060&r1=234059&r2=234060&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFReader.h Fri Apr 3 17:12:18 2015
@@ -18,17 +18,17 @@
namespace lld {
namespace elf {
-template <typename ELFT, typename ContextT, template <typename> class FileT>
-class ELFObjectReader : public Reader {
+template <typename ELFT, typename ContextT, template <typename> class FileT,
+ int FileMagic>
+class ELFReader : public Reader {
public:
typedef llvm::object::Elf_Ehdr_Impl<ELFT> 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<const uint8_t *>(buf.getBuffer().data());
- return (reinterpret_cast<const Elf_Ehdr *>(data));
+ return reinterpret_cast<const Elf_Ehdr *>(buf.getBuffer().data());
}
protected:
ContextT &_ctx;
};
-template <typename ELFT, typename ContextT>
-class ELFDSOReader : public Reader {
-public:
- typedef llvm::object::Elf_Ehdr_Impl<ELFT> 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<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
- std::size_t maxAlignment =
- 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
- auto f =
- createELF<DynamicFile>(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<const uint8_t *>(buf.getBuffer().data());
- return (reinterpret_cast<const Elf_Ehdr *>(data));
- }
+template <typename ELFT, typename ContextT, template <typename> class FileT>
+using ELFObjectReader = ELFReader<ELFT, ContextT, FileT,
+ llvm::sys::fs::file_magic::elf_relocatable>;
-protected:
- ContextT &_ctx;
-};
+template <typename ELFT, typename ContextT>
+using ELFDSOReader = ELFReader<ELFT, ContextT, DynamicFile,
+ llvm::sys::fs::file_magic::elf_shared_object>;
} // namespace elf
} // namespace lld
More information about the llvm-commits
mailing list