[Mips] Add a couple of MipsAbiInfoHandler functions to check linked code type
No functional changes. llvm-svn: 238689
This commit is contained in:
parent
2944e4a43d
commit
faa8bfdd1a
|
@ -424,6 +424,16 @@ static uint32_t selectFpAbiFlag(uint32_t oldFp, uint32_t newFp) {
|
|||
namespace lld {
|
||||
namespace elf {
|
||||
|
||||
template <class ELFT> bool MipsAbiInfoHandler<ELFT>::isMicroMips() const {
|
||||
assert(_abiFlags.hasValue());
|
||||
return _abiFlags->_ases & AFL_ASE_MICROMIPS;
|
||||
}
|
||||
|
||||
template <class ELFT> bool MipsAbiInfoHandler<ELFT>::isMipsR6() const {
|
||||
assert(_abiFlags.hasValue());
|
||||
return _abiFlags->_isa == Arch32r6 || _abiFlags->_isa == Arch64r6;
|
||||
}
|
||||
|
||||
template <class ELFT> uint32_t MipsAbiInfoHandler<ELFT>::getFlags() const {
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
uint32_t flags = 0;
|
||||
|
|
|
@ -44,6 +44,8 @@ public:
|
|||
MipsAbiInfoHandler() = default;
|
||||
|
||||
bool hasMipsAbiSection() const { return _hasAbiSection; }
|
||||
bool isMicroMips() const;
|
||||
bool isMipsR6() const;
|
||||
|
||||
uint32_t getFlags() const;
|
||||
llvm::Optional<Elf_Mips_RegInfo> getRegistersMask() const;
|
||||
|
|
|
@ -311,12 +311,6 @@ private:
|
|||
/// \brief Owner of all the Atoms created by this pass.
|
||||
RelocationPassFile _file;
|
||||
|
||||
/// \brief Linked files contain MIPS R6 code.
|
||||
bool _isMipsR6 = false;
|
||||
|
||||
/// \brief Linked files contain microMIPS code.
|
||||
bool _isMicroMips = false;
|
||||
|
||||
/// \brief Map Atoms and addend to local GOT entries.
|
||||
typedef std::pair<const Atom *, int64_t> LocalGotMapKeyT;
|
||||
llvm::DenseMap<LocalGotMapKeyT, GOTAtom *> _gotLocalMap;
|
||||
|
@ -418,6 +412,11 @@ private:
|
|||
bool mightBeDynamic(const MipsELFDefinedAtom<ELFT> &atom,
|
||||
Reference::KindValue refKind) const;
|
||||
bool hasPLTEntry(const Atom *atom) const;
|
||||
|
||||
/// \brief Linked files contain microMIPS code.
|
||||
bool isMicroMips();
|
||||
/// \brief Linked files contain MIPS R6 code.
|
||||
bool isMipsR6();
|
||||
};
|
||||
|
||||
template <typename ELFT>
|
||||
|
@ -430,14 +429,6 @@ RelocationPass<ELFT>::RelocationPass(MipsLinkingContext &ctx)
|
|||
|
||||
template <typename ELFT>
|
||||
void RelocationPass<ELFT>::perform(std::unique_ptr<SimpleFile> &mf) {
|
||||
auto &handler =
|
||||
static_cast<MipsTargetHandler<ELFT> &>(this->_ctx.getTargetHandler());
|
||||
|
||||
uint32_t elfFlags = handler.getAbiInfoHandler().getFlags();
|
||||
_isMicroMips = elfFlags & EF_MIPS_MICROMIPS;
|
||||
_isMipsR6 = (elfFlags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6 ||
|
||||
(elfFlags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6;
|
||||
|
||||
for (const auto &atom : mf->defined())
|
||||
for (const auto &ref : *atom)
|
||||
collectReferenceInfo(*cast<MipsELFDefinedAtom<ELFT>>(atom),
|
||||
|
@ -709,6 +700,20 @@ bool RelocationPass<ELFT>::hasPLTEntry(const Atom *atom) const {
|
|||
return _pltRegMap.count(atom) || _pltMicroMap.count(atom);
|
||||
}
|
||||
|
||||
template <typename ELFT> bool RelocationPass<ELFT>::isMicroMips() {
|
||||
TargetHandler &handler = this->_ctx.getTargetHandler();
|
||||
return static_cast<MipsTargetHandler<ELFT> &>(handler)
|
||||
.getAbiInfoHandler()
|
||||
.isMicroMips();
|
||||
}
|
||||
|
||||
template <typename ELFT> bool RelocationPass<ELFT>::isMipsR6() {
|
||||
TargetHandler &handler = this->_ctx.getTargetHandler();
|
||||
return static_cast<MipsTargetHandler<ELFT> &>(handler)
|
||||
.getAbiInfoHandler()
|
||||
.isMipsR6();
|
||||
}
|
||||
|
||||
template <typename ELFT>
|
||||
bool RelocationPass<ELFT>::requirePLTEntry(const Atom *a) const {
|
||||
if (!_hasStaticRelocations.count(a))
|
||||
|
@ -761,7 +766,7 @@ const LA25Atom *RelocationPass<ELFT>::getLA25Entry(const Atom *target,
|
|||
template <typename ELFT>
|
||||
const PLTAtom *RelocationPass<ELFT>::getPLTEntry(const Atom *a) {
|
||||
// If file contains microMIPS code try to reuse compressed PLT entry...
|
||||
if (_isMicroMips) {
|
||||
if (isMicroMips()) {
|
||||
auto microPLT = _pltMicroMap.find(a);
|
||||
if (microPLT != _pltMicroMap.end())
|
||||
return microPLT->second;
|
||||
|
@ -773,7 +778,7 @@ const PLTAtom *RelocationPass<ELFT>::getPLTEntry(const Atom *a) {
|
|||
return regPLT->second;
|
||||
|
||||
// ... and finally prefer to create new compressed PLT entry.
|
||||
return _isMicroMips ? getPLTMicroEntry(a) : getPLTRegEntry(a);
|
||||
return isMicroMips() ? getPLTMicroEntry(a) : getPLTRegEntry(a);
|
||||
}
|
||||
|
||||
template <typename ELFT>
|
||||
|
@ -1010,7 +1015,7 @@ const PLTAtom *RelocationPass<ELFT>::getPLTRegEntry(const Atom *a) {
|
|||
if (plt != _pltRegMap.end())
|
||||
return plt->second;
|
||||
|
||||
PLTAAtom *pa = _isMipsR6
|
||||
PLTAAtom *pa = isMipsR6()
|
||||
? new (_file._alloc) PLTR6Atom(getGOTPLTEntry(a), _file)
|
||||
: new (_file._alloc) PLTAAtom(getGOTPLTEntry(a), _file);
|
||||
_pltRegMap[a] = pa;
|
||||
|
|
Loading…
Reference in New Issue