[lld] r209709 - [Mips] Do not mix _gp and _gp_disp symbols in relocation handling.
Simon Atanasyan
simon at atanasyan.com
Tue May 27 21:10:01 PDT 2014
Author: atanasyan
Date: Tue May 27 23:10:01 2014
New Revision: 209709
URL: http://llvm.org/viewvc/llvm-project?rev=209709&view=rev
Log:
[Mips] Do not mix _gp and _gp_disp symbols in relocation handling.
No functional changes.
Modified:
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=209709&r1=209708&r2=209709&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp Tue May 27 23:10:01 2014
@@ -129,6 +129,9 @@ error_code MipsTargetRelocationHandler::
AtomLayout *gpAtom = _mipsTargetLayout.getGP();
uint64_t gpAddr = gpAtom ? gpAtom->_virtualAddr : 0;
+ AtomLayout *gpDispAtom = _mipsTargetLayout.getGPDisp();
+ bool isGpDisp = gpDispAtom && ref.target() == gpDispAtom->_atom;
+
uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;
uint8_t *location = atomContent + ref.offsetInAtom();
uint64_t targetVAddress = writer.addressOfAtom(ref.target());
@@ -144,12 +147,10 @@ error_code MipsTargetRelocationHandler::
reloc26loc(location, relocVAddress, targetVAddress, ref.addend());
break;
case R_MIPS_HI16:
- relocHi16(location, relocVAddress, targetVAddress, ref.addend(),
- ref.target() == gpAtom->_atom);
+ relocHi16(location, relocVAddress, targetVAddress, ref.addend(), isGpDisp);
break;
case R_MIPS_LO16:
- relocLo16(location, relocVAddress, targetVAddress, ref.addend(),
- ref.target() == gpAtom->_atom);
+ relocLo16(location, relocVAddress, targetVAddress, ref.addend(), isGpDisp);
break;
case R_MIPS_GOT16:
relocGOT(location, relocVAddress, targetVAddress, ref.addend(), gpAddr);
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h?rev=209709&r1=209708&r2=209709&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h Tue May 27 23:10:01 2014
@@ -26,8 +26,7 @@ public:
MipsTargetLayout(const MipsLinkingContext &ctx)
: TargetLayout<ELFType>(ctx),
_gotSection(new (_alloc) MipsGOTSection<ELFType>(ctx)),
- _pltSection(new (_alloc) MipsPLTSection<ELFType>(ctx)),
- _cachedGP(false) {}
+ _pltSection(new (_alloc) MipsPLTSection<ELFType>(ctx)) {}
const MipsGOTSection<ELFType> &getGOTSection() const { return *_gotSection; }
const MipsPLTSection<ELFType> &getPLTSection() const { return *_pltSection; }
@@ -47,22 +46,30 @@ public:
/// \brief GP offset relative to .got section.
uint64_t getGPOffset() const { return 0x7FF0; }
- /// \brief Get the cached value of the GP atom.
+ /// \brief Get '_gp' symbol atom layout.
AtomLayout *getGP() {
- if (!_cachedGP) {
- auto gpAtomIter = this->findAbsoluteAtom("_gp_disp");
- _gp = *(gpAtomIter);
- _cachedGP = true;
+ if (!_gpAtom.hasValue()) {
+ auto atom = this->findAbsoluteAtom("_gp");
+ _gpAtom = atom != this->absoluteAtoms().end() ? *atom : nullptr;
}
- return _gp;
+ return *_gpAtom;
+ }
+
+ /// \brief Get '_gp_disp' symbol atom layout.
+ AtomLayout *getGPDisp() {
+ if (!_gpDispAtom.hasValue()) {
+ auto atom = this->findAbsoluteAtom("_gp_disp");
+ _gpDispAtom = atom != this->absoluteAtoms().end() ? *atom : nullptr;
+ }
+ return *_gpDispAtom;
}
private:
llvm::BumpPtrAllocator _alloc;
MipsGOTSection<ELFType> *_gotSection;
MipsPLTSection<ELFType> *_pltSection;
- AtomLayout *_gp;
- bool _cachedGP;
+ llvm::Optional<AtomLayout *> _gpAtom;
+ llvm::Optional<AtomLayout *> _gpDispAtom;
};
/// \brief Mips Runtime file.
More information about the llvm-commits
mailing list