summaryrefslogtreecommitdiff
path: root/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ReaderWriter/ELF/Mips/MipsELFReader.h')
-rw-r--r--lib/ReaderWriter/ELF/Mips/MipsELFReader.h93
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 &registry,
+ 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 &registry,
+ 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