<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Jan 26, 2014 at 6:30 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">Hi Hal,<br>
<br>
Thanks for your quick review!<br>
<br>
Agree, the description of the commit should have contained more information.<br>
<br>
Anyways, the details are :-<br>
<br>
a) The individual ELF sub targets could override the basic functionality of ELF writing from the generic layer<br>
<br>
What this amounts to is each ELF subtarget is in complete control of how the output ELF is written to by using the linker.<br>
<br>
As for the test, there was a bug in the code, that I saw.<br></blockquote><div><br></div><div>If you find a bug in code, please fix it in an independent commit, so that other people can easily understand what you are fixing.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Will be more careful next time.<br>
<br>
PS: The next few commits I plan are going to add more comments.<br>
<br>
Thanks<br>
<br>
Shankar Easwaran<br>
<br>
On 1/26/2014 8:20 PM, Hal Finkel wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
----- Original Message -----<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: "Shankar Easwaran" <<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>><br>
To: <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
Sent: Sunday, January 26, 2014 7:21:03 PM<br>
Subject: [lld] r200177 - [ELF] Make changes to all the targets supported        currently<br>
<br>
Author: shankare<br>
Date: Sun Jan 26 19:21:02 2014<br>
New Revision: 200177<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=200177&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=200177&view=rev</a><br>
Log:<br>
[ELF] Make changes to all the targets supported currently<br>
</blockquote>
"Make changes", seriously? ;) -- Can you please provide a more-verbose explanation of what you're doing.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
X86_64,X86,PPC,Hexagon,Mips<br>
<br>
No change in functionality.<br>
</blockquote>
One of the tests changed.<br>
<br>
  -Hal<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Added:<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCELFFile.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCELFReader.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64DynamicLibraryWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64ExecutableWriter.h<br>
Modified:<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/OutputELFWriter.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCTargetHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCTargetHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/SectionChunks.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/SegmentChunks.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/TargetHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86TargetHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86/X86TargetHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationHandler.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64TargetHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64TargetHandler.h<br>
     lld/trunk/test/elf/Hexagon/<u></u>dynlib-syms.test<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Chunk.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Chunk.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Chunk.h Sun Jan 26 19:21:02 2014<br>
@@ -27,6 +27,8 @@ class ELFLinkingContext;<br>
  namespace elf {<br>
  class ELFWriter;<br>
  +template <class ELFT> class TargetLayout;<br>
+<br>
  /// \brief A chunk is a contiguous region of space<br>
  template<class ELFT><br>
  class Chunk {<br>
@@ -73,7 +75,8 @@ public:<br>
    // Whats the contentType of the chunk ?<br>
    virtual int getContentType() const = 0;<br>
    // Writer the chunk<br>
-  virtual void write(ELFWriter *writer, llvm::FileOutputBuffer<br>
&buffer) = 0;<br>
+  virtual void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+                     llvm::FileOutputBuffer &buffer) = 0;<br>
    // Finalize the chunk before assigning offsets/virtual addresses<br>
    virtual void doPreFlight() = 0;<br>
    // Finalize the chunk before writing<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultTargetHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>DefaultTargetHandler.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/DefaultTargetHandler.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -29,49 +29,10 @@ public:<br>
    DefaultTargetHandler(<u></u>ELFLinkingContext &context)<br>
        : TargetHandler<ELFT>(context) {}<br>
  -  bool doesOverrideELFHeader() { return false; }<br>
-<br>
-  void setELFHeader(ELFHeader<ELFT> *elfHeader) {<br>
-    llvm_unreachable("Target should provide implementation for<br>
function ");<br>
-  }<br>
-<br>
    const TargetRelocationHandler<ELFT> &getRelocationHandler() const<br>
    {<br>
      llvm_unreachable("Target should provide implementation for<br>
      function ");<br>
    }<br>
  -  /// Create a set of Default target sections that a target might<br>
needj<br>
-  void createDefaultSections() {}<br>
-<br>
-  /// \brief Add a section to the current Layout<br>
-  void addSection(Section<ELFT> *section) {}<br>
-<br>
-  /// \brief add new symbol file<br>
-  bool createImplicitFiles(std::<u></u>vector<std::unique_ptr<File> > &) {<br>
-    return true;<br>
-  }<br>
-<br>
-  /// \brief Finalize the symbol values<br>
-  void finalizeSymbolValues() {}<br>
-<br>
-  /// \brief allocate Commons, some architectures may move small<br>
common<br>
-  /// symbols over to small data, this would also be used<br>
-  void allocateCommons() {}<br>
-<br>
-  /// \brief create dynamic table<br>
-  LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>) createDynamicTable() {<br>
-    return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)(<br>
-        new (_alloc) DynamicTable<ELFT>(<br>
-            this->_context, ".dynamic",<br>
DefaultLayout<ELFT>::ORDER_<u></u>DYNAMIC));<br>
-  }<br>
-<br>
-  /// \brief create dynamic symbol table<br>
-  LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
createDynamicSymbolTable() {<br>
-    return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)(<br>
-        new (_alloc) DynamicSymbolTable<ELFT>(<br>
-            this->_context, ".dynsym",<br>
-            DefaultLayout<ELFT>::ORDER_<u></u>DYNAMIC_SYMBOLS));<br>
-  }<br>
-<br>
    virtual std::unique_ptr<Reader> getObjReader(bool atomizeStrings)<br>
    {<br>
      return std::unique_ptr<Reader>(new<br>
      ELFObjectReader(<u></u>atomizeStrings));<br>
    }<br>
@@ -80,64 +41,9 @@ public:<br>
      return std::unique_ptr<Reader>(new<br>
      ELFDSOReader(<u></u>useShlibUndefines));<br>
    }<br>
  -  virtual std::unique_ptr<Writer> getWriter();<br>
-<br>
-protected:<br>
-  llvm::BumpPtrAllocator _alloc;<br>
+  virtual std::unique_ptr<Writer> getWriter() = 0;<br>
  };<br>
  -template <class ELFT><br>
-std::unique_ptr<Writer> DefaultTargetHandler<ELFT>::<u></u>getWriter() {<br>
-  switch (this->_context.<u></u>getOutputELFType()) {<br>
-  case llvm::ELF::ET_EXEC:<br>
-    if (this->_context.is64Bits()) {<br>
-      if (this->_context.<u></u>isLittleEndian())<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::ExecutableWriter<ELFType<<u></u>support::little, 8,<br>
true>>(<br>
-                this->_context));<br>
-      else<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::ExecutableWriter<ELFType<<u></u>support::big, 8,<br>
true>>(<br>
-                this->_context));<br>
-    } else {<br>
-      if (this->_context.<u></u>isLittleEndian())<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::ExecutableWriter<ELFType<<u></u>support::little, 4,<br>
false>>(<br>
-                this->_context));<br>
-      else<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::ExecutableWriter<ELFType<<u></u>support::big, 4,<br>
false>>(<br>
-                this->_context));<br>
-    }<br>
-    break;<br>
-  case llvm::ELF::ET_DYN:<br>
-    if (this->_context.is64Bits()) {<br>
-      if (this->_context.<u></u>isLittleEndian())<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::DynamicLibraryWriter<<u></u>ELFType<support::little,<br>
8, true>>(<br>
-                this->_context));<br>
-      else<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::DynamicLibraryWriter<<u></u>ELFType<support::big, 8,<br>
true>>(<br>
-                this->_context));<br>
-    } else {<br>
-      if (this->_context.<u></u>isLittleEndian())<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::DynamicLibraryWriter<<u></u>ELFType<support::little,<br>
4, false>>(<br>
-                this->_context));<br>
-      else<br>
-        return std::unique_ptr<Writer>(<br>
-            new elf::DynamicLibraryWriter<<u></u>ELFType<support::big, 4,<br>
false>>(<br>
-                this->_context));<br>
-    }<br>
-    break;<br>
-  case llvm::ELF::ET_REL:<br>
-    llvm_unreachable("TODO: support -r mode");<br>
-  default:<br>
-    llvm_unreachable("unsupported output type");<br>
-  }<br>
-}<br>
-<br>
  } // end namespace elf<br>
  } // end namespace lld<br>
  #endif<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DynamicLibraryWriter.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>DynamicLibraryWriter.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/DynamicLibraryWriter.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -25,17 +25,18 @@ class DynamicLibraryWriter;<br>
  template<class ELFT><br>
  class DynamicLibraryWriter : public OutputELFWriter<ELFT> {<br>
  public:<br>
-  DynamicLibraryWriter(const ELFLinkingContext &context)<br>
-      : OutputELFWriter<ELFT>(context)<u></u>,<br>
+  DynamicLibraryWriter(const ELFLinkingContext &context,<br>
+                       TargetLayout<ELFT> &layout)<br>
+      : OutputELFWriter<ELFT>(context, layout),<br>
          _runtimeFile(new CRuntimeFile<ELFT>(context)) {}<br>
  -private:<br>
-  void buildDynamicSymbolTable(const File &file);<br>
-  void addDefaultAtoms();<br>
+protected:<br>
+  virtual void buildDynamicSymbolTable(const File &file);<br>
+  virtual void addDefaultAtoms();<br>
    virtual bool createImplicitFiles(std::<u></u>vector<std::unique_ptr<File><br>
    > &);<br>
-  void finalizeDefaultAtomValues();<br>
+  virtual void finalizeDefaultAtomValues();<br>
  -  llvm::BumpPtrAllocator _alloc;<br>
+protected:<br>
    std::unique_ptr<CRuntimeFile<<u></u>ELFT> > _runtimeFile;<br>
  };<br>
  @@ -47,7 +48,7 @@ void DynamicLibraryWriter<ELFT>::<u></u>buildDy<br>
    // Add all the defined symbols to the dynamic symbol table<br>
    // we need hooks into the Atom to find out which atoms need<br>
    // to be exported<br>
