Files
clang-p2996/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
Shankar Easwaran f7a8da3384 [ELF] Add LinkingContext to the ELFReader.
This adds the LinkingContext parameter to the ELFReader. Previously the flags in
that were needed in the Context was passed to the ELFReader, this made it very
hard to access data structures in the LinkingContext when reading an ELF file.

This change makes the ELFReader more flexible so that required parameters can be
grabbed directly from the LinkingContext.

Future patches make use of the changes.

There is no change in functionality though.

llvm-svn: 228905
2015-02-12 05:02:41 +00:00

94 lines
2.9 KiB
C++

//===- 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