<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 8, 2014 at 12:42 PM, Simon Atanasyan <span dir="ltr"><<a href="mailto:simon@atanasyan.com" target="_blank">simon@atanasyan.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atanasyan<br>
Date: Wed Jan  8 14:42:45 2014<br>
New Revision: 198788<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=198788&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=198788&view=rev</a><br>
Log:<br>
[Mips] Factor out the code determines type of GOT entry (local/global)<br>
into the separate function.<br>
<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=198788&r1=198787&r2=198788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=198788&r1=198787&r2=198788&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Wed Jan  8 14:42:45 2014<br>
@@ -122,30 +122,47 @@ private:<br>
     const_cast<Reference &>(ref).setTarget(getGOTEntry(ref.target()));<br>
   }<br>
<br>
+  bool requireLocalGOT(const Atom *a) {<br>
+    Atom::Scope scope;<br>
+    if (isa<DefinedAtom>(a))<br>
+      scope = dyn_cast<DefinedAtom>(a)->scope();<br>
+    else if (isa<AbsoluteAtom>(a))<br>
+      scope = dyn_cast<AbsoluteAtom>(a)->scope();<br>
+    else<br>
+      return false;<br></blockquote><div><br></div><div>dyn_cast calls isa, so isa is called twice in each expression. Probably </div><div><br></div><div> if (auto *def = dyn_cast<DefinedAtom>(a))</div><div>   scope = def->scope();</div>

<div> else if (auto *abs = dyn_cast<AbsoluteAtom>(a))</div><div>   ...</div><div><br></div><div>would be a bit better?</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


+<br>
+    // Local and hidden symbols must be local.<br>
+    if (scope == Atom::scopeTranslationUnit ||<br>
+        scope == Atom::scopeLinkageUnit)<br>
+      return true;<br>
+<br>
+    return false;<br>
+  }<br>
+<br>
   const GOTAtom *getGOTEntry(const Atom *a) {<br>
     auto got = _gotMap.find(a);<br>
     if (got != _gotMap.end())<br>
       return got->second;<br>
<br>
-    const DefinedAtom *da = dyn_cast<DefinedAtom>(a);<br>
-    bool isLocal = (da && da->scope() == Atom::scopeTranslationUnit);<br>
-<br>
     auto ga = new (_file._alloc) GOT0Atom(_file);<br>
     _gotMap[a] = ga;<br>
-    if (isLocal)<br>
+<br>
+    bool localGOT = requireLocalGOT(a);<br>
+<br>
+    if (localGOT)<br>
       _localGotVector.push_back(ga);<br>
     else {<br>
-      if (da)<br>
-        ga->addReferenceELF_Mips(R_MIPS_32, 0, a, 0);<br>
-      else<br>
-        ga->addReferenceELF_Mips(LLD_R_MIPS_GLOBAL_GOT, 0, a, 0);<br>
       _globalGotVector.push_back(ga);<br>
+      ga->addReferenceELF_Mips(LLD_R_MIPS_GLOBAL_GOT, 0, a, 0);<br>
     }<br>
<br>
+    if (const DefinedAtom *da = dyn_cast<DefinedAtom>(a))<br>
+      ga->addReferenceELF_Mips(R_MIPS_32, 0, da, 0);<br>
+<br>
     DEBUG_WITH_TYPE("MipsGOT", {<br>
       ga->_name = "__got_";<br>
       ga->_name += a->name();<br>
-      llvm::dbgs() << "[ GOT ] Create " << (isLocal ? "L " : "G ") << a->name()<br>
+      llvm::dbgs() << "[ GOT ] Create " << (localGOT ? "L " : "G ") << a->name()<br>
                    << "\n";<br>
     });<br>
<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h?rev=198788&r1=198787&r2=198788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h?rev=198788&r1=198787&r2=198788&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h Wed Jan  8 14:42:45 2014<br>
@@ -54,8 +54,7 @@ public:<br>
       if (r->kindNamespace() != lld::Reference::KindNamespace::ELF)<br>
         continue;<br>
       assert(r->kindArch() == Reference::KindArch::Mips);<br>
-      if (r->kindValue() == llvm::ELF::R_MIPS_32 ||<br>
-          r->kindValue() == LLD_R_MIPS_GLOBAL_GOT) {<br>
+      if (r->kindValue() == LLD_R_MIPS_GLOBAL_GOT) {<br>
         ta = r->target();<br>
         break;<br>
       }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>