diff options
Diffstat (limited to 'lld/lib/ReaderWriter')
5 files changed, 19 insertions, 11 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h b/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h index eb0545c88a5..149d6bdb2b9 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h @@ -43,6 +43,8 @@ public: MipsAbiInfoHandler() = default; + bool hasMipsAbiSection() const { return _hasAbiSection; } + uint32_t getFlags() const; llvm::Optional<Elf_Mips_RegInfo> getRegistersMask() const; llvm::Optional<Elf_Mips_ABIFlags> getAbiFlags() const; diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp index 1e7e5945671..2afc2c1fdcf 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp @@ -17,7 +17,7 @@ namespace elf { template <class ELFT> MipsTargetHandler<ELFT>::MipsTargetHandler(MipsLinkingContext &ctx) - : _ctx(ctx), _targetLayout(new MipsTargetLayout<ELFT>(ctx)), + : _ctx(ctx), _targetLayout(new MipsTargetLayout<ELFT>(ctx, _abiInfoHandler)), _relocationHandler( createMipsRelocationHandler<ELFT>(ctx, *_targetLayout)) {} diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h index 8d5b6632345..7625f12bd90 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h @@ -31,9 +31,9 @@ public: private: MipsLinkingContext &_ctx; + MipsAbiInfoHandler<ELFT> _abiInfoHandler; std::unique_ptr<MipsTargetLayout<ELFT>> _targetLayout; std::unique_ptr<TargetRelocationHandler> _relocationHandler; - MipsAbiInfoHandler<ELFT> _abiInfoHandler; }; template <class ELFT> class MipsSymbolTable : public SymbolTable<ELFT> { diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp index 1d62c1d7db3..78ea33d7d41 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp @@ -14,8 +14,9 @@ namespace lld { namespace elf { template <class ELFT> -MipsTargetLayout<ELFT>::MipsTargetLayout(MipsLinkingContext &ctx) - : TargetLayout<ELFT>(ctx), +MipsTargetLayout<ELFT>::MipsTargetLayout(MipsLinkingContext &ctx, + MipsAbiInfoHandler<ELFT> &abi) + : TargetLayout<ELFT>(ctx), _abiInfo(abi), _gotSection(new (this->_allocator) MipsGOTSection<ELFT>(ctx)), _pltSection(new (this->_allocator) MipsPLTSection<ELFT>(ctx)) {} @@ -35,7 +36,8 @@ typename TargetLayout<ELFT>::SegmentType MipsTargetLayout<ELFT>::getSegmentType(Section<ELFT> *section) const { switch (section->order()) { case ORDER_MIPS_REGINFO: - return llvm::ELF::PT_MIPS_REGINFO; + return _abiInfo.hasMipsAbiSection() ? llvm::ELF::PT_LOAD + : llvm::ELF::PT_MIPS_REGINFO; case ORDER_MIPS_OPTIONS: return llvm::ELF::PT_LOAD; case ORDER_MIPS_ABI_FLAGS: @@ -81,11 +83,13 @@ uint64_t MipsTargetLayout<ELFT>::getLookupSectionFlags( template <class ELFT> void MipsTargetLayout<ELFT>::sortSegments() { using namespace llvm::ELF; TargetLayout<ELFT>::sortSegments(); - // Move PT_MIPS_ABIFLAGS right after PT_INTERP. - auto abiIt = std::find_if(this->_segments.begin(), this->_segments.end(), - [](const Segment<ELFT> *s) { - return s->segmentType() == PT_MIPS_ABIFLAGS; - }); + // Move PT_MIPS_ABIFLAGS or PT_MIPS_REGINFO right after PT_INTERP. + auto abiIt = + std::find_if(this->_segments.begin(), this->_segments.end(), + [](const Segment<ELFT> *s) { + auto typ = s->segmentType(); + return typ == PT_MIPS_ABIFLAGS || typ == PT_MIPS_REGINFO; + }); if (abiIt == this->_segments.end()) return; Segment<ELFT> *abiSeg = *abiIt; diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h index a4099f70458..c8a8985108e 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h @@ -9,6 +9,7 @@ #ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_LAYOUT_H #define LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_LAYOUT_H +#include "MipsAbiInfoHandler.h" #include "MipsSectionChunks.h" #include "TargetLayout.h" @@ -26,7 +27,7 @@ public: ORDER_MIPS_OPTIONS, }; - MipsTargetLayout(MipsLinkingContext &ctx); + MipsTargetLayout(MipsLinkingContext &ctx, MipsAbiInfoHandler<ELFT> &abi); const MipsGOTSection<ELFT> &getGOTSection() const { return *_gotSection; } const MipsPLTSection<ELFT> &getPLTSection() const { return *_pltSection; } @@ -57,6 +58,7 @@ protected: void sortSegments() override; private: + MipsAbiInfoHandler<ELFT> &_abiInfo; MipsGOTSection<ELFT> *_gotSection; MipsPLTSection<ELFT> *_pltSection; uint64_t _gpAddr = 0; |