-  for (auto sec : this->_layout->sections())<br>
+  for (auto sec : this->_layout.sections())<br>
      if (auto section = dyn_cast<AtomSection<ELFT>>(<u></u>sec))<br>
        for (const auto &atom : section->atoms()) {<br>
          const DefinedAtom *da = dyn_cast<const<br>
          DefinedAtom>(atom->_atom);<br>
@@ -71,7 +72,7 @@ template <class ELFT><br>
  bool DynamicLibraryWriter<ELFT>::<u></u>createImplicitFiles(<br>
      std::vector<std::unique_ptr<<u></u>File> > &result) {<br>
    // Add the default atoms as defined by executables<br>
-  addDefaultAtoms();<br>
+  DynamicLibraryWriter<ELFT>::<u></u>addDefaultAtoms();<br>
    OutputELFWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
    result.push_back(std::move(_<u></u>runtimeFile));<br>
    return true;<br>
@@ -79,17 +80,15 @@ bool DynamicLibraryWriter<ELFT>::<u></u>createI<br>
    template <class ELFT><br>
  void DynamicLibraryWriter<ELFT>::<u></u>finalizeDefaultAtomValues() {<br>
-  auto underScoreEndAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("_end");<br>
+  auto underScoreEndAtomIter =<br>
this->_layout.<u></u>findAbsoluteAtom("_end");<br>
  -  if (auto bssSection = this->_layout-><u></u>findOutputSection(".bss")) {<br>
+  if (auto bssSection = this->_layout.<u></u>findOutputSection(".bss")) {<br>
      (*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
          bssSection->virtualAddr() + bssSection->memSize();<br>
-  } else if (auto dataSection =<br>
this->_layout-><u></u>findOutputSection(".data")) {<br>
+  } else if (auto dataSection =<br>
this->_layout.<u></u>findOutputSection(".data")) {<br>
      (*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
          dataSection->virtualAddr() + dataSection->memSize();<br>
    }<br>
-<br>
-  this->_targetHandler.<u></u>finalizeSymbolValues();<br>
  }<br>
    } // namespace elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ExecutableWriter.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>ExecutableWriter.h?rev=200177&<u></u>r1=200176&r2=200177&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ExecutableWriter.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -25,11 +25,11 @@ class ExecutableWriter;<br>
  template<class ELFT><br>
  class ExecutableWriter : public OutputELFWriter<ELFT> {<br>
  public:<br>
-  ExecutableWriter(const ELFLinkingContext &context)<br>
-      : OutputELFWriter<ELFT>(context)<u></u>,<br>
+  ExecutableWriter(const ELFLinkingContext &context,<br>
TargetLayout<ELFT> &layout)<br>
+      : OutputELFWriter<ELFT>(context, layout),<br>
          _runtimeFile(new CRuntimeFile<ELFT>(context)) {}<br>
  -private:<br>
+protected:<br>
    virtual void addDefaultAtoms();<br>
    virtual bool createImplicitFiles(std::<u></u>vector<std::unique_ptr<File><br>
    > &);<br>
    virtual void finalizeDefaultAtomValues();<br>
@@ -71,7 +71,7 @@ template <class ELFT><br>
  bool ExecutableWriter<ELFT>::<u></u>createImplicitFiles(<br>
      std::vector<std::unique_ptr<<u></u>File> > &result) {<br>
    // Add the default atoms as defined by executables<br>
-  addDefaultAtoms();<br>
+  ExecutableWriter<ELFT>::<u></u>addDefaultAtoms();<br>
    OutputELFWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
    result.push_back(std::move(_<u></u>runtimeFile));<br>
    return true;<br>
@@ -83,17 +83,17 @@ template <class ELFT> void ExecutableWri<br>
      _interpSection.reset(new (this->_alloc) InterpSection<ELFT>(<br>
          this->_context, ".interp",<br>
          DefaultLayout<ELFT>::ORDER_<u></u>INTERP,<br>
          this->_context.getInterpreter(<u></u>)));<br>
-    this->_layout->addSection(_<u></u>interpSection.get());<br>
+    this->_layout.addSection(_<u></u>interpSection.get());<br>
    }<br>
  }<br>
    /// Finalize the value of all the absolute symbols that we<br>
  /// created<br>
  template <class ELFT> void<br>
  ExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues() {<br>
-  auto bssStartAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("__bss_start"<u></u>);<br>
-  auto bssEndAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("__bss_end");<br>
-  auto underScoreEndAtomIter =<br>
this->_layout-><u></u>findAbsoluteAtom("_end");<br>
-  auto endAtomIter = this->_layout-><u></u>findAbsoluteAtom("end");<br>
+  auto bssStartAtomIter =<br>
this->_layout.<u></u>findAbsoluteAtom("__bss_start"<u></u>);<br>
+  auto bssEndAtomIter = this->_layout.<u></u>findAbsoluteAtom("__bss_end");<br>
+  auto underScoreEndAtomIter =<br>
this->_layout.<u></u>findAbsoluteAtom("_end");<br>
+  auto endAtomIter = this->_layout.<u></u>findAbsoluteAtom("end");<br>
      auto startEnd = [&](StringRef sym, StringRef sec) -> void {<br>
      // TODO: This looks like a good place to use Twine...<br>
@@ -102,9 +102,9 @@ template <class ELFT> void ExecutableWri<br>
      start += "_start";<br>
      end += sym;<br>
      end += "_end";<br>
-    auto s = this->_layout-><u></u>findAbsoluteAtom(start);<br>
-    auto e = this->_layout-><u></u>findAbsoluteAtom(end);<br>
-    auto section = this->_layout-><u></u>findOutputSection(sec);<br>
+    auto s = this->_layout.<u></u>findAbsoluteAtom(start);<br>
+    auto e = this->_layout.<u></u>findAbsoluteAtom(end);<br>
+    auto section = this->_layout.<u></u>findOutputSection(sec);<br>
      if (section) {<br>
        (*s)->_virtualAddr = section->virtualAddr();<br>
        (*e)->_virtualAddr = section->virtualAddr() +<br>
        section->memSize();<br>
@@ -122,13 +122,13 @@ template <class ELFT> void ExecutableWri<br>
      startEnd("rel_iplt", ".rel.plt");<br>
    startEnd("fini_array", ".fini_array");<br>
  -  assert(!(bssStartAtomIter == this->_layout->absoluteAtoms()<u></u>.end()<br>
||<br>
-           bssEndAtomIter == this->_layout->absoluteAtoms()<u></u>.end() ||<br>
-           underScoreEndAtomIter ==<br>
this->_layout->absoluteAtoms()<u></u>.end() ||<br>
-           endAtomIter == this->_layout->absoluteAtoms()<u></u>.end()) &&<br>
+  assert(!(bssStartAtomIter == this->_layout.absoluteAtoms().<u></u>end()<br>
||<br>
+           bssEndAtomIter == this->_layout.absoluteAtoms().<u></u>end() ||<br>
+           underScoreEndAtomIter ==<br>
this->_layout.absoluteAtoms().<u></u>end() ||<br>
+           endAtomIter == this->_layout.absoluteAtoms().<u></u>end()) &&<br>
           "Unable to find the absolute atoms that have been added by<br>
           lld");<br>
  -  auto bssSection = this->_layout-><u></u>findOutputSection(".bss");<br>
+  auto bssSection = this->_layout.<u></u>findOutputSection(".bss");<br>
      // If we don't find a bss section, then don't set these values<br>
    if (bssSection) {<br>
@@ -137,14 +137,11 @@ template <class ELFT> void ExecutableWri<br>
          bssSection->virtualAddr() + bssSection->memSize();<br>
      (*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
      (*bssEndAtomIter)->_<u></u>virtualAddr;<br>
      (*endAtomIter)->_virtualAddr = (*bssEndAtomIter)->_<u></u>virtualAddr;<br>
-  } else if (auto dataSection =<br>
this->_layout-><u></u>findOutputSection(".data")) {<br>
+  } else if (auto dataSection =<br>
this->_layout.<u></u>findOutputSection(".data")) {<br>
      (*underScoreEndAtomIter)->_<u></u>virtualAddr =<br>
          dataSection->virtualAddr() + dataSection->memSize();<br>
      (*endAtomIter)->_virtualAddr =<br>
      (*underScoreEndAtomIter)->_<u></u>virtualAddr;<br>
    }<br>
-<br>
-  // Give a chance for the target to finalize its atom values<br>
-  this->_targetHandler.<u></u>finalizeSymbolValues();<br>
  }<br>
    } // namespace elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/HeaderChunks.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/HeaderChunks.<u></u>h?rev=200177&r1=200176&r2=<u></u>200177&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/HeaderChunks.h Sun Jan 26 19:21:02<br>
2014<br>
@@ -52,7 +52,8 @@ public:<br>
      inline int getContentType() const { return<br>
    Chunk<ELFT>::ContentType::<u></u>Header; }<br>
  -  void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);<br>
+  void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+             llvm::FileOutputBuffer &buffer);<br>
      virtual void doPreFlight() {}<br>
  @@ -78,7 +79,8 @@ ELFHeader<ELFT>::ELFHeader(<u></u>const ELFLink<br>
  }<br>
    template <class ELFT><br>
-void ELFHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
llvm::FileOutputBuffer &buffer) {<br>
+void ELFHeader<ELFT>::write(<u></u>ELFWriter *writer, TargetLayout<ELFT><br>
&layout,<br>
+                            llvm::FileOutputBuffer &buffer) {<br>
    uint8_t *chunkBuffer = buffer.getBufferStart();<br>
    uint8_t *atomContent = chunkBuffer + this->fileOffset();<br>
    memcpy(atomContent, &_eh, fileSize());<br>
@@ -132,7 +134,8 @@ public:<br>
      return c->Kind() == Chunk<ELFT>::Kind::<u></u>ProgramHeader;<br>
    }<br>
  -  void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);<br>
+  void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+             llvm::FileOutputBuffer &buffer);<br>
      /// \brief find a program header entry in the list of program<br>
    headers<br>
    ReversePhIterT<br>
@@ -231,8 +234,8 @@ bool ProgramHeader<ELFT>::<u></u>addSegment(Seg<br>
  }<br>
    template <class ELFT><br>
-void ProgramHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
-                                   llvm::FileOutputBuffer &buffer) {<br>
+void ProgramHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
TargetLayout<ELFT> &layout,<br>
+                                llvm::FileOutputBuffer &buffer) {<br>
    uint8_t *chunkBuffer = buffer.getBufferStart();<br>
    uint8_t *dest = chunkBuffer + this->fileOffset();<br>
    for (auto phi : _ph) {<br>
@@ -262,7 +265,8 @@ public:<br>
      _stringSection = s;<br>
    }<br>
  -  void write(ELFWriter *writer, llvm::FileOutputBuffer &buffer);<br>
+  void write(ELFWriter *writer, TargetLayout<ELFT> &layout,<br>
+             llvm::FileOutputBuffer &buffer);<br>
      virtual void doPreFlight() {}<br>
  @@ -336,15 +340,15 @@ SectionHeader<ELFT>::<u></u>updateSection(Secti<br>
  }<br>
    template <class ELFT><br>
-void SectionHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
-                                   llvm::FileOutputBuffer &buffer) {<br>
+void SectionHeader<ELFT>::write(<u></u>ELFWriter *writer,<br>
TargetLayout<ELFT> &layout,<br>
+                                llvm::FileOutputBuffer &buffer) {<br>
    uint8_t *chunkBuffer = buffer.getBufferStart();<br>
    uint8_t *dest = chunkBuffer + this->fileOffset();<br>
    for (auto shi : _sectionInfo) {<br>
      memcpy(dest, shi, sizeof(Elf_Shdr));<br>
      dest += sizeof(Elf_Shdr);<br>
    }<br>
-  _stringSection->write(writer, buffer);<br>
+  _stringSection->write(writer, layout, buffer);<br>
  }<br>
  } // end namespace elf<br>
  } // end namespace lld<br>
<br>
Added:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonDynamicLibraryWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h?<u></u>rev=200177&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
---<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
(added)<br>
+++<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -0,0 +1,80 @@<br>
+//===- lib/ReaderWriter/ELF/Hexagon/<u></u>HexagonDynamicLibraryWriter.h<br>
+//-------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef HEXAGON_DYNAMIC_LIBRARY_<u></u>WRITER_H<br>
+#define HEXAGON_DYNAMIC_LIBRARY_<u></u>WRITER_H<br>
+<br>
+#include "HexagonExecutableAtoms.h"<br>
+#include "HexagonLinkingContext.h"<br>
+#include "DynamicLibraryWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class HexagonTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class HexagonDynamicLibraryWriter : public<br>
DynamicLibraryWriter<ELFT>,<br>
+                                    public HexagonELFWriter<ELFT> {<br>
+public:<br>
+  HexagonDynamicLibraryWriter(<u></u>HexagonLinkingContext &context,<br>
+                              HexagonTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+  // Add any runtime files and their atoms to the output<br>
+  virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+  virtual void finalizeDefaultAtomValues();<br>
+<br>
+  virtual error_code setELFHeader() {<br>
+    DynamicLibraryWriter<ELFT>::<u></u>setELFHeader();<br>
+    HexagonELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+    return error_code::success();<br>
+  }<br>
+<br>
+private:<br>
+  void addDefaultAtoms() {<br>
+    _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+    _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_DYNAMIC");<br>
+  }<br>
+<br>
+  HexagonLinkingContext &_hexagonLinkingContext;<br>
+  HexagonTargetLayout<ELFT> &_hexagonTargetLayout;<br>
+  std::unique_ptr<<u></u>HexagonRuntimeFile<ELFT>> _hexagonRuntimeFile;<br>
+};<br>
+<br>
+template <class ELFT><br>
+HexagonDynamicLibraryWriter<<u></u>ELFT>::<u></u>HexagonDynamicLibraryWriter(<br>
+    HexagonLinkingContext &context, HexagonTargetLayout<ELFT><br>
&layout)<br>
+    : DynamicLibraryWriter<ELFT>(<u></u>context, layout),<br>
+      HexagonELFWriter<ELFT>(<u></u>context, layout),<br>
_hexagonLinkingContext(<u></u>context),<br>
+      _hexagonTargetLayout(layout),<br>
+      _hexagonRuntimeFile(new HexagonRuntimeFile<ELFT>(<u></u>context)) {}<br>
+<br>
+template <class ELFT><br>
+bool HexagonDynamicLibraryWriter<<u></u>ELFT>::createImplicitFiles(<br>
+    std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+  DynamicLibraryWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+  // Add the default atoms as defined for hexagon<br>
+  addDefaultAtoms();<br>
+  result.push_back(std::move(_<u></u>hexagonRuntimeFile));<br>
+  return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void HexagonDynamicLibraryWriter<<u></u>ELFT>::<u></u>finalizeDefaultAtomValues()<br>
{<br>
+  // Finalize the atom values that are part of the parent.<br>
+  DynamicLibraryWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+  HexagonELFWriter<ELFT>::<u></u>finalizeHexagonRuntimeAtomValu<u></u>es();<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // HEXAGON_DYNAMIC_LIBRARY_<u></u>WRITER_H<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFWriters.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonELFWriters.h?rev=<u></u>200177&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/HexagonELFWriters.<u></u>h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -0,0 +1,61 @@<br>
+//===- lib/ReaderWriter/ELF/Hexagon/<u></u>HexagonELFWriters.h<br>
-------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef HEXAGON_ELF_WRITERS_H<br>
+#define HEXAGON_ELF_WRITERS_H<br>
+<br>
+#include "HexagonLinkingContext.h"<br>
+#include "OutputELFWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <class ELFT> class HexagonTargetLayout;<br>
+<br>
+template <typename ELFT> class HexagonELFWriter {<br>
+public:<br>
+  HexagonELFWriter(<u></u>HexagonLinkingContext &context,<br>
+                   HexagonTargetLayout<ELFT> &targetLayout)<br>
+      : _hexagonLinkingContext(<u></u>context),<br>
_hexagonTargetLayout(<u></u>targetLayout) {}<br>
+<br>
+protected:<br>
+  bool setELFHeader(ELFHeader<ELFT> &elfHeader) {<br>
+    elfHeader.e_ident(llvm::ELF::<u></u>EI_VERSION, 1);<br>
+    elfHeader.e_ident(llvm::ELF::<u></u>EI_OSABI, 0);<br>
+    elfHeader.e_version(1);<br>
+    elfHeader.e_flags(0x3);<br>
+    return true;<br>
+  }<br>
+<br>
+  void finalizeHexagonRuntimeAtomValu<u></u>es() {<br>
+    if (_hexagonLinkingContext.<u></u>isDynamic()) {<br>
+      auto gotAtomIter =<br>
+<br>
          _hexagonTargetLayout.<u></u>findAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+      auto gotpltSection =<br>
_hexagonTargetLayout.<u></u>findOutputSection(".got.plt");<br>
+      if (gotpltSection)<br>
+        (*gotAtomIter)->_virtualAddr = gotpltSection->virtualAddr();<br>
+      else<br>
+        (*gotAtomIter)->_virtualAddr = 0;<br>
+      auto dynamicAtomIter =<br>
_hexagonTargetLayout.<u></u>findAbsoluteAtom("_DYNAMIC");<br>
+      auto dynamicSection =<br>
_hexagonTargetLayout.<u></u>findOutputSection(".dynamic");<br>
+      if (dynamicSection)<br>
+        (*dynamicAtomIter)->_<u></u>virtualAddr =<br>
dynamicSection->virtualAddr();<br>
+      else<br>
+        (*dynamicAtomIter)->_<u></u>virtualAddr = 0;<br>
+    }<br>
+  }<br>
+<br>
+private:<br>
+  HexagonLinkingContext &_hexagonLinkingContext<br>
LLVM_ATTRIBUTE_UNUSED;<br>
+  HexagonTargetLayout<ELFT> &_hexagonTargetLayout;<br>
+};<br>
+<br>
+} // elf<br>
+} // lld<br>
+#endif // HEXAGON_ELF_WRITERS_H<br>
<br>
Added:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonExecutableWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonExecutableWriter.h?rev=<u></u>200177&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -0,0 +1,86 @@<br>
+//===- lib/ReaderWriter/ELF/Hexagon/<u></u>HexagonExecutableWriter.h<br>
-------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef HEXAGON_EXECUTABLE_WRITER_H<br>
+#define HEXAGON_EXECUTABLE_WRITER_H<br>
+<br>
+#include "HexagonExecutableAtoms.h"<br>
+#include "HexagonLinkingContext.h"<br>
+#include "HexagonELFWriters.h"<br>
+#include "ExecutableWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class HexagonTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class HexagonExecutableWriter : public ExecutableWriter<ELFT>,<br>
+                                public HexagonELFWriter<ELFT> {<br>
+public:<br>
+  HexagonExecutableWriter(<u></u>HexagonLinkingContext &context,<br>
+                          HexagonTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+  // Add any runtime files and their atoms to the output<br>
+  virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+  virtual void finalizeDefaultAtomValues();<br>
+<br>
+  virtual error_code setELFHeader() {<br>
+    ExecutableWriter<ELFT>::<u></u>setELFHeader();<br>
+    HexagonELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+    return error_code::success();<br>
+  }<br>
+<br>
+private:<br>
+  void addDefaultAtoms() {<br>
+    _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_SDA_BASE_");<br>
+    if (this->_context.isDynamic()) {<br>
+      _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+      _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_DYNAMIC");<br>
+    }<br>
+  }<br>
+<br>
+  HexagonLinkingContext &_hexagonLinkingContext;<br>
+  HexagonTargetLayout<ELFT> &_hexagonTargetLayout;<br>
+  std::unique_ptr<<u></u>HexagonRuntimeFile<ELFT>> _hexagonRuntimeFile;<br>
+};<br>
+<br>
+template <class ELFT><br>
+HexagonExecutableWriter<ELFT><u></u>::HexagonExecutableWriter(<br>
+    HexagonLinkingContext &context, HexagonTargetLayout<ELFT><br>
&layout)<br>
+    : ExecutableWriter<ELFT>(<u></u>context, layout),<br>
+      HexagonELFWriter<ELFT>(<u></u>context, layout),<br>
_hexagonLinkingContext(<u></u>context),<br>
+      _hexagonTargetLayout(layout),<br>
+      _hexagonRuntimeFile(new HexagonRuntimeFile<ELFT>(<u></u>context)) {}<br>
+<br>
+template <class ELFT><br>
+bool HexagonExecutableWriter<ELFT>:<u></u>:createImplicitFiles(<br>
+    std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+  ExecutableWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+  // Add the default atoms as defined for hexagon<br>
+  addDefaultAtoms();<br>
+  result.push_back(std::move(_<u></u>hexagonRuntimeFile));<br>
+  return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void HexagonExecutableWriter<ELFT>:<u></u>:finalizeDefaultAtomValues() {<br>
+  // Finalize the atom values that are part of the parent.<br>
+  ExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+  auto sdabaseAtomIter =<br>
_hexagonTargetLayout.<u></u>findAbsoluteAtom("_SDA_BASE_")<u></u>;<br>
+  (*sdabaseAtomIter)->_<u></u>virtualAddr =<br>
+      _hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr();<br>
+  HexagonELFWriter<ELFT>::<u></u>finalizeHexagonRuntimeAtomValu<u></u>es();<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // HEXAGON_EXECUTABLE_WRITER_H<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonLinkingContext.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -18,6 +18,8 @@<br>
  namespace lld {<br>
  namespace elf {<br>
  +typedef llvm::object::ELFType<llvm::<u></u>support::little, 2, false><br>
HexagonELFType;<br>
+<br>
  class HexagonLinkingContext LLVM_FINAL : public ELFLinkingContext {<br>
  public:<br>
    HexagonLinkingContext(llvm::<u></u>Triple triple);<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp?<u></u>rev=200177&r1=200176&r2=<u></u>200177&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
---<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
(original)<br>
+++<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.cpp<br>
Sun Jan 26 19:21:02 2014<br>
@@ -264,19 +264,19 @@ error_code HexagonTargetRelocationHandle<br>
      break;<br>
    case R_HEX_GPREL16_0:<br>
      relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                   _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
0);<br>
+<br>
                   _hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
0);<br>
      break;<br>
    case R_HEX_GPREL16_1:<br>
      relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                   _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
1);<br>
+<br>
                   _hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
1);<br>
      break;<br>
    case R_HEX_GPREL16_2:<br>
      relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                   _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
2);<br>
+<br>
                   _hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
2);<br>
      break;<br>
    case R_HEX_GPREL16_3:<br>
      relocHexGPRELN(location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                   _targetLayout.getSDataSection(<u></u>)->virtualAddr(),<br>
3);<br>
+<br>
                   _hexagonTargetLayout.<u></u>getSDataSection()-><u></u>virtualAddr(),<br>
3);<br>
      break;<br>
    case R_HEX_16_X:<br>
    case R_HEX_12_X:<br>
@@ -296,45 +296,52 @@ error_code HexagonTargetRelocationHandle<br>
      break;<br>
    case R_HEX_GOTREL_32:<br>
      relocHexGOTREL_32(location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                      _targetHandler.getGOTSymAddr()<u></u>);<br>
+                      _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOTREL_LO16:<br>
      relocHexGOTREL_HILO16(<u></u>location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                          _targetHandler.getGOTSymAddr()<u></u>);<br>
+                          _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOTREL_HI16:<br>
      relocHexGOTREL_HILO16(<u></u>location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                          _targetHandler.getGOTSymAddr()<u></u>, 16);<br>
+                          _hexagonTargetLayout.<u></u>getGOTSymAddr(), 16);<br>
      break;<br>
    case R_HEX_GOT_LO16:<br>
-    relocHexGOTLO16(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOTLO16(location, targetVAddress,<br>
+                    _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOT_HI16:<br>
-    relocHexGOTHI16(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOTHI16(location, targetVAddress,<br>
+                    _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOT_32:<br>
-    relocHexGOT32(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOT32(location, targetVAddress,<br>
+                  _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOT_16:<br>
-    relocHexGOT16(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOT16(location, targetVAddress,<br>
+                  _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOT_32_6_X:<br>
-    relocHexGOT32_6_X(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOT32_6_X(location, targetVAddress,<br>
+                      _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOT_16_X:<br>
-    relocHexGOT16_X(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOT16_X(location, targetVAddress,<br>
+                    _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOT_11_X:<br>
-    relocHexGOT11_X(location, targetVAddress,<br>
_targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOT11_X(location, targetVAddress,<br>
+                    _hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
    case R_HEX_GOTREL_32_6_X:<br>
      relocHexGOTRELSigned(location, relocVAddress, targetVAddress,<br>
      ref.addend(),<br>
-                   _targetHandler.getGOTSymAddr()<u></u>, 6);<br>
+                         _hexagonTargetLayout.<u></u>getGOTSymAddr(), 6);<br>
      break;<br>
    case R_HEX_GOTREL_16_X:<br>
    case R_HEX_GOTREL_11_X:<br>
-    relocHexGOTRELUnsigned(<u></u>location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
-                   _targetHandler.getGOTSymAddr()<u></u>);<br>
+    relocHexGOTRELUnsigned(<u></u>location, relocVAddress, targetVAddress,<br>
+                           ref.addend(),<br>
_hexagonTargetLayout.<u></u>getGOTSymAddr());<br>
      break;<br>
      default : {<br>
@@ -349,4 +356,4 @@ error_code HexagonTargetRelocationHandle<br>
    return error_code::success();<br>
  }<br>
  -<br>
\ No newline at end of file<br>
+<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonRelocationHandler.h?<u></u>rev=200177&r1=200176&r2=<u></u>200177&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonRelocationHandler.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -18,23 +18,21 @@ namespace elf {<br>
    class HexagonLinkingContext;<br>
  class HexagonTargetHandler;<br>
-template <class HexagonELFType> class HexagonTargetLayout;<br>
    class HexagonTargetRelocationHandler LLVM_FINAL :<br>
      public TargetRelocationHandler<<u></u>HexagonELFType> {<br>
  public:<br>
-  HexagonTargetRelocationHandler<u></u>(<br>
-      const HexagonLinkingContext &context, const<br>
HexagonTargetHandler &tH,<br>
-      const HexagonTargetLayout<<u></u>HexagonELFType> &layout)<br>
-      : _targetHandler(tH), _targetLayout(layout) {}<br>
+  HexagonTargetRelocationHandler<u></u>(HexagonLinkingContext &context,<br>
+                                 HexagonTargetLayout<<u></u>HexagonELFType><br>
&layout)<br>
+      : _hexagonLinkingContext(<u></u>context),<br>
_hexagonTargetLayout(layout) {}<br>
  -  virtual error_code<br>
-  applyRelocation(ELFWriter &, llvm::FileOutputBuffer &,<br>
-                  const lld::AtomLayout &, const Reference &) const;<br>
+  virtual error_code applyRelocation(ELFWriter &,<br>
llvm::FileOutputBuffer &,<br>
+                                     const lld::AtomLayout &,<br>
+                                     const Reference &) const;<br>
    private:<br>
-  const HexagonTargetHandler &_targetHandler;<br>
-  const HexagonTargetLayout<<u></u>HexagonELFType> &_targetLayout;<br>
+  HexagonLinkingContext &_hexagonLinkingContext<br>
LLVM_ATTRIBUTE_UNUSED;<br>
+  HexagonTargetLayout<<u></u>HexagonELFType> &_hexagonTargetLayout;<br>
  };<br>
  } // elf<br>
  } // lld<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonSectionChunks.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonSectionChunks.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonSectionChunks.h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -6,14 +6,13 @@<br>
  // License. See LICENSE.TXT for details.<br>
  //<br>
  //===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
-#ifndef LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_SECTION_CHUNKS_H<br>
-#define LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_SECTION_CHUNKS_H<br>
+#ifndef HEXAGON_SECTION_CHUNKS_H<br>
+#define HEXAGON_SECTION_CHUNKS_H<br>
    #include "HexagonTargetHandler.h"<br>
    namespace lld {<br>
  namespace elf {<br>
-typedef llvm::object::ELFType<llvm::<u></u>support::little, 2, false><br>
HexagonELFType;<br>
  template <typename ELFT> class HexagonTargetLayout;<br>
  class HexagonLinkingContext;<br>
  <br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonTargetHandler.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
Sun Jan 26 19:21:02 2014<br>
@@ -7,6 +7,8 @@<br>
  //<br>
  //===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
  +#include "HexagonExecutableWriter.h"<br>
+#include "HexagonDynamicLibraryWriter.<u></u>h"<br>
  #include "HexagonTargetHandler.h"<br>
  #include "HexagonLinkingContext.h"<br>
  @@ -17,11 +19,28 @@ using namespace llvm::ELF;<br>
  using llvm::makeArrayRef;<br>
    HexagonTargetHandler::<u></u>HexagonTargetHandler(<u></u>HexagonLinkingContext<br>
  &context)<br>
-    : DefaultTargetHandler(context), _targetLayout(context),<br>
-      _relocationHandler(context, *this, _targetLayout),<br>
-      _hexagonRuntimeFile(new<br>
HexagonRuntimeFile<<u></u>HexagonELFType>(context)) {}<br>
-<br>
-namespace {<br>
+    : DefaultTargetHandler(context),<br>
_hexagonLinkingContext(<u></u>context),<br>
+      _hexagonRuntimeFile(new<br>
HexagonRuntimeFile<<u></u>HexagonELFType>(context)),<br>
+      _hexagonTargetLayout(new<br>
HexagonTargetLayout<<u></u>HexagonELFType>(context)),<br>
+      _hexagonRelocationHandler(new HexagonTargetRelocationHandler<u></u>(<br>
+          context, *_hexagonTargetLayout.get())) {}<br>
+<br>
+std::unique_ptr<Writer> HexagonTargetHandler::<u></u>getWriter() {<br>
+  switch (_hexagonLinkingContext.<u></u>getOutputELFType()) {<br>
+  case llvm::ELF::ET_EXEC:<br>
+    return std::unique_ptr<Writer>(<br>
+        new elf::HexagonExecutableWriter<<u></u>HexagonELFType>(<br>
+            _hexagonLinkingContext, *_hexagonTargetLayout.get()));<br>
+  case llvm::ELF::ET_DYN:<br>
+    return std::unique_ptr<Writer>(<br>
+        new elf::<u></u>HexagonDynamicLibraryWriter<<u></u>HexagonELFType>(<br>
+            _hexagonLinkingContext, *_hexagonTargetLayout.get()));<br>
+  case llvm::ELF::ET_REL:<br>
+    llvm_unreachable("TODO: support -r mode");<br>
+  default:<br>
+    llvm_unreachable("unsupported output type");<br>
+  }<br>
+}<br>
    using namespace llvm::ELF;<br>
  @@ -297,7 +316,6 @@ public:<br>
      return error_code::success();<br>
    }<br>
  };<br>
-} // end anonymous namespace<br>
    void elf::HexagonLinkingContext::<u></u>addPasses(PassManager &pm) {<br>
    if (isDynamic())<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Hexagon/<u></u>HexagonTargetHandler.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -7,8 +7,8 @@<br>
  //<br>
  //===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
  -#ifndef LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_TARGET_HANDLER_H<br>
-#define LLD_READER_WRITER_ELF_HEXAGON_<u></u>HEXAGON_TARGET_HANDLER_H<br>
+#ifndef HEXAGON_TARGET_HANDLER_H<br>
+#define HEXAGON_TARGET_HANDLER_H<br>
    #include "DefaultTargetHandler.h"<br>
  #include "HexagonExecutableAtoms.h"<br>
@@ -25,14 +25,14 @@ class HexagonLinkingContext;<br>
  /// \brief TargetLayout for Hexagon<br>
  template <class HexagonELFType><br>
  class HexagonTargetLayout LLVM_FINAL : public<br>
  TargetLayout<HexagonELFType> {<br>
-<br>
  public:<br>
    enum HexagonSectionOrder {<br>
      ORDER_SDATA = 205<br>
    };<br>
      HexagonTargetLayout(const HexagonLinkingContext &hti)<br>
-      : TargetLayout<HexagonELFType>(<u></u>hti), _sdataSection(nullptr) {<br>
+      : TargetLayout<HexagonELFType>(<u></u>hti), _sdataSection(nullptr),<br>
+        _gotSymAtom(nullptr), _cachedGotSymAtom(false) {<br>
      _sdataSection = new (_alloc) SDataSection<HexagonELFType>(<u></u>hti);<br>
    }<br>
  @@ -84,9 +84,22 @@ public:<br>
      return _sdataSection;<br>
    }<br>
  +  uint64_t getGOTSymAddr() {<br>
+    if (!_cachedGotSymAtom) {<br>
+      auto gotAtomIter =<br>
this->findAbsoluteAtom("_<u></u>GLOBAL_OFFSET_TABLE_");<br>
+      _gotSymAtom = (*gotAtomIter);<br>
+      _cachedGotSymAtom = true;<br>
+    }<br>
+    if (_gotSymAtom)<br>
+      return _gotSymAtom->_virtualAddr;<br>
+    return 0;<br>
+  }<br>
+<br>
  private:<br>
    llvm::BumpPtrAllocator _alloc;<br>
    SDataSection<HexagonELFType> *_sdataSection;<br>
+  AtomLayout *_gotSymAtom;<br>
+  bool _cachedGotSymAtom;<br>
  };<br>
    /// \brief TargetHandler for Hexagon<br>
@@ -97,64 +110,12 @@ public:<br>
      virtual void registerRelocationNames(<u></u>Registry &registry);<br>
  -  bool doesOverrideELFHeader() { return true; }<br>
-<br>
-  void setELFHeader(ELFHeader<<u></u>HexagonELFType> *elfHeader) {<br>
-    elfHeader->e_ident(llvm::ELF::<u></u>EI_VERSION, 1);<br>
-    elfHeader->e_ident(llvm::ELF::<u></u>EI_OSABI, 0);<br>
-    elfHeader->e_version(1);<br>
-    elfHeader->e_flags(0x3);<br>
-  }<br>
-<br>
-  virtual HexagonTargetLayout<<u></u>HexagonELFType> &targetLayout() {<br>
-    return _targetLayout;<br>
-  }<br>
-<br>
    virtual const HexagonTargetRelocationHandler<br>
    &getRelocationHandler() const {<br>
-    return _relocationHandler;<br>
-  }<br>
-<br>
-  void addDefaultAtoms() {<br>
-    _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_SDA_BASE_");<br>
-    if (_context.isDynamic()) {<br>
-      _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
-      _hexagonRuntimeFile-><u></u>addAbsoluteAtom("_DYNAMIC");<br>
-    }<br>
-  }<br>
-<br>
-  virtual bool<br>
-  createImplicitFiles(std::<u></u>vector<std::unique_ptr<File> > &result) {<br>
-    // Add the default atoms as defined for hexagon<br>
-    addDefaultAtoms();<br>
-    result.push_back(std::move(_<u></u>hexagonRuntimeFile));<br>
-    return true;<br>
-  }<br>
-<br>
-  void finalizeSymbolValues() {<br>
-    auto sdabaseAtomIter =<br>
_targetLayout.<u></u>findAbsoluteAtom("_SDA_BASE_")<u></u>;<br>
-    (*sdabaseAtomIter)->_<u></u>virtualAddr =<br>
-        _targetLayout.getSDataSection(<u></u>)->virtualAddr();<br>
-    if (_context.isDynamic()) {<br>
-      auto gotAtomIter =<br>
-          _targetLayout.<u></u>findAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
-      _gotSymAtom = (*gotAtomIter);<br>
-      auto gotpltSection =<br>
_targetLayout.<u></u>findOutputSection(".got.plt");<br>
-      if (gotpltSection)<br>
-        _gotSymAtom->_virtualAddr = gotpltSection->virtualAddr();<br>
-      else<br>
-        _gotSymAtom->_virtualAddr = 0;<br>
-      auto dynamicAtomIter =<br>
_targetLayout.<u></u>findAbsoluteAtom("_DYNAMIC");<br>
-      auto dynamicSection =<br>
_targetLayout.<u></u>findOutputSection(".dynamic");<br>
-      if (dynamicSection)<br>
-        (*dynamicAtomIter)->_<u></u>virtualAddr =<br>
dynamicSection->virtualAddr();<br>
-      else<br>
-        (*dynamicAtomIter)->_<u></u>virtualAddr = 0;<br>
-    }<br>
+    return *(_hexagonRelocationHandler.<u></u>get());<br>
    }<br>
  -  uint64_t getGOTSymAddr() const {<br>
-    if (!_gotSymAtom) return 0;<br>
-    return _gotSymAtom->_virtualAddr;<br>
+  virtual HexagonTargetLayout<<u></u>HexagonELFType> &getTargetLayout() {<br>
+    return *(_hexagonTargetLayout.get());<br>
    }<br>
      virtual std::unique_ptr<Reader> getObjReader(bool atomizeStrings)<br>
    {<br>
@@ -165,13 +126,15 @@ public:<br>
      return std::unique_ptr<Reader>(new<br>
      HexagonELFDSOReader(<u></u>useShlibUndefines));<br>
    }<br>
  +  virtual std::unique_ptr<Writer> getWriter();<br>
+<br>
  private:<br>
+  llvm::BumpPtrAllocator _alloc;<br>
    static const Registry::KindStrings kindStrings[];<br>
-<br>
-  HexagonTargetLayout<<u></u>HexagonELFType> _targetLayout;<br>
-  HexagonTargetRelocationHandler _relocationHandler;<br>
+  HexagonLinkingContext &_hexagonLinkingContext;<br>
    std::unique_ptr<<u></u>HexagonRuntimeFile<<u></u>HexagonELFType> ><br>
    _hexagonRuntimeFile;<br>
-  AtomLayout *_gotSymAtom;<br>
+  std::unique_ptr<<u></u>HexagonTargetLayout<<u></u>HexagonELFType>><br>
_hexagonTargetLayout;<br>
+  std::unique_ptr<<u></u>HexagonTargetRelocationHandler<u></u>><br>
_hexagonRelocationHandler;<br>
  };<br>
  } // end namespace elf<br>
  } // end namespace lld<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsDynamicLibraryWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsDynamicLibraryWriter.h?<u></u>rev=200177&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
Sun Jan 26 19:21:02 2014<br>
@@ -0,0 +1,102 @@<br>
+//===- lib/ReaderWriter/ELF/Mips/<u></u>MipsDynamicLibraryWriter.h<br>
---------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef MIPS_DYNAMIC_LIBRARY_WRITER_H<br>
+#define MIPS_DYNAMIC_LIBRARY_WRITER_H<br>
+<br>
+#include "DynamicLibraryWriter.h"<br>
+#include "MipsELFWriters.h"<br>
+#include "MipsLinkingContext.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class MipsTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class MipsDynamicLibraryWriter : public DynamicLibraryWriter<ELFT>,<br>
+                                 public MipsELFWriter<ELFT> {<br>
+public:<br>
+  MipsDynamicLibraryWriter(<u></u>MipsLinkingContext &context,<br>
+                           MipsTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+  // Add any runtime files and their atoms to the output<br>
+  virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+  virtual void finalizeDefaultAtomValues();<br>
+<br>
+  virtual error_code setELFHeader() {<br>
+    DynamicLibraryWriter<ELFT>::<u></u>setELFHeader();<br>
+    MipsELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+    return error_code::success();<br>
+  }<br>
+<br>
+  LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>) createDynamicTable();<br>
+<br>
+  LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
createDynamicSymbolTable();<br>
+<br>
+private:<br>
+  void addDefaultAtoms() {<br>
+    if (this->_context.isDynamic()) {<br>
+      _mipsRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+      _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp");<br>
+      _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp_disp");<br>
+    }<br>
+  }<br>
+<br>
+  std::unique_ptr<<u></u>MipsRuntimeFile<ELFT>> _mipsRuntimeFile;<br>
+  MipsLinkingContext &_mipsContext;<br>
+  MipsTargetLayout<<u></u>Mips32ElELFType> &_mipsTargetLayout;<br>
+};<br>
+<br>
+template <class ELFT><br>
+MipsDynamicLibraryWriter<<u></u>ELFT>::<u></u>MipsDynamicLibraryWriter(<br>
+    MipsLinkingContext &context, MipsTargetLayout<ELFT> &layout)<br>
+    : DynamicLibraryWriter<ELFT>(<u></u>context, layout),<br>
+      MipsELFWriter<ELFT>(context, layout),<br>
+      _mipsRuntimeFile(new MipsRuntimeFile<ELFT>(context)<u></u>),<br>
+      _mipsContext(context), _mipsTargetLayout(layout) {}<br>
+<br>
+template <class ELFT><br>
+bool MipsDynamicLibraryWriter<ELFT><u></u>::createImplicitFiles(<br>
+    std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+  DynamicLibraryWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+  // Add the default atoms as defined for mips<br>
+  addDefaultAtoms();<br>
+  result.push_back(std::move(_<u></u>mipsRuntimeFile));<br>
+  return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void MipsDynamicLibraryWriter<ELFT><u></u>::finalizeDefaultAtomValues() {<br>
+  // Finalize the atom values that are part of the parent.<br>
+  DynamicLibraryWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+  MipsELFWriter<ELFT>::<u></u>finalizeMipsRuntimeAtomValues(<u></u>);<br>
+}<br>
+<br>
+/// \brief create dynamic table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)<br>
+    MipsDynamicLibraryWriter<ELFT><u></u>::createDynamicTable() {<br>
+  return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)(new (<br>
+      this->_alloc) MipsDynamicTable(_mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+/// \brief create dynamic symbol table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
+    MipsDynamicLibraryWriter<ELFT><u></u>::createDynamicSymbolTable() {<br>
+  return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)(new (<br>
+      this->_alloc) MipsDynamicSymbolTable(_<u></u>mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // MIPS_DYNAMIC_LIBRARY_WRITER_H<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFWriters.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsELFWriters.h?rev=200177&<u></u>view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h (added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsELFWriters.h Sun Jan 26<br>
19:21:02 2014<br>
@@ -0,0 +1,75 @@<br>
+//===- lib/ReaderWriter/ELF/Mips/<u></u>MipsELFWriters.h<br>
-------------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef MIPS_ELF_WRITERS_H<br>
+#define MIPS_ELF_WRITERS_H<br>
+<br>
+#include "MipsLinkingContext.h"<br>
+#include "OutputELFWriter.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <class ELFT> class MipsTargetLayout;<br>
+<br>
+template <typename ELFT> class MipsELFWriter {<br>
+public:<br>
+  MipsELFWriter(<u></u>MipsLinkingContext &context,<br>
+                MipsTargetLayout<ELFT> &targetLayout)<br>
+      : _mipsLinkingContext(context),<br>
_mipsTargetLayout(<u></u>targetLayout) {}<br>
+<br>
+protected:<br>
+  bool setELFHeader(ELFHeader<ELFT> &elfHeader) {<br>
+    elfHeader.e_version(1);<br>
+    elfHeader.e_ident(llvm::ELF::<u></u>EI_VERSION, llvm::ELF::EV_CURRENT);<br>
+    elfHeader.e_ident(llvm::ELF::<u></u>EI_OSABI,<br>
llvm::ELF::ELFOSABI_NONE);<br>
+    if (_mipsTargetLayout.<u></u>findOutputSection(".got.plt"))<br>
+      elfHeader.e_ident(llvm::ELF::<u></u>EI_ABIVERSION, 1);<br>
+    else<br>
+      elfHeader.e_ident(llvm::ELF::<u></u>EI_ABIVERSION, 0);<br>
+<br>
+    // FIXME (simon): Read elf flags from all inputs, check<br>
compatibility,<br>
+    // merge them and write result here.<br>
+    uint32_t flags = llvm::ELF::EF_MIPS_NOREORDER |<br>
llvm::ELF::EF_MIPS_ABI_O32 |<br>
+                     llvm::ELF::EF_MIPS_CPIC |<br>
llvm::ELF::EF_MIPS_ARCH_32R2;<br>
+    if (_mipsLinkingContext.<u></u>getOutputELFType() == llvm::ELF::ET_DYN)<br>
+      flags |= EF_MIPS_PIC;<br>
+    elfHeader.e_flags(flags);<br>
+    return true;<br>
+  }<br>
+<br>
+  void finalizeMipsRuntimeAtomValues(<u></u>) {<br>
+    if (_mipsLinkingContext.<u></u>isDynamic()) {<br>
+      auto gotSection = _mipsTargetLayout.<u></u>findOutputSection(".got");<br>
+      auto got = gotSection ? gotSection->virtualAddr() : 0;<br>
+      auto gp = gotSection ? got + _mipsTargetLayout.getGPOffset(<u></u>) :<br>
0;<br>
+<br>
+      auto gotAtomIter =<br>
+<br>
          _mipsTargetLayout.<u></u>findAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+      assert(gotAtomIter !=<br>
_mipsTargetLayout.<u></u>absoluteAtoms().end());<br>
+      (*gotAtomIter)->_virtualAddr = got;<br>
+<br>
+      auto gpAtomIter = _mipsTargetLayout.<u></u>findAbsoluteAtom("_gp");<br>
+      assert(gpAtomIter != _mipsTargetLayout.<u></u>absoluteAtoms().end());<br>
+      (*gpAtomIter)->_virtualAddr = gp;<br>
+<br>
+      AtomLayout *gpAtom = _mipsTargetLayout.getGP();<br>
+      assert(gpAtom != nullptr);<br>
+      gpAtom->_virtualAddr = gp;<br>
+    }<br>
+  }<br>
+<br>
+private:<br>
+  MipsLinkingContext &_mipsLinkingContext LLVM_ATTRIBUTE_UNUSED;<br>
+  MipsTargetLayout<ELFT> &_mipsTargetLayout;<br>
+};<br>
+<br>
+} // elf<br>
+} // lld<br>
+#endif // MIPS_ELF_WRITERS_H<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsExecutableWriter.h?rev=200177&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsExecutableWriter.h?rev=<u></u>200177&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h<br>
(added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsExecutableWriter.<u></u>h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -0,0 +1,102 @@<br>
+//===- lib/ReaderWriter/ELF/Mips/<u></u>MipsExecutableWriter.h<br>
-------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#ifndef MIPS_EXECUTABLE_WRITER_H<br>
+#define MIPS_EXECUTABLE_WRITER_H<br>
+<br>
+#include "ExecutableWriter.h"<br>
+#include "MipsELFWriters.h"<br>
+#include "MipsLinkingContext.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+template <typename ELFT> class MipsTargetLayout;<br>
+<br>
+template <class ELFT><br>
+class MipsExecutableWriter : public ExecutableWriter<ELFT>,<br>
+                             public MipsELFWriter<ELFT> {<br>
+public:<br>
+  MipsExecutableWriter(<u></u>MipsLinkingContext &context,<br>
+                       MipsTargetLayout<ELFT> &layout);<br>
+<br>
+protected:<br>
+  // Add any runtime files and their atoms to the output<br>
+  virtual bool<br>
createImplicitFiles(std::<u></u>vector<std::unique_ptr<File>> &);<br>
+<br>
+  virtual void finalizeDefaultAtomValues();<br>
+<br>
+  virtual error_code setELFHeader() {<br>
+    ExecutableWriter<ELFT>::<u></u>setELFHeader();<br>
+    MipsELFWriter<ELFT>::<u></u>setELFHeader(*this->_<u></u>elfHeader);<br>
+    return error_code::success();<br>
+  }<br>
+<br>
+  LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>) createDynamicTable();<br>
+<br>
+  LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
createDynamicSymbolTable();<br>
+<br>
+private:<br>
+  void addDefaultAtoms() {<br>
+    if (this->_context.isDynamic()) {<br>
+      _mipsRuntimeFile-><u></u>addAbsoluteAtom("_GLOBAL_<u></u>OFFSET_TABLE_");<br>
+      _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp");<br>
+      _mipsRuntimeFile-><u></u>addAbsoluteAtom("_gp_disp");<br>
+    }<br>
+  }<br>
+<br>
+  std::unique_ptr<<u></u>MipsRuntimeFile<ELFT>> _mipsRuntimeFile;<br>
+  MipsLinkingContext &_mipsContext;<br>
+  MipsTargetLayout<<u></u>Mips32ElELFType> &_mipsTargetLayout;<br>
+};<br>
+<br>
+template <class ELFT><br>
+MipsExecutableWriter<ELFT>::<u></u>MipsExecutableWriter(<u></u>MipsLinkingContext<br>
&context,<br>
+<br>
                                                 MipsTargetLayout<ELFT><br>
&layout)<br>
+    : ExecutableWriter<ELFT>(<u></u>context, layout),<br>
+      MipsELFWriter<ELFT>(context, layout),<br>
+      _mipsRuntimeFile(new MipsRuntimeFile<ELFT>(context)<u></u>),<br>
+      _mipsContext(context), _mipsTargetLayout(layout) {}<br>
+<br>
+template <class ELFT><br>
+bool MipsExecutableWriter<ELFT>::<u></u>createImplicitFiles(<br>
+    std::vector<std::unique_ptr<<u></u>File>> &result) {<br>
+  ExecutableWriter<ELFT>::<u></u>createImplicitFiles(result);<br>
+  // Add the default atoms as defined for mips<br>
+  addDefaultAtoms();<br>
+  result.push_back(std::move(_<u></u>mipsRuntimeFile));<br>
+  return true;<br>
+}<br>
+<br>
+template <class ELFT><br>
+void MipsExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues() {<br>
+  // Finalize the atom values that are part of the parent.<br>
+  ExecutableWriter<ELFT>::<u></u>finalizeDefaultAtomValues();<br>
+  MipsELFWriter<ELFT>::<u></u>finalizeMipsRuntimeAtomValues(<u></u>);<br>
+}<br>
+<br>
+/// \brief create dynamic table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)<br>
+    MipsExecutableWriter<ELFT>::<u></u>createDynamicTable() {<br>
+  return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicTable<ELFT>)(new (<br>
+      this->_alloc) MipsDynamicTable(_mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+/// \brief create dynamic symbol table<br>
+template <class ELFT><br>
+LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)<br>
+    MipsExecutableWriter<ELFT>::<u></u>createDynamicSymbolTable() {<br>
+  return LLD_UNIQUE_BUMP_PTR(<u></u>DynamicSymbolTable<ELFT>)(new (<br>
+      this->_alloc) MipsDynamicSymbolTable(_<u></u>mipsContext,<br>
_mipsTargetLayout));<br>
+}<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif // MIPS_EXECUTABLE_WRITER_H<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsLinkingContext.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsLinkingContext.<u></u>cpp Sun<br>
Jan 26 19:21:02 2014<br>
@@ -19,17 +19,6 @@ MipsLinkingContext::<u></u>MipsLinkingContext(l<br>
      : ELFLinkingContext(triple, std::unique_ptr<<u></u>TargetHandlerBase>(<br>
                                      new MipsTargetHandler(*this)))<br>
                                      {}<br>
  -MipsTargetLayout<<u></u>Mips32ElELFType><br>
&MipsLinkingContext::<u></u>getTargetLayout() {<br>
-  auto &layout = getTargetHandler<<u></u>Mips32ElELFType>().<u></u>targetLayout();<br>
-  return static_cast<MipsTargetLayout<<u></u>Mips32ElELFType> &>(layout);<br>
-}<br>
-<br>
-const MipsTargetLayout<<u></u>Mips32ElELFType> &<br>
-MipsLinkingContext::<u></u>getTargetLayout() const {<br>
-  auto &layout = getTargetHandler<<u></u>Mips32ElELFType>().<u></u>targetLayout();<br>
-  return static_cast<MipsTargetLayout<<u></u>Mips32ElELFType> &>(layout);<br>
-}<br>
-<br>
  bool MipsLinkingContext::<u></u>isLittleEndian() const {<br>
    return Mips32ElELFType::<u></u>TargetEndianness == llvm::support::little;<br>
  }<br>
<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsRelocationHandler.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.cpp Sun<br>
Jan 26 19:21:02 2014<br>
@@ -112,10 +112,6 @@ void relocLldLo16(uint8_t *location, uin<br>
    } // end anon namespace<br>
  -MipsTargetRelocationHandler::<u></u>MipsTargetRelocationHandler(<br>
-    const MipsLinkingContext &context, const MipsTargetHandler<br>
&handler)<br>
-    : _targetHandler(handler) {}<br>
-<br>
  MipsTargetRelocationHandler::~<u></u>MipsTargetRelocationHandler() {<br>
    assert(_pairedRelocations.<u></u>empty());<br>
  }<br>
@@ -132,7 +128,7 @@ MipsTargetRelocationHandler::<u></u>savePairedR<br>
    void MipsTargetRelocationHandler::<u></u>applyPairedRelocations(<br>
      ELFWriter &writer, llvm::FileOutputBuffer &buf, const<br>
      lld::AtomLayout &atom,<br>
-    int64_t loAddend) const {<br>
+    int64_t gpAddr, int64_t loAddend) const {<br>
    auto pi = _pairedRelocations.find(&atom)<u></u>;<br>
    if (pi == _pairedRelocations.end())<br>
      return;<br>
@@ -150,13 +146,11 @@ void MipsTargetRelocationHandler::<u></u>applyP<br>
      assert(ri->kindArch() == Reference::KindArch::Mips);<br>
      switch (ri->kindValue()) {<br>
      case R_MIPS_HI16:<br>
-      relocHi16(location, relocVAddress, targetVAddress, ahl,<br>
-                _targetHandler.<u></u>getGPDispSymAddr(),<br>
+      relocHi16(location, relocVAddress, targetVAddress, ahl,<br>
gpAddr,<br>
                  ri->target()->name() == "_gp_disp");<br>
        break;<br>
      case R_MIPS_GOT16:<br>
-      relocGOT16(location, relocVAddress, targetVAddress, ahl,<br>
-                 _targetHandler.<u></u>getGPDispSymAddr());<br>
+      relocGOT16(location, relocVAddress, targetVAddress, ahl,<br>
gpAddr);<br>
        break;<br>
      default:<br>
        llvm_unreachable("Unknown type of paired relocation.");<br>
@@ -169,6 +163,9 @@ void MipsTargetRelocationHandler::<u></u>applyP<br>
  error_code MipsTargetRelocationHandler::<u></u>applyRelocation(<br>
      ELFWriter &writer, llvm::FileOutputBuffer &buf, const<br>
      lld::AtomLayout &atom,<br>
      const Reference &ref) const {<br>
+  AtomLayout *gpAtom = _mipsTargetLayout.getGP();<br>
+  uint64_t gpAddr = gpAtom ? gpAtom->_virtualAddr : 0;<br>
+<br>
    uint8_t *atomContent = buf.getBufferStart() + atom._fileOffset;<br>
    uint8_t *location = atomContent + ref.offsetInAtom();<br>
    uint64_t targetVAddress = writer.addressOfAtom(ref.<u></u>target());<br>
@@ -191,16 +188,14 @@ error_code MipsTargetRelocationHandler::<br>
      break;<br>
    case R_MIPS_LO16:<br>
      relocLo16(location, relocVAddress, targetVAddress, calcAHL(0,<br>
      ref.addend()),<br>
-              _targetHandler.<u></u>getGPDispSymAddr(),<br>
-              ref.target()->name() == "_gp_disp");<br>
-    applyPairedRelocations(writer, buf, atom, ref.addend());<br>
+              gpAddr, ref.target()->name() == "_gp_disp");<br>
+    applyPairedRelocations(writer, buf, atom, gpAddr, ref.addend());<br>
      break;<br>
    case R_MIPS_GOT16:<br>
      savePairedRelocation(atom, ref);<br>
      break;<br>
    case R_MIPS_CALL16:<br>
-    relocCall16(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
-                _targetHandler.<u></u>getGPDispSymAddr());<br>
+    relocCall16(location, relocVAddress, targetVAddress,<br>
ref.addend(), gpAddr);<br>
      break;<br>
    case R_MIPS_JALR:<br>
      // We do not do JALR optimization now.<br>
@@ -212,8 +207,7 @@ error_code MipsTargetRelocationHandler::<br>
      // Do nothing.<br>
      break;<br>
    case LLD_R_MIPS_GLOBAL_GOT16:<br>
-    relocGOT16(location, relocVAddress, targetVAddress,<br>
ref.addend(),<br>
-               _targetHandler.<u></u>getGPDispSymAddr());<br>
+    relocGOT16(location, relocVAddress, targetVAddress,<br>
ref.addend(), gpAddr);<br>
      break;<br>
    case LLD_R_MIPS_GLOBAL_26:<br>
      reloc26(location, relocVAddress, targetVAddress, false);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.h?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsRelocationHandler.h?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/<u></u>MipsRelocationHandler.h Sun<br>
Jan 26 19:21:02 2014<br>
@@ -19,8 +19,9 @@ class MipsTargetHandler;<br>
  class MipsTargetRelocationHandler LLVM_FINAL<br>
      : public TargetRelocationHandler<<u></u>Mips32ElELFType> {<br>
  public:<br>
-  MipsTargetRelocationHandler(<u></u>const MipsLinkingContext &context,<br>
-                              const MipsTargetHandler &handler);<br>
+  MipsTargetRelocationHandler(<u></u>MipsLinkingContext &context,<br>
+                              MipsTargetLayout<<u></u>Mips32ElELFType><br>
&layout)<br>
+      : _mipsLinkingContext(context), _mipsTargetLayout(layout) {}<br>
      ~MipsTargetRelocationHandler()<u></u>;<br>
  @@ -29,8 +30,6 @@ public:<br>
                                       const Reference &) const;<br>
    private:<br>
-  const MipsTargetHandler &_targetHandler;<br>
-<br>
    typedef std::vector<const Reference *> PairedRelocationsT;<br>
    typedef std::unordered_map<const lld::AtomLayout *,<br>
    PairedRelocationsT><br>
    PairedRelocationMapT;<br>
@@ -40,8 +39,11 @@ private:<br>
    void savePairedRelocation(const lld::AtomLayout &atom,<br>
                              const Reference &ref) const;<br>
    void applyPairedRelocations(<u></u>ELFWriter &writer,<br>
    llvm::FileOutputBuffer &buf,<br>
-                              const lld::AtomLayout &atom,<br>
+                              const lld::AtomLayout &atom, int64_t<br>
gpAddr,<br>
                                int64_t loAddend) const;<br>
+<br>
+  MipsLinkingContext &_mipsLinkingContext LLVM_ATTRIBUTE_UNUSED;<br>
+  MipsTargetLayout<<u></u>Mips32ElELFType> &_mipsTargetLayout;<br>
  };<br>
    } // elf<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=200177&r1=200176&r2=200177&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/Mips/<u></u>MipsTargetHandler.cpp?rev=<u></u>200177&r1=200176&r2=200177&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/Mips/MipsTargetHandler.cpp Sun Jan<br>
26 19:21:02 2014<br>
@@ -10,201 +10,35 @@<br>
  #include "ELFFile.h"<br>
  #include "MipsLinkingContext.h"<br>
  #include "MipsTargetHandler.h"<br>
+#include "MipsExecutableWriter.h"<br>
+#include "MipsDynamicLibraryWriter.h"<br>
    using namespace lld;<br>
  using namespace elf;<br>
  -namespace {<br>
-<br>
-class MipsDynamicSymbolTable : public<br>
DynamicSymbolTable<<u></u>Mips32ElELFType> {<br>
-public:<br>
-  MipsDynamicSymbolTable(const MipsLinkingContext &context)<br>
-      : DynamicSymbolTable<<u></u>Mips32ElELFType>(<br>
-            context, ".dynsym",<br>
-            DefaultLayout<Mips32ElELFType><u></u>::ORDER_DYNAMIC_SYMBOLS),<br>
-        _layout(context.<u></u>getTargetLayout()) {}<br>
-<br>
-  virtual void sortSymbols() {<br>
-    std::stable_sort(_symbolTable.<u></u>begin(), _symbolTable.end(),<br>
-                     [this](const SymbolEntry &A, const SymbolEntry<br>
&B) {<br>
-      if (A._symbol.getBinding() != STB_GLOBAL &&<br>
-          B._symbol.getBinding() != STB_GLOBAL)<br>
-        return A._symbol.getBinding() < B._symbol.getBinding();<br>
-<br>
-      return _layout.getGOTSection().<u></u>compare(A._atom, B._atom);<br>
-    });<br>
-  }<br>
-<br>
-private:<br>
-  const MipsTargetLayout<<u></u>Mips32ElELFType> &_layout;<br>
-};<br>
-<br>
-class MipsDynamicTable : public DynamicTable<Mips32ElELFType> {<br>
-public:<br>
-  MipsDynamicTable(<u></u>MipsLinkingContext &context)<br>
-      : DynamicTable<Mips32ElELFType>(<br>
-            context, ".dynamic",<br>
DefaultLayout<Mips32ElELFType><u></u>::ORDER_DYNAMIC),<br>
-        _layout(context.<u></u>getTargetLayout()) {}<br>
-<br>
-  virtual void createDefaultEntries() {<br>
-    DynamicTable<Mips32ElELFType>:<u></u>:createDefaultEntries();<br>
-<br>
-    Elf_Dyn dyn;<br>
-<br>
-    // Version id for the Runtime Linker Interface.<br>
-    dyn.d_un.d_val = 1;<br>
-    dyn.d_tag = DT_MIPS_RLD_VERSION;<br>
-    addEntry(dyn);<br>
-<br>
-    // MIPS flags.<br>
-    dyn.d_un.d_val = RHF_NOTPOT;<br>
-    dyn.d_tag = DT_MIPS_FLAGS;<br>
-    addEntry(dyn);<br>
-<br>
-    // The base address of the segment.<br>
-    dyn.d_un.d_ptr = 0;<br>
-    dyn.d_tag = DT_MIPS_BASE_ADDRESS;<br>
-    _dt_baseaddr = addEntry(dyn);<br>
-<br>
-    // Number of local global offset table entries.<br>
-    dyn.d_un.d_val = 0;<br>
-    dyn.d_tag = DT_MIPS_LOCAL_GOTNO;</blockquote></blockquote>
</blockquote></div><br></div></div>