<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>