<div dir="ltr"><div>Once you start code review, you'll have to wait LGTM from a reviewer. Getting no response does not mean it's accepted. In this case it's even worse because you submitted the change only 4 minutes after you posted a comment on Phab while we are talking about the patch. It's not cool and not acceptable in LLVM.</div>

<div><br></div><div>If you have already got LGTM in the last code review, you could re-submit, but it's not applicable to this case because you didn't get LGTM in the previous review too.</div></div><div class="gmail_extra">

<br><br><div class="gmail_quote">On Tue, Oct 29, 2013 at 8:38 AM, 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 Rui,<br>
<br>
Can you let me know if what were the comments that have not been addressed. I will address it now.<br>
<br>
I am trying to figure out if any of your critical review comments are not addressed.<br>
<br>
This part of the patch was already reviewed earlier, this was only a change that was rebased to trunk in addition to review comments that was sent earlier on this.<br>
<br>
Thanks<br>
<br>
Shankar Easwaran<div class="HOEnZb"><div class="h5"><br>
<br>
On 10/29/2013 12:51 AM, Rui Ueyama wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I hate to say, but I was still actively reviewing your patch when you<br>
submitted. I realized that after sending the last comments on Phab and came<br>
back to my inbox. My comments were not really addressed, and no one hadn't<br>
sent LGTM. You shouldn't have submitted it in the middle of code review...<br>
<br>
<br>
On Mon, Oct 28, 2013 at 10:12 PM, Shankar Easwaran<br>
<<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>><u></u>wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: shankare<br>
Date: Tue Oct 29 00:12:14 2013<br>
New Revision: 193585<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=193585&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=193585&view=rev</a><br>
Log:<br>
[PassManager] add ReaderWriter{Native,YAML} to the Driver.<br>
<br>
Enable this for the following flavors<br>
<br>
a) core<br>
b) gnu<br>
c) darwin<br>
<br>
Its disabled for the flavor PECOFF. Convenient markers are added with FIXME<br>
comments in the Driver that would be removed and code removed from each<br>
flavor.<br>
<br>
Added:<br>
     lld/trunk/include/lld/Passes/<u></u>RoundTripNativePass.h<br>
     lld/trunk/include/lld/Passes/<u></u>RoundTripYAMLPass.h<br>
     lld/trunk/lib/Passes/<u></u>RoundTripNativePass.cpp<br>
     lld/trunk/lib/Passes/<u></u>RoundTripYAMLPass.cpp<br>
     lld/trunk/test/elf/roundtrip.<u></u>test<br>
Modified:<br>
     lld/trunk/include/lld/Core/<u></u>LinkingContext.h<br>
     lld/trunk/include/lld/Core/<u></u>Pass.h<br>
     lld/trunk/include/lld/Core/<u></u>PassManager.h<br>
     lld/trunk/include/lld/Core/<u></u>Resolver.h<br>
     lld/trunk/include/lld/Passes/<u></u>LayoutPass.h<br>
     lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>CoreLinkingContext.h<br>
     lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>ELFLinkingContext.h<br>
     lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>MachOLinkingContext.h<br>
     lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>PECOFFLinkingContext.h<br>
     lld/trunk/include/lld/<u></u>ReaderWriter/Simple.h<br>
     lld/trunk/lib/Core/<u></u>LinkingContext.cpp<br>
     lld/trunk/lib/Core/<u></u>PassManager.cpp<br>
     lld/trunk/lib/Core/Resolver.<u></u>cpp<br>
     lld/trunk/lib/Driver/Driver.<u></u>cpp<br>
     lld/trunk/lib/Passes/<u></u>CMakeLists.txt<br>
     lld/trunk/lib/Passes/GOTPass.<u></u>cpp<br>
     lld/trunk/lib/Passes/<u></u>LayoutPass.cpp<br>
     lld/trunk/lib/Passes/<u></u>StubsPass.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>CoreLinkingContext.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/ELFLinkingContext.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonLinkingContext.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/Hexagon/<u></u>HexagonTargetHandler.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCLinkingContext.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationPass.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>MachO/MachOLinkingContext.cpp<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/GroupedSectionsPass.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.h<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp<br>
<br>
Modified: lld/trunk/include/lld/Core/<u></u>LinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Core/LinkingContext.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Core/<u></u>LinkingContext.h (original)<br>
+++ lld/trunk/include/lld/Core/<u></u>LinkingContext.h Tue Oct 29 00:12:14 2013<br>
@@ -293,7 +293,7 @@ public:<br>
<br>
    /// This method is called by core linking to build the list of Passes<br>
to be<br>
    /// run on the merged/linked graph of all input files.<br>
-  virtual void addPasses(PassManager &pm) const;<br>
+  virtual void addPasses(PassManager &pm);<br>
<br>
    /// Calls through to the writeFile() method on the specified Writer.<br>
    ///<br>
<br>
Modified: lld/trunk/include/lld/Core/<u></u>Pass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Pass.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Core/Pass.h?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Core/<u></u>Pass.h (original)<br>
+++ lld/trunk/include/lld/Core/<u></u>Pass.h Tue Oct 29 00:12:14 2013<br>
@@ -36,7 +36,7 @@ public:<br>
    virtual ~Pass() { }<br>
<br>
    /// Do the actual work of the Pass.<br>
-  virtual void perform(MutableFile &mergedFile) = 0;<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile) = 0;<br>
<br>
  protected:<br>
    // Only subclassess can be instantiated.<br>
@@ -53,7 +53,7 @@ public:<br>
    /// Scans all Atoms looking for call-site uses of SharedLibraryAtoms<br>
    /// and transfroms the call-site to call a stub instead using the<br>
    /// helper methods below.<br>
-  virtual void perform(MutableFile &mergedFile);<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile);<br>
<br>
    /// If true, the pass should use stubs for references<br>
    /// to shared library symbols. If false, the pass<br>
@@ -87,7 +87,7 @@ public:<br>
    /// Scans all Atoms looking for pointer to SharedLibraryAtoms<br>
    /// and transfroms them to a pointer to a GOT entry using the<br>
    /// helper methods below.<br>
-  virtual void perform(MutableFile &mergedFile);<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile);<br>
<br>
    /// If true, the pass will use GOT entries for references<br>
    /// to shared library symbols. If false, the pass<br>
