[lld] r198788 - [Mips] Factor out the code determines type of GOT entry (local/global)

Simon Atanasyan simon at atanasyan.com
Wed Jan 8 12:42:45 PST 2014


Author: atanasyan
Date: Wed Jan  8 14:42:45 2014
New Revision: 198788

URL: http://llvm.org/viewvc/llvm-project?rev=198788&view=rev
Log:
[Mips] Factor out the code determines type of GOT entry (local/global)
into the separate function.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=198788&r1=198787&r2=198788&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Wed Jan  8 14:42:45 2014
@@ -122,30 +122,47 @@ private:
     const_cast<Reference &>(ref).setTarget(getGOTEntry(ref.target()));
   }
 
+  bool requireLocalGOT(const Atom *a) {
+    Atom::Scope scope;
+    if (isa<DefinedAtom>(a))
+      scope = dyn_cast<DefinedAtom>(a)->scope();
+    else if (isa<AbsoluteAtom>(a))
+      scope = dyn_cast<AbsoluteAtom>(a)->scope();
+    else
+      return false;
+
+    // Local and hidden symbols must be local.
+    if (scope == Atom::scopeTranslationUnit ||
+        scope == Atom::scopeLinkageUnit)
+      return true;
+
+    return false;
+  }
+
   const GOTAtom *getGOTEntry(const Atom *a) {
     auto got = _gotMap.find(a);
     if (got != _gotMap.end())
       return got->second;
 
-    const DefinedAtom *da = dyn_cast<DefinedAtom>(a);
-    bool isLocal = (da && da->scope() == Atom::scopeTranslationUnit);
-
     auto ga = new (_file._alloc) GOT0Atom(_file);
     _gotMap[a] = ga;
-    if (isLocal)
+
+    bool localGOT = requireLocalGOT(a);
+
+    if (localGOT)
       _localGotVector.push_back(ga);
     else {
-      if (da)
-        ga->addReferenceELF_Mips(R_MIPS_32, 0, a, 0);
-      else
-        ga->addReferenceELF_Mips(LLD_R_MIPS_GLOBAL_GOT, 0, a, 0);
       _globalGotVector.push_back(ga);
+      ga->addReferenceELF_Mips(LLD_R_MIPS_GLOBAL_GOT, 0, a, 0);
     }
 
+    if (const DefinedAtom *da = dyn_cast<DefinedAtom>(a))
+      ga->addReferenceELF_Mips(R_MIPS_32, 0, da, 0);
+
     DEBUG_WITH_TYPE("MipsGOT", {
       ga->_name = "__got_";
       ga->_name += a->name();
-      llvm::dbgs() << "[ GOT ] Create " << (isLocal ? "L " : "G ") << a->name()
+      llvm::dbgs() << "[ GOT ] Create " << (localGOT ? "L " : "G ") << a->name()
                    << "\n";
     });
 

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h?rev=198788&r1=198787&r2=198788&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h Wed Jan  8 14:42:45 2014
@@ -54,8 +54,7 @@ public:
       if (r->kindNamespace() != lld::Reference::KindNamespace::ELF)
         continue;
       assert(r->kindArch() == Reference::KindArch::Mips);
-      if (r->kindValue() == llvm::ELF::R_MIPS_32 ||
-          r->kindValue() == LLD_R_MIPS_GLOBAL_GOT) {
+      if (r->kindValue() == LLD_R_MIPS_GLOBAL_GOT) {
         ta = r->target();
         break;
       }





More information about the llvm-commits mailing list