diff options
Diffstat (limited to 'lib/ReaderWriter/ELF/Mips/MipsELFReader.h')
-rw-r--r-- | lib/ReaderWriter/ELF/Mips/MipsELFReader.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/ReaderWriter/ELF/Mips/MipsELFReader.h b/lib/ReaderWriter/ELF/Mips/MipsELFReader.h new file mode 100644 index 0000000000000..8b325b38bb522 --- /dev/null +++ b/lib/ReaderWriter/ELF/Mips/MipsELFReader.h @@ -0,0 +1,93 @@ +//===- 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<std::unique_ptr<lld::File>> result_type; + + template <class ELFT> + static result_type create(std::unique_ptr<llvm::MemoryBuffer> mb, + MipsLinkingContext &ctx) { + return lld::elf::MipsELFFile<ELFT>::create(std::move(mb), ctx); + } +}; + +struct MipsDynamicFileCreateELFTraits { + typedef llvm::ErrorOr<std::unique_ptr<lld::SharedLibraryFile>> result_type; + + template <class ELFT> + static result_type create(std::unique_ptr<llvm::MemoryBuffer> mb, + MipsLinkingContext &ctx) { + return lld::elf::MipsDynamicFile<ELFT>::create(std::move(mb), ctx); + } +}; + +template <class ELFT> +class MipsELFObjectReader + : public ELFObjectReader<ELFT, MipsELFFileCreateTraits, + MipsLinkingContext> { + typedef ELFObjectReader<ELFT, MipsELFFileCreateTraits, MipsLinkingContext> + BaseReaderType; + +public: + MipsELFObjectReader(MipsLinkingContext &ctx) + : BaseReaderType(ctx, llvm::ELF::EM_MIPS), + _flagMerger(ctx.getELFFlagsMerger()) {} + + std::error_code + loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry, + std::vector<std::unique_ptr<File>> &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 ELFT> +class MipsELFDSOReader + : public ELFDSOReader<ELFT, MipsDynamicFileCreateELFTraits, + MipsLinkingContext> { + typedef ELFDSOReader<ELFT, MipsDynamicFileCreateELFTraits, MipsLinkingContext> + BaseReaderType; + +public: + MipsELFDSOReader(MipsLinkingContext &ctx) + : BaseReaderType(ctx, llvm::ELF::EM_MIPS), + _flagMerger(ctx.getELFFlagsMerger()) {} + + std::error_code + loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry, + std::vector<std::unique_ptr<File>> &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 |