<br>
Modified: lld/trunk/include/lld/Core/<u></u>PassManager.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/PassManager.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Core/PassManager.h?rev=193585&<u></u>r1=193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Core/<u></u>PassManager.h (original)<br>
+++ lld/trunk/include/lld/Core/<u></u>PassManager.h Tue Oct 29 00:12:14 2013<br>
@@ -32,7 +32,7 @@ public:<br>
      _passes.push_back(std::move(<u></u>pass));<br>
    }<br>
<br>
-  ErrorOr<void> runOnFile(MutableFile &);<br>
+  ErrorOr<void> runOnFile(std::unique_ptr<<u></u>MutableFile> &);<br>
<br>
  private:<br>
    /// \brief Passes in the order they should run.<br>
<br>
Modified: lld/trunk/include/lld/Core/<u></u>Resolver.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Core/Resolver.h?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Core/<u></u>Resolver.h (original)<br>
+++ lld/trunk/include/lld/Core/<u></u>Resolver.h Tue Oct 29 00:12:14 2013<br>
@@ -37,8 +37,9 @@ public:<br>
    };<br>
<br>
    Resolver(LinkingContext &context)<br>
-      : _context(context), _symbolTable(context), _result(context),<br>
-        _haveLLVMObjs(false), _addToFinalSection(false) {}<br>
+      : _context(context), _symbolTable(context),<br>
+        _result(new MergedFile(context)), _haveLLVMObjs(false),<br>
+        _addToFinalSection(false) {}<br>
<br>
    virtual ~Resolver() {}<br>
<br>
@@ -62,9 +63,7 @@ public:<br>
    /// @brief do work of merging and resolving and return list<br>
    bool resolve();<br>
<br>
-  MutableFile& resultFile() {<br>
-    return _result;<br>
-  }<br>
+  std::unique_ptr<MutableFile> resultFile() { return std::move(_result); }<br>
<br>
  private:<br>
<br>
@@ -117,7 +116,7 @@ private:<br>
    std::set<const Atom *>        _deadStripRoots;<br>
    std::vector<const Atom *>     _<u></u>atomsWithUnresolvedReferences;<br>
    llvm::DenseSet<const Atom *>  _liveAtoms;<br>
-  MergedFile                    _result;<br>
+  std::unique_ptr<MergedFile> _result;<br>
    bool                          _haveLLVMObjs;<br>
    bool _addToFinalSection;<br>
  };<br>
<br>
Modified: lld/trunk/include/lld/Passes/<u></u>LayoutPass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Passes/LayoutPass.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Passes/LayoutPass.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Passes/<u></u>LayoutPass.h (original)<br>
+++ lld/trunk/include/lld/Passes/<u></u>LayoutPass.h Tue Oct 29 00:12:14 2013<br>
@@ -48,7 +48,7 @@ public:<br>
    LayoutPass() : Pass(), _compareAtoms(*this) {}<br>
<br>
    /// Sorts atoms in mergedFile by content type then by command line<br>
order.<br>
-  virtual void perform(MutableFile &mergedFile);<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile);<br>
<br>
    virtual ~LayoutPass() {}<br>
<br>
<br>
Added: lld/trunk/include/lld/Passes/<u></u>RoundTripNativePass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Passes/RoundTripNativePass.h?rev=193585&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Passes/RoundTripNativePass.h?<u></u>rev=193585&view=auto</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Passes/<u></u>RoundTripNativePass.h (added)<br>
+++ lld/trunk/include/lld/Passes/<u></u>RoundTripNativePass.h Tue Oct 29 00:12:14<br>
2013<br>
@@ -0,0 +1,41 @@<br>
+//===--Passes/<u></u>RoundTripNativePass.h - Write Native file/Read it<br>
back------===//<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>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef LLD_PASSES_ROUND_TRIP_NATIVE_<u></u>PASS_H<br>
+#define LLD_PASSES_ROUND_TRIP_NATIVE_<u></u>PASS_H<br>
+<br>
+#include "lld/Core/File.h"<br>
+#include "lld/Core/LinkingContext.h"<br>
+#include "lld/Core/Pass.h"<br>
+<br>
+#include <map><br>
+#include <vector><br>
+<br>
+namespace lld {<br>
+class RoundTripNativePass : public Pass {<br>
+public:<br>
+  RoundTripNativePass(<u></u>LinkingContext &context) : Pass(),<br>
_context(context) {}<br>
+<br>
+  /// Writes to a native file and reads the atoms from the native file<br>
back.<br>
+  /// Replaces mergedFile with the contents of the native File.<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile);<br>
+<br>
+  virtual ~RoundTripNativePass() {}<br>
+<br>
+private:<br>
+  LinkingContext &_context;<br>
+  // Keep the parsed file alive for the rest of the link. All atoms<br>
+  // that are created by the RoundTripNativePass are owned by the<br>
+  // nativeFile.<br>
+  std::vector<std::unique_ptr<<u></u>File> > _nativeFile;<br>
+};<br>
+<br>
+} // namespace lld<br>
+<br>
+#endif // LLD_PASSES_ROUND_TRIP_NATIVE_<u></u>PASS_H<br>
<br>
Added: lld/trunk/include/lld/Passes/<u></u>RoundTripYAMLPass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Passes/RoundTripYAMLPass.h?rev=193585&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>Passes/RoundTripYAMLPass.h?<u></u>rev=193585&view=auto</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/Passes/<u></u>RoundTripYAMLPass.h (added)<br>
+++ lld/trunk/include/lld/Passes/<u></u>RoundTripYAMLPass.h Tue Oct 29 00:12:14<br>
2013<br>
@@ -0,0 +1,41 @@<br>
+//===--Passes/<u></u>RoundTripYAMLPass.h- Write YAML file/Read it<br>
back-----------===//<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>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef LLD_PASSES_ROUND_TRIP_YAML_<u></u>PASS_H<br>
+#define LLD_PASSES_ROUND_TRIP_YAML_<u></u>PASS_H<br>
+<br>
+#include "lld/Core/File.h"<br>
+#include "lld/Core/LinkingContext.h"<br>
+#include "lld/Core/Pass.h"<br>
+<br>
+#include <map><br>
+#include <vector><br>
+<br>
+namespace lld {<br>
+class RoundTripYAMLPass : public Pass {<br>
+public:<br>
+  RoundTripYAMLPass(<u></u>LinkingContext &context) : Pass(), _context(context)<br>
{}<br>
+<br>
+  /// Writes to a YAML file and reads the atoms from the YAML file back.<br>
+  /// Replaces the mergedFile with new contents.<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile);<br>
+<br>
+  virtual ~RoundTripYAMLPass() {}<br>
+<br>
+private:<br>
+  LinkingContext &_context;<br>
+  // Keep the parsed file alive for the rest of the link. All atoms<br>
+  // that are created by the RoundTripYAMLPass are owned by the<br>
+  // yamlFile.<br>
+  std::vector<std::unique_ptr<<u></u>File> > _yamlFile;<br>
+};<br>
+<br>
+} // namespace lld<br>
+<br>
+#endif // LLD_PASSES_ROUND_TRIP_YAML_<u></u>PASS_H<br>
<br>
Modified: lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>CoreLinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/CoreLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>CoreLinkingContext.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>CoreLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>CoreLinkingContext.h Tue Oct 29<br>
00:12:14 2013<br>
@@ -23,7 +23,7 @@ public:<br>
    CoreLinkingContext();<br>
