[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