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