<br>
    virtual bool validateImpl(raw_ostream &diagnostics);<br>
-  virtual void addPasses(PassManager &pm) const;<br>
+  virtual void addPasses(PassManager &pm);<br>
    virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str)<br>
const;<br>
    virtual ErrorOr<std::string> stringFromRelocKind(Reference:<u></u>:Kind kind)<br>
const;<br>
<br>
<br>
Modified: lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>ELFLinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>ELFLinkingContext.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>ELFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>ELFLinkingContext.h Tue Oct 29<br>
00:12:14 2013<br>
@@ -130,7 +130,7 @@ public:<br>
      return static_cast<lld::elf::<u></u>TargetHandler<ELFT><br>
&>(*_targetHandler.get());<br>
    }<br>
<br>
-  virtual void addPasses(PassManager &pm) const;<br>
+  virtual void addPasses(PassManager &pm);<br>
<br>
    void setTriple(llvm::Triple trip) { _triple = trip; }<br>
    void setNoInhibitExec(bool v) { _noInhibitExec = v; }<br>
<br>
Modified: lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>MachOLinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>MachOLinkingContext.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>MachOLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>MachOLinkingContext.h Tue Oct 29<br>
00:12:14 2013<br>
@@ -27,7 +27,7 @@ public:<br>
    MachOLinkingContext();<br>
    ~MachOLinkingContext();<br>
<br>
-  virtual void addPasses(PassManager &pm) const;<br>
+  virtual void addPasses(PassManager &pm);<br>
    virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str)<br>
const;<br>
    virtual ErrorOr<std::string> stringFromRelocKind(Reference:<u></u>:Kind kind)<br>
const;<br>
    virtual bool validateImpl(raw_ostream &diagnostics);<br>
<br>
Modified: lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>PECOFFLinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>PECOFFLinkingContext.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>PECOFFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/<u></u>PECOFFLinkingContext.h Tue Oct 29<br>
00:12:14 2013<br>
@@ -65,7 +65,7 @@ public:<br>
    virtual Writer &writer() const;<br>
    virtual bool validateImpl(raw_ostream &diagnostics);<br>
<br>
-  virtual void addPasses(PassManager &pm) const;<br>
+  virtual void addPasses(PassManager &pm);<br>
<br>
    virtual bool<br>
    createImplicitFiles(std::<u></u>vector<std::unique_ptr<File> > &result) const;<br>
<br>
Modified: lld/trunk/include/lld/<u></u>ReaderWriter/Simple.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/Simple.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/include/lld/<u></u>ReaderWriter/Simple.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/include/lld/<u></u>ReaderWriter/Simple.h (original)<br>
+++ lld/trunk/include/lld/<u></u>ReaderWriter/Simple.h Tue Oct 29 00:12:14 2013<br>
@@ -62,13 +62,31 @@ public:<br>
      return make_range(_definedAtoms._<u></u>atoms);<br>
    }<br>
<br>
-private:<br>
+protected:<br>
    atom_collection_vector<<u></u>DefinedAtom> _definedAtoms;<br>
    atom_collection_vector<<u></u>UndefinedAtom> _undefinedAtoms;<br>
    atom_collection_vector<<u></u>SharedLibraryAtom> _sharedLibraryAtoms;<br>
    atom_collection_vector<<u></u>AbsoluteAtom> _absoluteAtoms;<br>
  };<br>
<br>
+class FileToMutable : public SimpleFile {<br>
+public:<br>
+  explicit FileToMutable(const LinkingContext &context, File &file)<br>
+      : SimpleFile(context, file.path()), _file(file) {<br>
+    for (auto definedAtom : _file.defined())<br>
+      _definedAtoms._atoms.push_<u></u>back(std::move(definedAtom));<br>
+    for (auto undefAtom : _file.undefined())<br>
+      _undefinedAtoms._atoms.push_<u></u>back(std::move(undefAtom));<br>
+    for (auto shlibAtom : _file.sharedLibrary())<br>
+      _sharedLibraryAtoms._atoms.<u></u>push_back(std::move(shlibAtom)<u></u>);<br>
+    for (auto absAtom : _file.absolute())<br>
+      _absoluteAtoms._atoms.push_<u></u>back(std::move(absAtom));<br>
+  }<br>
+<br>
+private:<br>
+  const File &_file;<br>
+};<br>
+<br>
  class SimpleReference : public Reference {<br>
  public:<br>
    SimpleReference(Reference::<u></u>Kind k, uint64_t off, const Atom *t,<br>
<br>
Modified: lld/trunk/lib/Core/<u></u>LinkingContext.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/LinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Core/<u></u>LinkingContext.cpp?rev=193585&<u></u>r1=193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Core/<u></u>LinkingContext.cpp (original)<br>
+++ lld/trunk/lib/Core/<u></u>LinkingContext.cpp Tue Oct 29 00:12:14 2013<br>
@@ -108,6 +108,6 @@ ErrorOr<File &> LinkingContext::nextFile<br>
    }<br>
  }<br>
<br>
-void LinkingContext::addPasses(<u></u>PassManager &pm) const {}<br>
+void LinkingContext::addPasses(<u></u>PassManager &pm) {}<br>
<br>
  } // end namespace lld<br>
<br>
Modified: lld/trunk/lib/Core/<u></u>PassManager.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/PassManager.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Core/<u></u>PassManager.cpp?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Core/<u></u>PassManager.cpp (original)<br>
+++ lld/trunk/lib/Core/<u></u>PassManager.cpp Tue Oct 29 00:12:14 2013<br>
@@ -15,7 +15,7 @@<br>
  #include "llvm/Support/ErrorOr.h"<br>
