summaryrefslogtreecommitdiffstats
path: root/lld/lib
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2015-05-31 20:37:13 +0000
committerSimon Atanasyan <simon@atanasyan.com>2015-05-31 20:37:13 +0000
commit2944e4a43d7c8cc403d01b7f6c33e11c8481bd3a (patch)
tree7862a5f981ddf8b8afa38381efefe781e8ede65f /lld/lib
parentc140b41c39f7a5441ec07667484aa83f908cd0e8 (diff)
downloadbcm5719-llvm-2944e4a43d7c8cc403d01b7f6c33e11c8481bd3a.tar.gz
bcm5719-llvm-2944e4a43d7c8cc403d01b7f6c33e11c8481bd3a.zip
[Mips] Do not put the .reginfo section into the separate segment
The .reginfo should not belong to the separate segment if there is a .MIPS.abiflags section. llvm-svn: 238688
Diffstat (limited to 'lld/lib')
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h2
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp2
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h2
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp20
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h4
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;
OpenPOWER on IntegriCloud