Index: include/lld/ReaderWriter/ELFLinkingContext.h =================================================================== --- include/lld/ReaderWriter/ELFLinkingContext.h +++ include/lld/ReaderWriter/ELFLinkingContext.h @@ -306,6 +306,14 @@ bool armTarget1Rel() const { return _armTarget1Rel; } void setArmTarget1Rel(bool value) { _armTarget1Rel = value; } + /// Each time a reader reads a new file, this member function is called + /// with the file's ELF magics. This is supposed to "merge" all attributes + /// to generate output ELF file magic. This can also reject input files + /// if they conflict with previous input files. + virtual std::error_code mergeHeaderFlags(uint8_t fileClass, uint64_t flags) { + return std::error_code(); + } + protected: ELFLinkingContext(llvm::Triple triple, std::unique_ptr handler) : _triple(triple), _targetHandler(std::move(handler)) {} Index: lib/ReaderWriter/ELF/ELFReader.h =================================================================== --- lib/ReaderWriter/ELF/ELFReader.h +++ lib/ReaderWriter/ELF/ELFReader.h @@ -34,6 +34,10 @@ std::error_code loadFile(std::unique_ptr mb, const class Registry &, std::vector> &result) const override { + auto &hdr = *this->elfHeader(*mb); + if (auto ec = _ctx.mergeHeaderFlags(hdr.getFileClass(), hdr.e_flags)) + return ec; + std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF(llvm::object::getElfArchType(mb->getBuffer()), Index: lib/ReaderWriter/ELF/Mips/MipsELFReader.h =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsELFReader.h +++ /dev/null @@ -1,67 +0,0 @@ -//===- 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 { - -template -class MipsELFObjectReader - : public ELFObjectReader { - typedef ELFObjectReader - BaseReaderType; - -public: - MipsELFObjectReader(MipsLinkingContext &ctx) - : BaseReaderType(ctx), _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 (auto ec = _flagMerger.mergeHeaderFlags(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), _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 (auto ec = _flagMerger.mergeHeaderFlags(hdr.getFileClass(), hdr.e_flags)) - return ec; - return BaseReaderType::loadFile(std::move(mb), registry, result); - } - -private: - MipsELFFlagsMerger &_flagMerger; -}; - -} // namespace elf -} // namespace lld - -#endif Index: lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h +++ lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h @@ -46,8 +46,8 @@ static const int machine = llvm::ELF::EM_MIPS; MipsLinkingContext(llvm::Triple triple); + std::error_code mergeHeaderFlags(uint8_t fileClass, uint64_t flags) override; uint32_t getMergedELFFlags() const; - MipsELFFlagsMerger &getELFFlagsMerger(); void registerRelocationNames(Registry &r) override; // ELFLinkingContext Index: lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp +++ lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp @@ -43,12 +43,13 @@ : ELFLinkingContext(triple, createTarget(triple, *this)), _flagsMerger(triple.isArch64Bit()) {} -uint32_t MipsLinkingContext::getMergedELFFlags() const { - return _flagsMerger.getMergedELFFlags(); +std::error_code MipsLinkingContext::mergeHeaderFlags(uint8_t fileClass, + uint64_t flags) { + return _flagsMerger.mergeHeaderFlags(fileClass, flags); } -MipsELFFlagsMerger &MipsLinkingContext::getELFFlagsMerger() { - return _flagsMerger; +uint32_t MipsLinkingContext::getMergedELFFlags() const { + return _flagsMerger.getMergedELFFlags(); } uint64_t MipsLinkingContext::getBaseAddress() const { Index: lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h +++ lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h @@ -9,8 +9,9 @@ #ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_HANDLER_H #define LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_HANDLER_H +#include "ELFReader.h" #include "MipsDynamicLibraryWriter.h" -#include "MipsELFReader.h" +#include "MipsELFFile.h" #include "MipsExecutableWriter.h" #include "MipsLinkingContext.h" #include "MipsRelocationHandler.h" @@ -85,6 +86,9 @@ /// \brief TargetHandler for Mips template class MipsTargetHandler final : public TargetHandler { + typedef ELFObjectReader ObjReader; + typedef ELFDSOReader DSOReader; + public: MipsTargetHandler(MipsLinkingContext &ctx) : _ctx(ctx), _targetLayout(new MipsTargetLayout(ctx)), @@ -92,11 +96,11 @@ createMipsRelocationHandler(ctx, *_targetLayout)) {} std::unique_ptr getObjReader() override { - return llvm::make_unique>(_ctx); + return llvm::make_unique(_ctx); } std::unique_ptr getDSOReader() override { - return llvm::make_unique>(_ctx); + return llvm::make_unique(_ctx); } const TargetRelocationHandler &getRelocationHandler() const override {