<div dir="ltr">On Tue, Mar 19, 2013 at 10:10 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: shankare<br>
Date: Wed Mar 20 00:10:02 2013<br>
New Revision: 177484<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=177484&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=177484&view=rev</a><br>
Log:<br>
[ELF][Hexagon] Add Hexagon dynamic relocations<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp<br>
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp<br>
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=177484&r1=177483&r2=177484&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=177484&r1=177483&r2=177484&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp Wed Mar 20 00:10:02 2013<br>
@@ -131,6 +131,81 @@ int relocHexGPRELN(uint8_t *location, ui<br>
}<br>
return 1;<br>
}<br>
+<br>
+/// \brief Word32_LO: 0x00c03fff : (G) : Truncate<br>
+int relocHexGOTLO16(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G);<br>
+ result = lld::scatterBits<int32_t>(result, 0x00c03fff);<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+}<br>
+<br>
+/// \brief Word32_LO: 0x00c03fff : (G) >> 16 : Truncate<br>
+int relocHexGOTHI16(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G >> 16);<br>
+ result = lld::scatterBits<int32_t>(result, 0x00c03fff);<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+}<br>
+<br>
+/// \brief Word32: 0xffffffff : (G) : Truncate<br>
+int relocHexGOT32(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G);<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+}<br>
+<br>
+/// \brief Word32_U16 : (G) : Truncate<br>
+int relocHexGOT16(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G);<br>
+ uint32_t range = 1L << 16;<br>
+ if (result <= range) {<br>
+ result = lld::scatterBits<uint32_t>(result, FINDV4BITMASK(location));<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+ }<br>
+ return 1;<br>
+}<br>
+<br>
+int relocHexGOT32_6_X(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G >> 6);<br>
+ result = lld::scatterBits<uint32_t>(result, FINDV4BITMASK(location));<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+}<br>
+<br>
+int relocHexGOT16_X(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G);<br>
+ uint32_t range = 1L << 6;<br>
+ if (result <= range) {<br>
+ result = lld::scatterBits<uint32_t>(result, FINDV4BITMASK(location));<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+ }<br>
+ return 1;<br>
+}<br>
+<br>
+int relocHexGOT11_X(uint8_t *location, uint64_t G) {<br>
+ uint32_t result = (uint32_t)(G);<br>
+ result = lld::scatterBits<uint32_t>(result, FINDV4BITMASK(location));<br>
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+ result |<br>
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+ return 0;<br>
+}<br>
+<br>
} // end anon namespace<br>
<br>
ErrorOr<void> HexagonTargetRelocationHandler::applyRelocation(<br>
@@ -211,6 +286,28 @@ ErrorOr<void> HexagonTargetRelocationHan<br>
relocHex6PCRELX(location, relocVAddress, targetVAddress, ref.addend());<br>
break;<br>
case R_HEX_JMP_SLOT:<br>
+ case R_HEX_GLOB_DAT:<br>
+ break;<br>
+ case R_HEX_GOT_LO16:<br>
+ relocHexGOTLO16(location, targetVAddress);<br>
+ break;<br>
+ case R_HEX_GOT_HI16:<br>
+ relocHexGOTHI16(location, targetVAddress);<br>
+ break;<br>
+ case R_HEX_GOT_32:<br>
+ relocHexGOT32(location, targetVAddress);<br>
+ break;<br>
+ case R_HEX_GOT_16:<br>
+ relocHexGOT16(location, targetVAddress);<br>
+ break;<br>
+ case R_HEX_GOT_32_6_X:<br>
+ relocHexGOT32_6_X(location, targetVAddress);<br>
+ break;<br>
+ case R_HEX_GOT_16_X:<br>
+ relocHexGOT16_X(location, targetVAddress);<br>
+ break;<br>
+ case R_HEX_GOT_11_X:<br>
+ relocHexGOT11_X(location, targetVAddress);<br>
break;<br>
case lld::Reference::kindLayoutAfter:<br>
case lld::Reference::kindLayoutBefore:<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=177484&r1=177483&r2=177484&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=177484&r1=177483&r2=177484&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp Wed Mar 20 00:10:02 2013<br>
@@ -40,6 +40,13 @@ template <class Derived> class GOTPLTPas<br>
case R_HEX_PLT_B22_PCREL:<br>
static_cast<Derived *>(this)->handlePLT32(ref);<br>
break;<br>
+ case R_HEX_GOT_LO16:<br>
+ case R_HEX_GOT_HI16:<br>
+ case R_HEX_GOT_32_6_X:<br>
+ case R_HEX_GOT_16_X:<br>
+ case R_HEX_GOT_11_X:<br>
+ static_cast<Derived *>(this)->handleGOTREL(ref);<br>
+ break;<br>
}<br>
}<br>
<br>
@@ -124,20 +131,21 @@ protected:<br>
<br>
class DynamicGOTPLTPass LLVM_FINAL : public GOTPLTPass<DynamicGOTPLTPass> {<br>
public:<br>
- DynamicGOTPLTPass(const elf::HexagonTargetInfo &ti) : GOTPLTPass(ti) {}<br>
+ DynamicGOTPLTPass(const elf::HexagonTargetInfo &ti) : GOTPLTPass(ti) {<br>
+ // Fill in the null entry.<br>
+ getNullGOT();<br>
+ _got0 = new (_file._alloc) HexagonGOTAtom(_file, ".got.plt");<br>
+#ifndef NDEBUG<br>
+ _got0->_name = "__got0";<br>
+#endif<br>
+ }<br>
<br>
const PLT0Atom *getPLT0() {<br>
if (_PLT0)<br>
return _PLT0;<br>
- // Fill in the null entry.<br>
- getNullGOT();<br>
_PLT0 = new (_file._alloc) HexagonPLT0Atom(_file);<br>
- _got0 = new (_file._alloc) HexagonGOTAtom(_file, ".got.plt");<br>
_PLT0->addReference(R_HEX_B32_PCREL_X, 0, _got0, 0);<br>
_PLT0->addReference(R_HEX_6_PCREL_X, 4, _got0, 0);<br>
-#ifndef NDEBUG<br>
- _got0->_name = "__got0";<br>
-#endif<br>
DEBUG_WITH_TYPE("PLT", llvm::dbgs() << "[ PLT0/GOT0 ] "<br>
<< "Adding plt0/got0 \n");<br>
return _PLT0;<br>
@@ -171,6 +179,30 @@ public:<br>
return pa;<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>
+ auto ga = new (_file._alloc) HexagonGOTAtom(_file, ".got");<br>
+ ga->addReference(R_HEX_GLOB_DAT, 0, a, 0);<br>
+<br>
+#ifndef NDEBUG<br>
+ ga->_name = "__got_";<br>
+ ga->_name += a->name();<br>
+ DEBUG_WITH_TYPE("GOT", llvm::dbgs() << "[" << a->name() << "] "<br>
+ << "Adding got: " << ga->_name << "\n");<br>
+#endif<br>
+ _gotMap[a] = ga;<br>
+ _gotVector.push_back(ga);<br>
+ return ga;<br>
+ }<br>
+<br>
+ ErrorOr<void> handleGOTREL(const Reference &ref) {<br>
+ // Turn this so that the target is set to the GOT entry<br>
+ const_cast<Reference &>(ref).setTarget(getGOTEntry(ref.target()));<br>
+ return error_code::success();<br>
+ }<br>
+<br>
ErrorOr<void> handlePLT32(const Reference &ref) {<br>
// Turn this into a PC32 to the PLT entry.<br>
const_cast<Reference &>(ref).setKind(R_HEX_B22_PCREL);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=177484&r1=177483&r2=177484&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=177484&r1=177483&r2=177484&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Wed Mar 20 00:10:02 2013<br>
@@ -170,6 +170,8 @@ public:<br>
<br>
void addDefaultAtoms() {<br>
_hexagonRuntimeFile.addAbsoluteAtom("_SDA_BASE_");<br>
+ if (_targetInfo.isDynamic())<br>
+ _hexagonRuntimeFile.addAbsoluteAtom("_GLOBAL_OFFSET_TABLE_");<br>
}<br>
<br>
virtual void addFiles(InputFiles &inputFiles) {<br>
@@ -180,14 +182,27 @@ public:<br>
void finalizeSymbolValues() {<br>
auto sdabaseAtomIter = _targetLayout.findAbsoluteAtom("_SDA_BASE_");<br>
(*sdabaseAtomIter)->_virtualAddr =<br>
- _targetLayout.getSDataSection()->virtualAddr();<br>
+ _targetLayout.getSDataSection()->virtualAddr();<br>
+ if (_targetInfo.isDynamic()) {<br>
+ auto gotAtomIter =<br>
+ _targetLayout.findAbsoluteAtom("_GLOBAL_OFFSET_TABLE_");<br>
+ _gotSymAtom = (*gotAtomIter);<br>
+ auto gotpltSection = _targetLayout.findOutputSection(".got.plt");<br>
+ if (gotpltSection)<br>
+ _gotSymAtom->_virtualAddr = gotpltSection->virtualAddr();<br>
+ else<br>
+ _gotSymAtom->_virtualAddr = 0;<br>
+ }<br>
}<br>
<br>
+ uint64_t getGOTSymAddr() { return _gotSymAtom->_virtualAddr; }<br>
+<br>
private:<br>
HexagonTargetLayout<HexagonELFType> _targetLayout;<br>
HexagonTargetRelocationHandler _relocationHandler;<br>
HexagonTargetAtomHandler<HexagonELFType> _targetAtomHandler;<br>
HexagonRuntimeFile<HexagonELFType> _hexagonRuntimeFile;<br>
+ AtomLayout *_gotSymAtom;<br>
};<br>
} // end namespace elf<br>
} // end namespace lld<br></blockquote><div><br></div><div>Test?</div><div><br></div><div>- Michael Spencer<br></div><div> </div></div></div></div>