//===- lib/ReaderWriter/ELF/ELFReader.h -----------------------------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_ELF_READER_H #define LLD_READER_WRITER_ELF_READER_H #include "CreateELF.h" #include "DynamicFile.h" #include "ELFFile.h" #include "lld/ReaderWriter/Reader.h" namespace lld { namespace elf { struct DynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; template static result_type create(std::unique_ptr mb, bool useUndefines) { return lld::elf::DynamicFile::create(std::move(mb), useUndefines); } }; struct ELFFileCreateELFTraits { typedef llvm::ErrorOr> result_type; template static result_type create(std::unique_ptr mb, bool atomizeStrings) { return lld::elf::ELFFile::create(std::move(mb), atomizeStrings); } }; class ELFObjectReader : public Reader { public: ELFObjectReader(bool atomizeStrings) : _atomizeStrings(atomizeStrings) {} virtual bool canParse(file_magic magic, StringRef, const MemoryBuffer &) const { return (magic == llvm::sys::fs::file_magic::elf_relocatable); } virtual error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const { std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), _atomizeStrings); if (error_code ec = f.getError()) return ec; result.push_back(std::move(*f)); return error_code::success(); } protected: bool _atomizeStrings; }; class ELFDSOReader : public Reader { public: ELFDSOReader(bool useUndefines) : _useUndefines(useUndefines) {} virtual bool canParse(file_magic magic, StringRef, const MemoryBuffer &) const { return (magic == llvm::sys::fs::file_magic::elf_shared_object); } virtual error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const { std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), _useUndefines); if (error_code ec = f.getError()) return ec; result.push_back(std::move(*f)); return error_code::success(); } protected: bool _useUndefines; }; } // namespace elf } // namespace lld #endif // LLD_READER_WRITER_ELF_READER_H