<div dir="ltr">LGTM. Thank you for doing this!</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 16, 2013 at 9:19 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: shankare<br>
Date: Thu May 16 23:19:53 2013<br>
New Revision: 182076<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=182076&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=182076&view=rev</a><br>
Log:<br>
[lld][ELF][X86_64] Reorganize X86_64 Target specific code<br>
<br>
This patch splits X86_64Target specific code so that<br>
the dynamic atoms and the Relocation handlers are in seperate<br>
files for easier maintenace. The files are sure to grow and this<br>
makes it easier to work with.<br>
<br>
* There is no change in functionality *<br>
<br>
Added:<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h<br>
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt?rev=182076&r1=182075&r2=182076&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt?rev=182076&r1=182075&r2=182076&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/CMakeLists.txt Thu May 16 23:19:53 2013<br>
@@ -1,6 +1,7 @@<br>
 add_lld_library(lldX86_64ELFTarget<br>
   X86_64TargetInfo.cpp<br>
   X86_64TargetHandler.cpp<br>
+  X86_64RelocationHandler.cpp<br>
   )<br>
<br>
 target_link_libraries(lldX86_64ELFTarget<br>
<br>
Added: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h?rev=182076&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h?rev=182076&view=auto</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h (added)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h Thu May 16 23:19:53 2013<br>
@@ -0,0 +1,73 @@<br>
+//===- lib/ReaderWriter/ELF/X86_64/X86_64DynamicAtoms.h -------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef X86_64_DYNAMIC_ATOMS_H<br>
+#define X86_64_DYNAMIC_ATOMS_H<br>
+<br>
+#include "Atoms.h"<br>
+#include "X86_64TargetInfo.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+class X86_64GOTAtom : public GOTAtom {<br>
+  static const uint8_t _defaultContent[8];<br>
+<br>
+public:<br>
+  X86_64GOTAtom(const File &f, StringRef secName) : GOTAtom(f, secName) {}<br>
+<br>
+  virtual ArrayRef<uint8_t> rawContent() const {<br>
+    return ArrayRef<uint8_t>(_defaultContent, 8);<br>
+  }<br>
+};<br>
+<br>
+const uint8_t X86_64GOTAtom::_defaultContent[8] = { 0 };<br>
+<br>
+class X86_64PLTAtom : public PLTAtom {<br>
+  static const uint8_t _defaultContent[16];<br>
+<br>
+public:<br>
+  X86_64PLTAtom(const File &f, StringRef secName) : PLTAtom(f, secName) {}<br>
+<br>
+  virtual ArrayRef<uint8_t> rawContent() const {<br>
+    return ArrayRef<uint8_t>(_defaultContent, 16);<br>
+  }<br>
+};<br>
+<br>
+const uint8_t X86_64PLTAtom::_defaultContent[16] = {<br>
+  0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *gotatom(%rip)<br>
+  0x68, 0x00, 0x00, 0x00, 0x00,       // pushq reloc-index<br>
+  0xe9, 0x00, 0x00, 0x00, 0x00        // jmpq plt[-1]<br>
+};<br>
+<br>
+class X86_64PLT0Atom : public PLT0Atom {<br>
+  static const uint8_t _plt0Content[16];<br>
+<br>
+public:<br>
+  X86_64PLT0Atom(const File &f) : PLT0Atom(f) {<br>
+#ifndef NDEBUG<br>
+    _name = ".PLT0";<br>
+#endif<br>
+  }<br>
+<br>
+  virtual ArrayRef<uint8_t> rawContent() const {<br>
+    return ArrayRef<uint8_t>(_plt0Content, 16);<br>
+  }<br>
+};<br>
+<br>
+const uint8_t X86_64PLT0Atom::_plt0Content[16] = {<br>
+  0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)<br>
+  0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)<br>
+  0x90, 0x90, 0x90, 0x90              // nopnopnop<br>
+};<br>
+<br>
+} // elf<br>
+} // lld<br>
+<br>
+#endif<br>
<br>
Added: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp?rev=182076&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp?rev=182076&view=auto</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp (added)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp Thu May 16 23:19:53 2013<br>
@@ -0,0 +1,146 @@<br>
+//===- lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.cpp ------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "X86_64TargetHandler.h"<br>
+#include "X86_64TargetInfo.h"<br>
+<br>
+using namespace lld;<br>
+using namespace elf;<br>
+<br>
+namespace {<br>
+/// \brief R_X86_64_64 - word64: S + A<br>
+void reloc64(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
+  uint64_t result = S + A;<br>
+  *reinterpret_cast<llvm::support::ulittle64_t *>(location) =<br>
+      result |<br>
+      (uint64_t) * reinterpret_cast<llvm::support::ulittle64_t *>(location);<br>
+}<br>
+<br>
+/// \brief R_X86_64_PC32 - word32: S + A - P<br>
+void relocPC32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
+  uint32_t result = (uint32_t)((S + A) - P);<br>
+  *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+      result +<br>
+      (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+}<br>
+<br>
+/// \brief R_X86_64_32 - word32:  S + A<br>
+void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
+  int32_t result = (uint32_t)(S + A);<br>
+  *reinterpret_cast<llvm::support::ulittle32_t *>(location) =<br>
+      result |<br>
+      (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
+  // TODO: Make sure that the result zero extends to the 64bit value.<br>
+}<br>
+<br>
+/// \brief R_X86_64_32S - word32:  S + A<br>
+void reloc32S(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
+  int32_t result = (int32_t)(S + A);<br>
+  *reinterpret_cast<llvm::support::little32_t *>(location) =<br>
+      result |<br>
+      (int32_t) * reinterpret_cast<llvm::support::little32_t *>(location);<br>
+  // TODO: Make sure that the result sign extends to the 64bit value.<br>
+}<br>
+} // end anon namespace<br>
+<br>
+int64_t X86_64TargetRelocationHandler::relocAddend(const Reference &ref) const {<br>
+  switch (ref.kind()) {<br>
+  case R_X86_64_PC32:<br>
+    return 4;<br>
+  default:<br>
+    return 0;<br>
+  }<br>
+  return 0;<br>
+}<br>
+<br>
+ErrorOr<void> X86_64TargetRelocationHandler::applyRelocation(<br>
+    ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout &atom,<br>
+    const Reference &ref) const {<br>
+  uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;<br>
+  uint8_t *location = atomContent + ref.offsetInAtom();<br>
+  uint64_t targetVAddress = writer.addressOfAtom(ref.target());<br>
+  uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom();<br>
+<br>
+  switch (ref.kind()) {<br>
+  case R_X86_64_NONE:<br>
+    break;<br>
+  case R_X86_64_64:<br>
+    reloc64(location, relocVAddress, targetVAddress, ref.addend());<br>
+    break;<br>
+  case R_X86_64_PC32:<br>
+    relocPC32(location, relocVAddress, targetVAddress, ref.addend());<br>
+    break;<br>
+  case R_X86_64_32:<br>
+    reloc32(location, relocVAddress, targetVAddress, ref.addend());<br>
+    break;<br>
+  case R_X86_64_32S:<br>
+    reloc32S(location, relocVAddress, targetVAddress, ref.addend());<br>
+    break;<br>
+  case R_X86_64_TPOFF64:<br>
+  case R_X86_64_DTPOFF32:<br>
+  case R_X86_64_TPOFF32: {<br>
+    _tlsSize = _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()<br>
+        .getTLSSize();<br>
+    if (ref.kind() == R_X86_64_TPOFF32 || ref.kind() == R_X86_64_DTPOFF32) {<br>
+      int32_t result = (int32_t)(targetVAddress - _tlsSize);<br>
+      *reinterpret_cast<llvm::support::little32_t *>(location) = result;<br>
+    } else {<br>
+      int64_t result = (int64_t)(targetVAddress - _tlsSize);<br>
+      *reinterpret_cast<llvm::support::little64_t *>(location) = result;<br>
+    }<br>
+    break;<br>
+  }<br>
+  case R_X86_64_TLSLD: {<br>
+    // Rewrite to move %fs:0 into %rax. Technically we should verify that the<br>
+    // next relocation is a PC32 to __tls_get_addr...<br>
+    static uint8_t instr[] = { 0x66, 0x66, 0x66, 0x64, 0x48, 0x8b, 0x04, 0x25,<br>
+                               0x00, 0x00, 0x00, 0x00 };<br>
+    std::memcpy(location - 3, instr, sizeof(instr));<br>
+    break;<br>
+  }<br>
+  case LLD_R_X86_64_GOTRELINDEX: {<br>
+    const DefinedAtom *target = cast<const DefinedAtom>(ref.target());<br>
+    for (const Reference *r : *target) {<br>
+      if (r->kind() == R_X86_64_JUMP_SLOT) {<br>
+        uint32_t index;<br>
+        if (!_targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()<br>
+                .getPLTRelocationTable()->getRelocationIndex(*r, index))<br>
+          llvm_unreachable("Relocation doesn't exist");<br>
+        reloc32(location, 0, index, 0);<br>
+        break;<br>
+      }<br>
+    }<br>
+    break;<br>
+  }<br>
+  // Runtime only relocations. Ignore here.<br>
+  case R_X86_64_RELATIVE:<br>
+  case R_X86_64_IRELATIVE:<br>
+  case R_X86_64_JUMP_SLOT:<br>
+  case R_X86_64_GLOB_DAT:<br>
+    break;<br>
+<br>
+  case lld::Reference::kindLayoutAfter:<br>
+  case lld::Reference::kindLayoutBefore:<br>
+  case lld::Reference::kindInGroup:<br>
+    break;<br>
+<br>
+  default: {<br>
+    std::string str;<br>
+    llvm::raw_string_ostream s(str);<br>
+    auto name = _targetInfo.stringFromRelocKind(ref.kind());<br>
+    s << "Unhandled relocation: " << atom._atom->file().path() << ":"<br>
+      << atom._atom->name() << "@" << ref.offsetInAtom() << " "<br>
+      << (name ? *name : "<unknown>") << " (" << ref.kind() << ")";<br>
+    s.flush();<br>
+    llvm_unreachable(str.c_str());<br>
+  }<br>
+  }<br>
+<br>
+  return error_code::success();<br>
+}<br>
<br>
Added: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h?rev=182076&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h?rev=182076&view=auto</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h (added)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h Thu May 16 23:19:53 2013<br>
@@ -0,0 +1,42 @@<br>
+//===- lib/ReaderWriter/ELF/X86_64/X86_64RelocationHandler.h<br>
+//------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef X86_64_RELOCATION_HANDLER_H<br>
+#define X86_64_RELOCATION_HANDLER_H<br>
+<br>
+#include "X86_64TargetHandler.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+typedef llvm::object::ELFType<llvm::support::little, 8, true> X86_64ELFType;<br>
+class X86_64TargetInfo;<br>
+<br>
+class X86_64TargetRelocationHandler LLVM_FINAL<br>
+    : public TargetRelocationHandler<X86_64ELFType> {<br>
+public:<br>
+  X86_64TargetRelocationHandler(const X86_64TargetInfo &ti)<br>
+      : _tlsSize(0), _targetInfo(ti) {}<br>
+<br>
+  virtual ErrorOr<void> applyRelocation(ELFWriter &, llvm::FileOutputBuffer &,<br>
+                                        const AtomLayout &,<br>
+                                        const Reference &) const;<br>
+<br>
+  virtual int64_t relocAddend(const Reference &) const;<br>
+<br>
+private:<br>
+  // Cached size of the TLS segment.<br>
+  mutable uint64_t _tlsSize;<br>
+  const X86_64TargetInfo &_targetInfo;<br>
+};<br>
+<br>
+} // end namespace elf<br>
+} // end namespace lld<br>
+<br>
+#endif<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp?rev=182076&r1=182075&r2=182076&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp?rev=182076&r1=182075&r2=182076&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp Thu May 16 23:19:53 2013<br>
@@ -14,140 +14,10 @@<br>
 using namespace lld;<br>
 using namespace elf;<br>
