//===- lib/ReaderWriter/ELF/MipsELFReader.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_MIPS_MIPS_ELF_READER_H #define LLD_READER_WRITER_ELF_MIPS_MIPS_ELF_READER_H #include "ELFReader.h" #include "MipsELFFile.h" #include "MipsELFFlagsMerger.h" #include "MipsLinkingContext.h" namespace lld { namespace elf { struct MipsELFFileCreateTraits { typedef llvm::ErrorOr> result_type; template static result_type create(std::unique_ptr mb, MipsLinkingContext &ctx) { return lld::elf::MipsELFFile::create(std::move(mb), ctx); } }; struct MipsDynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; template static result_type create(std::unique_ptr mb, MipsLinkingContext &ctx) { return lld::elf::MipsDynamicFile::create(std::move(mb), ctx); } }; template class MipsELFObjectReader : public ELFObjectReader { typedef ELFObjectReader BaseReaderType; public: MipsELFObjectReader(MipsLinkingContext &ctx) : BaseReaderType(ctx, llvm::ELF::EM_MIPS), _flagMerger(ctx.getELFFlagsMerger()) {} std::error_code loadFile(std::unique_ptr mb, const Registry ®istry, std::vector> &result) const override { auto &hdr = *this->elfHeader(*mb); if (std::error_code ec = _flagMerger.merge(hdr.getFileClass(), hdr.e_flags)) return ec; return BaseReaderType::loadFile(std::move(mb), registry, result); } private: MipsELFFlagsMerger &_flagMerger; }; template class MipsELFDSOReader : public ELFDSOReader { typedef ELFDSOReader BaseReaderType; public: MipsELFDSOReader(MipsLinkingContext &ctx) : BaseReaderType(ctx, llvm::ELF::EM_MIPS), _flagMerger(ctx.getELFFlagsMerger()) {} std::error_code loadFile(std::unique_ptr mb, const Registry ®istry, std::vector> &result) const override { auto &hdr = *this->elfHeader(*mb); if (std::error_code ec = _flagMerger.merge(hdr.getFileClass(), hdr.e_flags)) return ec; return BaseReaderType::loadFile(std::move(mb), registry, result); } private: MipsELFFlagsMerger &_flagMerger; }; } // namespace elf } // namespace lld #endif