<br>
  namespace lld {<br>
-ErrorOr<void> PassManager::runOnFile(<u></u>MutableFile &mf) {<br>
+ErrorOr<void> PassManager::runOnFile(std::<u></u>unique_ptr<MutableFile> &mf) {<br>
    for (auto &pass : _passes) {<br>
      pass->perform(mf);<br>
    }<br>
<br>
Modified: lld/trunk/lib/Core/Resolver.<u></u>cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Core/<u></u>Resolver.cpp?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Core/Resolver.<u></u>cpp (original)<br>
+++ lld/trunk/lib/Core/Resolver.<u></u>cpp Tue Oct 29 00:12:14 2013<br>
@@ -480,7 +480,7 @@ bool Resolver::resolve() {<br>
    }<br>
    this-><u></u>removeCoalescedAwayAtoms();<br>
    this->linkTimeOptimize();<br>
-  this->_result.addAtoms(_atoms)<u></u>;<br>
+  this->_result->addAtoms(_<u></u>atoms);<br>
    return true;<br>
  }<br>
<br>
<br>
Modified: lld/trunk/lib/Driver/Driver.<u></u>cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Driver.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Driver/<u></u>Driver.cpp?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Driver/Driver.<u></u>cpp (original)<br>
+++ lld/trunk/lib/Driver/Driver.<u></u>cpp Tue Oct 29 00:12:14 2013<br>
@@ -16,6 +16,8 @@<br>
  #include "lld/Core/Resolver.h"<br>
  #include "lld/ReaderWriter/Reader.h"<br>
  #include "lld/ReaderWriter/Writer.h"<br>
+#include "lld/Passes/<u></u>RoundTripNativePass.h"<br>
+#include "lld/Passes/RoundTripYAMLPass.<u></u>h"<br>
<br>
  #include "llvm/ADT/StringExtras.h"<br>
  #include "llvm/ADT/StringSwitch.h"<br>
@@ -105,19 +107,27 @@ bool Driver::link(LinkingContext &contex<br>
    Resolver resolver(context);<br>
    if (!resolver.resolve())<br>
      return false;<br>
-  MutableFile &merged = resolver.resultFile();<br>
+  std::unique_ptr<MutableFile> merged = resolver.resultFile();<br>
    resolveTask.end();<br>
<br>
    // Run passes on linked atoms.<br>
    ScopedTask passTask(getDefaultDomain(), "Passes");<br>
    PassManager pm;<br>
    context.addPasses(pm);<br>
+<br>
+// TODO: Replace the code with #ifndef NDEBUG after fixing the<br>
+// failures with pecoff<br>
+#ifdef FIXME<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripNativePass(context)))<u></u>;<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripYAMLPass(context)));<br>
+#endif<br>
+<br>
    pm.runOnFile(merged);<br>
    passTask.end();<br>
<br>
    // Give linked atoms to Writer to generate output file.<br>
    ScopedTask writeTask(getDefaultDomain(), "Write");<br>
-  if (error_code ec = context.writeFile(merged)) {<br>
+  if (error_code ec = context.writeFile(*merged)) {<br>
      diagnostics << "Failed to write file '" << context.outputPath()<br>
                  << "': " << ec.message() << "\n";<br>
      return false;<br>
<br>
Modified: lld/trunk/lib/Passes/<u></u>CMakeLists.txt<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/CMakeLists.txt?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Passes/<u></u>CMakeLists.txt?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Passes/<u></u>CMakeLists.txt (original)<br>
+++ lld/trunk/lib/Passes/<u></u>CMakeLists.txt Tue Oct 29 00:12:14 2013<br>
@@ -2,4 +2,8 @@ add_lld_library(lldPasses<br>
    GOTPass.cpp<br>
    StubsPass.cpp<br>
    LayoutPass.cpp<br>
+  RoundTripNativePass.cpp<br>
+  RoundTripYAMLPass.cpp<br>
    )<br>
+<br>
+target_link_libraries(<u></u>lldPasses lldReaderWriter)<br>
<br>
Modified: lld/trunk/lib/Passes/GOTPass.<u></u>cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/GOTPass.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Passes/<u></u>GOTPass.cpp?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Passes/GOTPass.<u></u>cpp (original)<br>
+++ lld/trunk/lib/Passes/GOTPass.<u></u>cpp Tue Oct 29 00:12:14 2013<br>
@@ -67,12 +67,12 @@ findGOTAtom(const Atom *target,<br>
  }<br>
  } // end anonymous namespace<br>
<br>
-void GOTPass::perform(MutableFile &mergedFile) {<br>
+void GOTPass::perform(std::unique_<u></u>ptr<MutableFile> &mergedFile) {<br>
    // Use map so all pointers to same symbol use same GOT entry.<br>
    llvm::DenseMap<const Atom*, const DefinedAtom*> targetToGOT;<br>
<br>
    // Scan all references in all atoms.<br>
-  for(const DefinedAtom *atom : mergedFile.defined()) {<br>
+  for (const DefinedAtom *atom : mergedFile->defined()) {<br>
      for (const Reference *ref : *atom) {<br>
        // Look at instructions accessing the GOT.<br>
        bool canBypassGOT;<br>
@@ -102,7 +102,7 @@ void GOTPass::perform(MutableFile &merge<br>
<br>
    // add all created GOT Atoms to master file<br>
    for (auto &it : targetToGOT) {<br>
-    mergedFile.addAtom(*it.second)<u></u>;<br>
+    mergedFile->addAtom(*it.<u></u>second);<br>
    }<br>
  }<br>
  }<br>
<br>
Modified: lld/trunk/lib/Passes/<u></u>LayoutPass.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/LayoutPass.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Passes/<u></u>LayoutPass.cpp?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Passes/<u></u>LayoutPass.cpp (original)<br>
+++ lld/trunk/lib/Passes/<u></u>LayoutPass.cpp Tue Oct 29 00:12:14 2013<br>
@@ -1,4 +1,4 @@<br>
-//===- Passes/LayoutPass.cpp - Layout atoms<br>
------------------------------<u></u>-===//<br>
+//===--Passes/LayoutPass.cpp - Layout atoms<br>
------------------------------<u></u>-===//<br>
  //<br>
  //                             The LLVM Linker<br>
  //<br>
@@ -6,7 +6,6 @@<br>
  // License. See LICENSE.TXT for details.<br>
  //<br>
<br>
  //===-------------------------<u></u>------------------------------<u></u>---------------===//<br>
<br>
-//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
<br>
  #define DEBUG_TYPE "LayoutPass"<br>
<br>
@@ -534,9 +533,9 @@ void LayoutPass::<u></u>checkFollowonChain(Muta<br>
  #endif  // #ifndef NDEBUG<br>
<br>
  /// Perform the actual pass<br>
-void LayoutPass::perform(<u></u>MutableFile &mergedFile) {<br>
+void LayoutPass::perform(std::<u></u>unique_ptr<MutableFile> &mergedFile) {<br>
    ScopedTask task(getDefaultDomain(), "LayoutPass");<br>
-  MutableFile::DefinedAtomRange atomRange = mergedFile.definedAtoms();<br>
+  MutableFile::DefinedAtomRange atomRange = mergedFile->definedAtoms();<br>
<br>
    // Build follow on tables<br>
    buildFollowOnTable(atomRange);<br>
<br>
Added: lld/trunk/lib/Passes/<u></u>RoundTripNativePass.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/RoundTripNativePass.cpp?rev=193585&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Passes/<u></u>RoundTripNativePass.cpp?rev=<u></u>193585&view=auto</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Passes/<u></u>RoundTripNativePass.cpp (added)<br>
+++ lld/trunk/lib/Passes/<u></u>RoundTripNativePass.cpp Tue Oct 29 00:12:14 2013<br>
@@ -0,0 +1,44 @@<br>
+//===--Passes/<u></u>RoundTripNativePass.cpp - Write Native file/Read it<br>
back-----===//<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>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#define DEBUG_TYPE "RoundTripNativePass"<br>
+<br>
+#include "lld/Core/Instrumentation.h"<br>
+#include "lld/Passes/<u></u>RoundTripNativePass.h"<br>
+#include "lld/ReaderWriter/Simple.h"<br>
+#include "lld/ReaderWriter/Writer.h"<br>
+<br>
+#include "llvm/Support/Path.h"<br>
+<br>
+using namespace lld;<br>
+<br>
+/// Perform the actual pass<br>
+void RoundTripNativePass::perform(<u></u>std::unique_ptr<MutableFile><br>
&mergedFile) {<br>
+  ScopedTask task(getDefaultDomain(), "RoundTripNativePass");<br>
+  std::unique_ptr<Writer> nativeWriter = createWriterNative(_context);<br>
+  SmallString<128> tmpNativeFile;<br>
+  // Separate the directory from the filename<br>
+  StringRef outFile = llvm::sys::path::filename(_<u></u>context.outputPath());<br>
+  if (llvm::sys::fs::<u></u>createTemporaryFile(outFile, "native",<br>
tmpNativeFile))<br>
+    return;<br>
+<br>
+  // The file that is written would be kept around if there is a problem<br>
+  // writing to the file or when reading atoms back from the file.<br>
+  nativeWriter->writeFile(*<u></u>mergedFile, tmpNativeFile.str());<br>
+  llvm::OwningPtr<llvm::<u></u>MemoryBuffer> buff;<br>
+  if (llvm::MemoryBuffer::<u></u>getFileOrSTDIN(tmpNativeFile.<u></u>str(), buff))<br>
+    return;<br>
+<br>
+  std::unique_ptr<MemoryBuffer> mb(buff.take());<br>
+  _context.getNativeReader().<u></u>parseFile(mb, _nativeFile);<br>
+<br>
+  mergedFile.reset(new FileToMutable(_context, *_nativeFile[0].get()));<br>
+<br>
+  llvm::sys::fs::remove(<u></u>tmpNativeFile.str());<br>
+}<br>
<br>
Added: lld/trunk/lib/Passes/<u></u>RoundTripYAMLPass.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/RoundTripYAMLPass.cpp?rev=193585&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Passes/<u></u>RoundTripYAMLPass.cpp?rev=<u></u>193585&view=auto</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Passes/<u></u>RoundTripYAMLPass.cpp (added)<br>
+++ lld/trunk/lib/Passes/<u></u>RoundTripYAMLPass.cpp Tue Oct 29 00:12:14 2013<br>
@@ -0,0 +1,43 @@<br>
+//===--Passes/<u></u>RoundTripYAMLPass.cpp - Write YAML file/Read it<br>
back---------===//<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>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+#define DEBUG_TYPE "RoundTripYAMLPass"<br>
+<br>
+#include "lld/Core/Instrumentation.h"<br>
+#include "lld/Passes/RoundTripYAMLPass.<u></u>h"<br>
+#include "lld/ReaderWriter/Simple.h"<br>
+#include "lld/ReaderWriter/Writer.h"<br>
+<br>
+#include "llvm/Support/Path.h"<br>
+<br>
+using namespace lld;<br>
+<br>
+/// Perform the actual pass<br>
+void RoundTripYAMLPass::perform(<u></u>std::unique_ptr<MutableFile> &mergedFile)<br>
{<br>
+  ScopedTask task(getDefaultDomain(), "RoundTripYAMLPass");<br>
+  std::unique_ptr<Writer> yamlWriter = createWriterYAML(_context);<br>
+  SmallString<128> tmpYAMLFile;<br>
+  // Separate the directory from the filename<br>
+  StringRef outFile = llvm::sys::path::filename(_<u></u>context.outputPath());<br>
+  if (llvm::sys::fs::<u></u>createTemporaryFile(outFile, "yaml", tmpYAMLFile))<br>
+    return;<br>
+<br>
+  // The file that is written would be kept around if there is a problem<br>
+  // writing to the file or when reading atoms back from the file.<br>
+  yamlWriter->writeFile(*<u></u>mergedFile, tmpYAMLFile.str());<br>
+  llvm::OwningPtr<llvm::<u></u>MemoryBuffer> buff;<br>
+  if (llvm::MemoryBuffer::<u></u>getFileOrSTDIN(tmpYAMLFile.<u></u>str(), buff))<br>
+    return;<br>
+<br>
+  std::unique_ptr<MemoryBuffer> mb(buff.take());<br>
+  _context.getYAMLReader().<u></u>parseFile(mb, _yamlFile);<br>
+<br>
+  mergedFile.reset(new FileToMutable(_context, *_yamlFile[0].get()));<br>
+<br>
+  llvm::sys::fs::remove(<u></u>tmpYAMLFile.str());<br>
+}<br>
<br>
Modified: lld/trunk/lib/Passes/<u></u>StubsPass.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/StubsPass.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/Passes/<u></u>StubsPass.cpp?rev=193585&r1=<u></u>193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/Passes/<u></u>StubsPass.cpp (original)<br>
+++ lld/trunk/lib/Passes/<u></u>StubsPass.cpp Tue Oct 29 00:12:14 2013<br>
@@ -23,13 +23,13 @@<br>
<br>
  namespace lld {<br>
<br>
-void StubsPass::perform(MutableFile &mergedFile) {<br>
+void StubsPass::perform(std::<u></u>unique_ptr<MutableFile> &mergedFile) {<br>
    // Skip this pass if output format uses text relocations instead of<br>
stubs.<br>
    if ( ! this->noTextRelocs() )<br>
      return;<br>
<br>
    // Scan all references in all atoms.<br>
-  for(const DefinedAtom *atom : mergedFile.defined()) {<br>
+  for (const DefinedAtom *atom : mergedFile->defined()) {<br>
      for (const Reference *ref : *atom) {<br>
        // Look at call-sites.<br>
        if (this->isCallSite(ref->kind()) ) {<br>
@@ -61,6 +61,6 @@ void StubsPass::perform(MutableFile &mer<br>
    }<br>
<br>
    // Add all created stubs and support Atoms.<br>
- this->addStubAtoms(mergedFile)<u></u>;<br>
+  this->addStubAtoms(*<u></u>mergedFile);<br>
  }<br>
  }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>CoreLinkingContext.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/CoreLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/<u></u>CoreLinkingContext.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>CoreLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>CoreLinkingContext.cpp Tue Oct 29 00:12:14<br>
2013<br>
@@ -12,6 +12,9 @@<br>
  #include "lld/Core/Pass.h"<br>
  #include "lld/Core/PassManager.h"<br>
  #include "lld/Passes/LayoutPass.h"<br>
+#include "lld/Passes/<u></u>RoundTripNativePass.h"<br>
+#include "lld/Passes/RoundTripYAMLPass.<u></u>h"<br>
+#include "lld/ReaderWriter/Simple.h"<br>
<br>
  #include "llvm/ADT/ArrayRef.h"<br>
<br>
@@ -149,10 +152,10 @@ private:<br>
    uint32_t _ordinal;<br>
  };<br>
<br>
-class TestingPassFile : public MutableFile {<br>
+class TestingPassFile : public SimpleFile {<br>
  public:<br>
    TestingPassFile(const LinkingContext &ctx)<br>
-      : MutableFile(ctx, "Testing pass") {}<br>
+      : SimpleFile(ctx, "Testing pass") {}<br>
<br>
    virtual void addAtom(const Atom &atom) {<br>
      if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&atom))<br>
@@ -277,7 +280,7 @@ bool CoreLinkingContext::<u></u>validateImpl(ra<br>
    return true;<br>
  }<br>
<br>
-void CoreLinkingContext::addPasses(<u></u>PassManager &pm) const {<br>
+void CoreLinkingContext::addPasses(<u></u>PassManager &pm) {<br>
    for (StringRef name : _passNames) {<br>
      if (name.equals("layout"))<br>
        pm.add(std::unique_ptr<Pass>((<u></u>new LayoutPass())));<br>
@@ -288,6 +291,10 @@ void CoreLinkingContext::addPasses(<u></u>PassM<br>
      else<br>
        llvm_unreachable("bad pass name");<br>
    }<br>
+#ifndef NDEBUG<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripYAMLPass(*this)));<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripNativePass(*this)));<br>
+#endif<br>
  }<br>
<br>
  Writer &CoreLinkingContext::writer() const { return *_writer; }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ArrayOrderPass.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>ArrayOrderPass.cpp?rev=193585&<u></u>r1=193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.cpp Tue Oct 29 00:12:14<br>
2013<br>
@@ -13,8 +13,8 @@<br>
<br>
  namespace lld {<br>
  namespace elf {<br>
-void ArrayOrderPass::perform(<u></u>MutableFile &f) {<br>
-  auto definedAtoms = f.definedAtoms();<br>
+void ArrayOrderPass::perform(std::<u></u>unique_ptr<MutableFile> &f) {<br>
+  auto definedAtoms = f->definedAtoms();<br>
    std::stable_sort(definedAtoms.<u></u>begin(), definedAtoms.end(),<br>
                     [](const DefinedAtom *left, const DefinedAtom *right) {<br>
      if (left->sectionChoice() != DefinedAtom::<u></u>sectionCustomRequired ||<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ArrayOrderPass.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>ArrayOrderPass.h?rev=193585&<u></u>r1=193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ArrayOrderPass.h Tue Oct 29 00:12:14<br>
2013<br>
@@ -18,7 +18,7 @@ namespace elf {<br>
  class ArrayOrderPass : public Pass {<br>
  public:<br>
    ArrayOrderPass() : Pass() {}<br>
-  virtual void perform(MutableFile &mergedFile) LLVM_OVERRIDE;<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile)<br>
LLVM_OVERRIDE;<br>
  };<br>
  }<br>
  }<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/ELFLinkingContext.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/<u></u>ELFLinkingContext.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/ELFLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/ELFLinkingContext.cpp Tue Oct 29<br>
00:12:14 2013<br>
@@ -16,6 +16,8 @@<br>
<br>
  #include "lld/Core/Instrumentation.h"<br>
  #include "lld/Passes/LayoutPass.h"<br>
+#include "lld/Passes/<u></u>RoundTripNativePass.h"<br>
+#include "lld/Passes/RoundTripYAMLPass.<u></u>h"<br>
  #include "lld/ReaderWriter/<u></u>ReaderLinkerScript.h"<br>
<br>
  #include "llvm/ADT/Triple.h"<br>
@@ -52,10 +54,14 @@ bool ELFLinkingContext::<u></u>isLittleEndian()<br>
    return true;<br>
  }<br>
<br>
-void ELFLinkingContext::addPasses(<u></u>PassManager &pm) const {<br>
+void ELFLinkingContext::addPasses(<u></u>PassManager &pm) {<br>
    if (_runLayoutPass)<br>
      pm.add(std::unique_ptr<Pass>(<u></u>new LayoutPass()));<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new elf::ArrayOrderPass()));<br>
+#ifndef NDEBUG<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripYAMLPass(*this)));<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripNativePass(*this)));<br>
+#endif<br>
  }<br>
<br>
  uint16_t ELFLinkingContext::<u></u>getOutputMachine() const {<br>
<br>
Modified: 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=193585&r1=193584&r2=193585&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>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<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 Tue Oct<br>
29 00:12:14 2013<br>
@@ -29,7 +29,7 @@ public:<br>
    virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str)<br>
const;<br>
    virtual ErrorOr<std::string> stringFromRelocKind(Reference:<u></u>:Kind kind)<br>
const;<br>
<br>
-  virtual void addPasses(PassManager &) const;<br>
+  virtual void addPasses(PassManager &);<br>
<br>
    virtual bool isDynamicRelocation(const DefinedAtom &,<br>
                                     const Reference &r) const {<br>
<br>
Modified: 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=193585&r1=193584&r2=193585&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>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<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 Tue<br>
Oct 29 00:12:14 2013<br>
@@ -157,9 +157,9 @@ public:<br>
    ///<br>
    /// After all references are handled, the atoms created during that are<br>
all<br>
    /// added to mf.<br>
-  virtual void perform(MutableFile &mf) {<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mf) {<br>
      // Process all references.<br>
-    for (const auto &atom : mf.defined())<br>
+    for (const auto &atom : mf->defined())<br>
        for (const auto &ref : *atom)<br>
          handleReference(*atom, *ref);<br>
<br>
@@ -167,23 +167,23 @@ public:<br>
      uint64_t ordinal = 0;<br>
      if (_PLT0) {<br>
        _PLT0->setOrdinal(ordinal++);<br>
-      mf.addAtom(*_PLT0);<br>
+      mf->addAtom(*_PLT0);<br>
      }<br>
      for (auto &plt : _pltVector) {<br>
        plt->setOrdinal(ordinal++);<br>
-      mf.addAtom(*plt);<br>
+      mf->addAtom(*plt);<br>
      }<br>
      if (_null) {<br>
        _null->setOrdinal(ordinal++);<br>
-      mf.addAtom(*_null);<br>
+      mf->addAtom(*_null);<br>
      }<br>
      if (_got0) {<br>
        _got0->setOrdinal(ordinal++);<br>
-      mf.addAtom(*_got0);<br>
+      mf->addAtom(*_got0);<br>
      }<br>
      for (auto &got : _gotVector) {<br>
        got->setOrdinal(ordinal++);<br>
-      mf.addAtom(*got);<br>
+      mf->addAtom(*got);<br>
      }<br>
    }<br>
<br>
@@ -293,7 +293,7 @@ public:<br>
  };<br>
  } // end anonymous namespace<br>
<br>
-void elf::HexagonLinkingContext::<u></u>addPasses(PassManager &pm) const {<br>
+void elf::HexagonLinkingContext::<u></u>addPasses(PassManager &pm) {<br>
    if (isDynamic())<br>
      pm.add(std::unique_ptr<Pass>(<u></u>new DynamicGOTPLTPass(*this)));<br>
    ELFLinkingContext::addPasses(<u></u>pm);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCLinkingContext.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/PPC/<u></u>PPCLinkingContext.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/PPC/PPCLinkingContext.cpp Tue Oct 29<br>
00:12:14 2013<br>
@@ -21,7 +21,7 @@ using namespace lld;<br>
  ErrorOr<Reference::Kind><br>
  elf::PPCLinkingContext::<u></u>relocKindFromString(StringRef str) const {<br>
    int32_t ret = llvm::StringSwitch<int32_t>(<u></u>str) LLD_CASE(R_PPC_NONE)<br>
-      LLD_CASE(R_PPC_ADDR32).<u></u>Default(-1);<br>
+                LLD_CASE(R_PPC_ADDR32) LLD_CASE(R_PPC_REL24).Default(<u></u>-1);<br>
<br>
    if (ret == -1)<br>
      return make_error_code(<u></u>YamlReaderError::illegal_<u></u>value);<br>
@@ -39,6 +39,7 @@ elf::PPCLinkingContext::<u></u>stringFromRelocK<br>
    switch (kind) {<br>
      LLD_CASE(R_PPC_NONE)<br>
      LLD_CASE(R_PPC_ADDR32)<br>
+    LLD_CASE(R_PPC_REL24)<br>
    }<br>
<br>
    return make_error_code(<u></u>YamlReaderError::illegal_<u></u>value);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/X86_64/X86_<u></u>64LinkingContext.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.cpp Tue Oct<br>
29 00:12:14 2013<br>
@@ -90,8 +90,7 @@ private:<br>
<br>
  } // end anon namespace<br>
<br>
-<br>
-void elf::X86_64LinkingContext::<u></u>addPasses(PassManager &pm) const {<br>
+void elf::X86_64LinkingContext::<u></u>addPasses(PassManager &pm) {<br>
    auto pass = createX86_64RelocationPass(*<u></u>this);<br>
    if (pass)<br>
      pm.add(std::move(pass));<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/X86_64/X86_<u></u>64LinkingContext.h?rev=193585&<u></u>r1=193584&r2=193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64LinkingContext.h Tue Oct<br>
29 00:12:14 2013<br>
@@ -33,7 +33,7 @@ public:<br>
        : ELFLinkingContext(triple, std::unique_ptr<<u></u>TargetHandlerBase>(<br>
                                        new X86_64TargetHandler(*this))) {}<br>
<br>
-  virtual void addPasses(PassManager &) const;<br>
+  virtual void addPasses(PassManager &);<br>
<br>
    virtual uint64_t getBaseAddress() const {<br>
      if (_baseAddress == 0)<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationPass.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/ELF/X86_64/X86_<u></u>64RelocationPass.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationPass.cpp<br>
(original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>ELF/X86_64/X86_<u></u>64RelocationPass.cpp Tue Oct<br>
29 00:12:14 2013<br>
@@ -217,10 +217,10 @@ public:<br>
    ///<br>
    /// After all references are handled, the atoms created during that are<br>
all<br>
    /// added to mf.<br>
-  virtual void perform(MutableFile &mf) {<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mf) {<br>
      ScopedTask task(getDefaultDomain(), "X86-64 GOT/PLT Pass");<br>
      // Process all references.<br>
-    for (const auto &atom : mf.defined())<br>
+    for (const auto &atom : mf->defined())<br>
        for (const auto &ref : *atom)<br>
          handleReference(*atom, *ref);<br>
<br>
@@ -228,29 +228,29 @@ public:<br>
      uint64_t ordinal = 0;<br>
      if (_PLT0) {<br>
        _PLT0->setOrdinal(ordinal++);<br>
-      mf.addAtom(*_PLT0);<br>
+      mf->addAtom(*_PLT0);<br>
      }<br>
      for (auto &plt : _pltVector) {<br>
        plt->setOrdinal(ordinal++);<br>
-      mf.addAtom(*plt);<br>
+      mf->addAtom(*plt);<br>
      }<br>
      if (_null) {<br>
        _null->setOrdinal(ordinal++);<br>
-      mf.addAtom(*_null);<br>
+      mf->addAtom(*_null);<br>
      }<br>
      if (_PLT0) {<br>
        _got0->setOrdinal(ordinal++);<br>
        _got1->setOrdinal(ordinal++);<br>
-      mf.addAtom(*_got0);<br>
-      mf.addAtom(*_got1);<br>
+      mf->addAtom(*_got0);<br>
+      mf->addAtom(*_got1);<br>
      }<br>
      for (auto &got : _gotVector) {<br>
        got->setOrdinal(ordinal++);<br>
-      mf.addAtom(*got);<br>
+      mf->addAtom(*got);<br>
      }<br>
      for (auto obj : _objectVector) {<br>
        obj->setOrdinal(ordinal++);<br>
-      mf.addAtom(*obj);<br>
+      mf->addAtom(*obj);<br>
      }<br>
    }<br>
<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>MachO/MachOLinkingContext.cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/MachO/<u></u>MachOLinkingContext.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>MachO/MachOLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>MachO/MachOLinkingContext.cpp Tue Oct 29<br>
00:12:14 2013<br>
@@ -16,6 +16,8 @@<br>
  #include "lld/ReaderWriter/Reader.h"<br>
  #include "lld/ReaderWriter/Writer.h"<br>
  #include "lld/Passes/LayoutPass.h"<br>
+#include "lld/Passes/<u></u>RoundTripNativePass.h"<br>
+#include "lld/Passes/RoundTripYAMLPass.<u></u>h"<br>
<br>
  #include "llvm/ADT/StringExtras.h"<br>
  #include "llvm/ADT/Triple.h"<br>
@@ -235,10 +237,14 @@ bool MachOLinkingContext::setOS(OS os, S<br>
    return parsePackedVersion(<u></u>minOSVersion, _osMinVersion);<br>
  }<br>
<br>
-void MachOLinkingContext::<u></u>addPasses(PassManager &pm) const {<br>
+void MachOLinkingContext::<u></u>addPasses(PassManager &pm) {<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new mach_o::GOTPass));<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new mach_o::StubsPass(*this)));<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new LayoutPass()));<br>
+#ifndef NDEBUG<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripYAMLPass(*this)));<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new RoundTripNativePass(*this)));<br>
+#endif<br>
  }<br>
<br>
  Writer &MachOLinkingContext::writer() const {<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/GroupedSectionsPass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/<u></u>GroupedSectionsPass.h?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/GroupedSectionsPass.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/GroupedSectionsPass.h Tue Oct 29<br>
00:12:14 2013<br>
@@ -60,9 +60,9 @@ class GroupedSectionsPass : public lld::<br>
  public:<br>
    GroupedSectionsPass() {}<br>
<br>
-  virtual void perform(MutableFile &mergedFile) {<br>
-    std::map<StringRef, std::vector<COFFDefinedAtom *>><br>
sectionToHeadAtoms(<br>
-        filterHeadAtoms(mergedFile));<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &mergedFile) {<br>
+    std::map<StringRef, std::vector<COFFDefinedAtom *> ><br>
sectionToHeadAtoms(<br>
+        filterHeadAtoms(*mergedFile));<br>
      std::vector<std::vector<<u></u>COFFDefinedAtom *>> groupedAtomsList(<br>
          groupBySectionName(<u></u>sectionToHeadAtoms));<br>
      for (auto &groupedAtoms : groupedAtomsList)<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.h<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/IdataPass.<u></u>h?rev=193585&r1=193584&r2=<u></u>193585&view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/IdataPass.h Tue Oct 29 00:12:14 2013<br>
@@ -252,13 +252,13 @@ class IdataPass : public lld::Pass {<br>
  public:<br>
    IdataPass(const LinkingContext &ctx) : _dummyFile(ctx) {}<br>
<br>
-  virtual void perform(MutableFile &file) {<br>
-    if (file.sharedLibrary().size() == 0)<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &file) {<br>
+    if (file->sharedLibrary().size() == 0)<br>
        return;<br>
<br>
-    Context context(file, _dummyFile);<br>
+    Context context(*file, _dummyFile);<br>
      map<StringRef, vector<COFFSharedLibraryAtom *> > sharedAtoms =<br>
-        groupByLoadName(file);<br>
+        groupByLoadName(*file);<br>
      for (auto i : sharedAtoms) {<br>
        StringRef loadName = i.first;<br>
        vector<COFFSharedLibraryAtom *> &atoms = i.second;<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/<u></u>PECOFFLinkingContext.cpp?rev=<u></u>193585&r1=193584&r2=193585&<u></u>view=diff</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp Tue Oct 29<br>
00:12:14 2013<br>
@@ -204,7 +204,7 @@ PECOFFLinkingContext::<u></u>stringFromRelocKin<br>
    return make_error_code(<u></u>YamlReaderError::illegal_<u></u>value);<br>
  }<br>
<br>
-void PECOFFLinkingContext::<u></u>addPasses(PassManager &pm) const {<br>
+void PECOFFLinkingContext::<u></u>addPasses(PassManager &pm) {<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new pecoff::GroupedSectionsPass())<u></u>);<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new pecoff::IdataPass(*this)));<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new LayoutPass()));<br>
<br>
Added: lld/trunk/test/elf/roundtrip.<u></u>test<br>
URL:<br>
<a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/roundtrip.test?rev=193585&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/elf/<u></u>roundtrip.test?rev=193585&<u></u>view=auto</a><br>


<br>
==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/elf/roundtrip.<u></u>test (added)<br>
+++ lld/trunk/test/elf/roundtrip.<u></u>test Tue Oct 29 00:12:14 2013<br>
@@ -0,0 +1,9 @@<br>
+# This tests the functionality of the RoundTrip Passes and verifies<br>
+# that the atoms belong to the native file after the passes finish<br>
+<br>
+RUN: lld -flavor gnu -target x86_64 %p/Inputs/foo.o.x86-64<br>
--noinhibit-exec  \<br>
+RUN: --output-filetype=yaml -o %t1<br>
+RUN: FileCheck %s < %t1<br>
+<br>
+CHECK:path:{{.*}}.native<br>
+<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
</blockquote></blockquote>
<br>
<br></div></div><span class="HOEnZb"><font color="#888888">
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation<br>
<br>
</font></span></blockquote></div><br></div>