<br>
-using namespace llvm::ELF;<br>
-<br>
 X86_64TargetHandler::X86_64TargetHandler(X86_64TargetInfo &targetInfo)<br>
     : DefaultTargetHandler(targetInfo), _gotFile(targetInfo),<br>
       _relocationHandler(targetInfo), _targetLayout(targetInfo) {}<br>
<br>
-namespace {<br>
-/// \brief R_X86_64_64 - word64: S + A<br>
-void reloc64(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
-  uint64_t result = S + A;<br>
-  *reinterpret_cast<llvm::support::ulittle64_t *>(location) = result |<br>
-            (uint64_t)*reinterpret_cast<llvm::support::ulittle64_t *>(location);<br>
-}<br>
-<br>
-/// \brief R_X86_64_PC32 - word32: S + A - P<br>
-void relocPC32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
-  uint32_t result = (uint32_t)((S + A) - P);<br>
-  *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result +<br>
-            (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
-}<br>
-<br>
-/// \brief R_X86_64_32 - word32:  S + A<br>
-void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
-  int32_t result = (uint32_t)(S + A);<br>
-  *reinterpret_cast<llvm::support::ulittle32_t *>(location) = result |<br>
-            (uint32_t)*reinterpret_cast<llvm::support::ulittle32_t *>(location);<br>
-  // TODO: Make sure that the result zero extends to the 64bit value.<br>
-}<br>
-<br>
-/// \brief R_X86_64_32S - word32:  S + A<br>
-void reloc32S(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {<br>
-  int32_t result = (int32_t)(S + A);<br>
-  *reinterpret_cast<llvm::support::little32_t *>(location) = result |<br>
-            (int32_t)*reinterpret_cast<llvm::support::little32_t *>(location);<br>
-  // TODO: Make sure that the result sign extends to the 64bit value.<br>
-}<br>
-} // end anon namespace<br>
-<br>
-int64_t X86_64TargetRelocationHandler::relocAddend(const Reference &ref) const {<br>
-  switch (ref.kind()) {<br>
-  case R_X86_64_PC32:<br>
-    return 4;<br>
-  default:<br>
-    return 0;<br>
-  }<br>
-  return 0;<br>
-}<br>
-<br>
-ErrorOr<void> X86_64TargetRelocationHandler::applyRelocation(<br>
-    ELFWriter &writer, llvm::FileOutputBuffer &buf, const AtomLayout &atom,<br>
-    const Reference &ref) const {<br>
-  uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;<br>
-  uint8_t *location = atomContent + ref.offsetInAtom();<br>
-  uint64_t targetVAddress = writer.addressOfAtom(ref.target());<br>
-  uint64_t relocVAddress = atom._virtualAddr + ref.offsetInAtom();<br>
-<br>
-  switch (ref.kind()) {<br>
-  case R_X86_64_NONE:<br>
-    break;<br>
-  case R_X86_64_64:<br>
-    reloc64(location, relocVAddress, targetVAddress, ref.addend());<br>
-    break;<br>
-  case R_X86_64_PC32:<br>
-    relocPC32(location, relocVAddress, targetVAddress, ref.addend());<br>
-    break;<br>
-  case R_X86_64_32:<br>
-    reloc32(location, relocVAddress, targetVAddress, ref.addend());<br>
-    break;<br>
-  case R_X86_64_32S:<br>
-    reloc32S(location, relocVAddress, targetVAddress, ref.addend());<br>
-    break;<br>
-  case R_X86_64_TPOFF64:<br>
-  case R_X86_64_DTPOFF32:<br>
-  case R_X86_64_TPOFF32: {<br>
-    _tlsSize = _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()<br>
-        .getTLSSize();<br>
-    if (ref.kind() == R_X86_64_TPOFF32 || ref.kind() == R_X86_64_DTPOFF32) {<br>
-      int32_t result = (int32_t)(targetVAddress - _tlsSize);<br>
-      *reinterpret_cast<llvm::support::little32_t *>(location) = result;<br>
-    } else {<br>
-      int64_t result = (int64_t)(targetVAddress - _tlsSize);<br>
-      *reinterpret_cast<llvm::support::little64_t *>(location) = result;<br>
-    }<br>
-    break;<br>
-  }<br>
-  case R_X86_64_TLSLD: {<br>
-    // Rewrite to move %fs:0 into %rax. Technically we should verify that the<br>
-    // next relocation is a PC32 to __tls_get_addr...<br>
-    static uint8_t instr[] = { 0x66, 0x66, 0x66, 0x64, 0x48, 0x8b, 0x04, 0x25,<br>
-                               0x00, 0x00, 0x00, 0x00 };<br>
-    std::memcpy(location - 3, instr, sizeof(instr));<br>
-    break;<br>
-  }<br>
-  case LLD_R_X86_64_GOTRELINDEX: {<br>
-    const DefinedAtom *target = cast<const DefinedAtom>(ref.target());<br>
-    for (const Reference *r : *target) {<br>
-      if (r->kind() == R_X86_64_JUMP_SLOT) {<br>
-        uint32_t index;<br>
-        if (!_targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()<br>
-                .getPLTRelocationTable()->getRelocationIndex(*r, index))<br>
-          llvm_unreachable("Relocation doesn't exist");<br>
-        reloc32(location, 0, index, 0);<br>
-        break;<br>
-      }<br>
-    }<br>
-    break;<br>
-  }<br>
-  // Runtime only relocations. Ignore here.<br>
-  case R_X86_64_RELATIVE:<br>
-  case R_X86_64_IRELATIVE:<br>
-  case R_X86_64_JUMP_SLOT:<br>
-  case R_X86_64_GLOB_DAT:<br>
-    break;<br>
-<br>
-  case lld::Reference::kindLayoutAfter:<br>
-  case lld::Reference::kindLayoutBefore:<br>
-  case lld::Reference::kindInGroup:<br>
-    break;<br>
-<br>
-  default : {<br>
-    std::string str;<br>
-    llvm::raw_string_ostream s(str);<br>
-    auto name = _targetInfo.stringFromRelocKind(ref.kind());<br>
-    s << "Unhandled relocation: " << atom._atom->file().path() << ":"<br>
-      << atom._atom->name() << "@" << ref.offsetInAtom() << " "<br>
-      << (name ? *name : "<unknown>") << " (" << ref.kind() << ")";<br>
-    s.flush();<br>
-    llvm_unreachable(str.c_str());<br>
-  }<br>
-  }<br>
-<br>
-  return error_code::success();<br>
-}<br>
-<br>
 void X86_64TargetHandler::addFiles(InputFiles &f) {<br>
   _gotFile.addAtom(*new (_gotFile._alloc) GLOBAL_OFFSET_TABLEAtom(_gotFile));<br>
   _gotFile.addAtom(*new (_gotFile._alloc) TLSGETADDRAtom(_gotFile));<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h?rev=182076&r1=182075&r2=182076&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h?rev=182076&r1=182075&r2=182076&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h Thu May 16 23:19:53 2013<br>
@@ -11,6 +11,7 @@<br>
 #define LLD_READER_WRITER_ELF_X86_64_TARGET_HANDLER_H<br>
<br>
 #include "DefaultTargetHandler.h"<br>
+#include "X86_64RelocationHandler.h"<br>
 #include "TargetLayout.h"<br>
<br>
 #include "lld/ReaderWriter/Simple.h"<br>
@@ -20,24 +21,6 @@ namespace elf {<br>
 typedef llvm::object::ELFType<llvm::support::little, 8, true> X86_64ELFType;<br>
 class X86_64TargetInfo;<br>
<br>
-class X86_64TargetRelocationHandler LLVM_FINAL<br>
-    : public TargetRelocationHandler<X86_64ELFType> {<br>
-public:<br>
-  X86_64TargetRelocationHandler(const X86_64TargetInfo &ti)<br>
-      : _tlsSize(0), _targetInfo(ti) {}<br>
-<br>
-  virtual ErrorOr<void><br>
-  applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, const AtomLayout &,<br>
-                  const Reference &)const;<br>
-<br>
-  virtual int64_t relocAddend(const Reference &)const;<br>
-<br>
-private:<br>
-  // Cached size of the TLS segment.<br>
-  mutable uint64_t _tlsSize;<br>
-  const X86_64TargetInfo &_targetInfo;<br>
-};<br>
-<br>
 class X86_64TargetHandler LLVM_FINAL<br>
     : public DefaultTargetHandler<X86_64ELFType> {<br>
 public:<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp?rev=182076&r1=182075&r2=182076&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp?rev=182076&r1=182075&r2=182076&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp Thu May 16 23:19:53 2013<br>
@@ -7,7 +7,7 @@<br>
 //<br>
 //===----------------------------------------------------------------------===//<br>
<br>
-#include "Atoms.h"<br>
+#include "X86_64DynamicAtoms.h"<br>
 #include "X86_64TargetInfo.h"<br>
<br>
 #include "lld/Core/File.h"<br>
@@ -25,61 +25,6 @@ using namespace lld::elf;<br>
 namespace {<br>
 using namespace llvm::ELF;<br>
<br>
-class X86_64GOTAtom : public GOTAtom {<br>
-  static const uint8_t _defaultContent[8];<br>
-<br>
-public:<br>
-  X86_64GOTAtom(const File &f, StringRef secName)<br>
-      : GOTAtom(f, secName) {<br>
-  }<br>
-<br>
-  virtual ArrayRef<uint8_t> rawContent() const {<br>
-    return ArrayRef<uint8_t>(_defaultContent, 8);<br>
-  }<br>
-};<br>
-<br>
-const uint8_t X86_64GOTAtom::_defaultContent[8] = { 0 };<br>
-<br>
-class X86_64PLTAtom : public PLTAtom {<br>
-  static const uint8_t _defaultContent[16];<br>
-<br>
-public:<br>
-  X86_64PLTAtom(const File &f, StringRef secName)<br>
-      : PLTAtom(f, secName) {<br>
-  }<br>
-<br>
-  virtual ArrayRef<uint8_t> rawContent() const {<br>
-    return ArrayRef<uint8_t>(_defaultContent, 16);<br>
-  }<br>
-};<br>
-<br>
-const uint8_t X86_64PLTAtom::_defaultContent[16] = {<br>
-  0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *gotatom(%rip)<br>
-  0x68, 0x00, 0x00, 0x00, 0x00,       // pushq reloc-index<br>
-  0xe9, 0x00, 0x00, 0x00, 0x00        // jmpq plt[-1]<br>
-};<br>
-<br>
-class X86_64PLT0Atom : public PLT0Atom {<br>
-  static const uint8_t _plt0Content[16];<br>
-<br>
-public:<br>
-  X86_64PLT0Atom(const File &f) : PLT0Atom(f) {<br>
-#ifndef NDEBUG<br>
-    _name = ".PLT0";<br>
-#endif<br>
-  }<br>
-<br>
-  virtual ArrayRef<uint8_t> rawContent() const {<br>
-    return ArrayRef<uint8_t>(_plt0Content, 16);<br>
-  }<br>
-};<br>
-<br>
-const uint8_t X86_64PLT0Atom::_plt0Content[16] = {<br>
-  0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)<br>
-  0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)<br>
-  0x90, 0x90, 0x90, 0x90        // nopnopnop<br>
-};<br>
-<br>
 class ELFPassFile : public SimpleFile {<br>
 public:<br>
   ELFPassFile(const ELFTargetInfo &eti) : SimpleFile(eti, "ELFPassFile") {}<br>
@@ -420,7 +365,7 @@ void elf::X86_64TargetInfo::addPasses(Pa<br>
<br>
 #define LLD_CASE(name) .Case(#name, llvm::ELF::name)<br>
<br>
-ErrorOr<Reference::Kind><br>
+ErrorOr<Reference::Kind><br>
 elf::X86_64TargetInfo::relocKindFromString(StringRef str) const {<br>
   int32_t ret = llvm::StringSwitch<int32_t>(str)<br>
     LLD_CASE(R_X86_64_NONE)<br>
@@ -473,7 +418,7 @@ elf::X86_64TargetInfo::relocKindFromStri<br>
<br>
 #define LLD_CASE(name) case llvm::ELF::name: return std::string(#name);<br>
<br>
-ErrorOr<std::string><br>
+ErrorOr<std::string><br>
 elf::X86_64TargetInfo::stringFromRelocKind(Reference::Kind kind) const {<br>
   switch (kind) {<br>
   LLD_CASE(R_X86_64_NONE)<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>