[lld] r193585 - [PassManager] add ReaderWriter{Native, YAML} to the Driver.

Rui Ueyama ruiu at google.com
Tue Oct 29 10:43:24 PDT 2013


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.

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.


On Tue, Oct 29, 2013 at 8:38 AM, Shankar Easwaran
<shankare at codeaurora.org>wrote:

> Hi Rui,
>
> Can you let me know if what were the comments that have not been
> addressed. I will address it now.
>
> I am trying to figure out if any of your critical review comments are not
> addressed.
>
> 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.
>
> Thanks
>
> Shankar Easwaran
>
>
> On 10/29/2013 12:51 AM, Rui Ueyama wrote:
>
>> I hate to say, but I was still actively reviewing your patch when you
>> submitted. I realized that after sending the last comments on Phab and
>> came
>> back to my inbox. My comments were not really addressed, and no one hadn't
>> sent LGTM. You shouldn't have submitted it in the middle of code review...
>>
>>
>> On Mon, Oct 28, 2013 at 10:12 PM, Shankar Easwaran
>> <shankare at codeaurora.org>**wrote:
>>
>>  Author: shankare
>>> Date: Tue Oct 29 00:12:14 2013
>>> New Revision: 193585
>>>
>>> URL: http://llvm.org/viewvc/llvm-**project?rev=193585&view=rev<http://llvm.org/viewvc/llvm-project?rev=193585&view=rev>
>>> Log:
>>> [PassManager] add ReaderWriter{Native,YAML} to the Driver.
>>>
>>> Enable this for the following flavors
>>>
>>> a) core
>>> b) gnu
>>> c) darwin
>>>
>>> Its disabled for the flavor PECOFF. Convenient markers are added with
>>> FIXME
>>> comments in the Driver that would be removed and code removed from each
>>> flavor.
>>>
>>> Added:
>>>      lld/trunk/include/lld/Passes/**RoundTripNativePass.h
>>>      lld/trunk/include/lld/Passes/**RoundTripYAMLPass.h
>>>      lld/trunk/lib/Passes/**RoundTripNativePass.cpp
>>>      lld/trunk/lib/Passes/**RoundTripYAMLPass.cpp
>>>      lld/trunk/test/elf/roundtrip.**test
>>> Modified:
>>>      lld/trunk/include/lld/Core/**LinkingContext.h
>>>      lld/trunk/include/lld/Core/**Pass.h
>>>      lld/trunk/include/lld/Core/**PassManager.h
>>>      lld/trunk/include/lld/Core/**Resolver.h
>>>      lld/trunk/include/lld/Passes/**LayoutPass.h
>>>      lld/trunk/include/lld/**ReaderWriter/**CoreLinkingContext.h
>>>      lld/trunk/include/lld/**ReaderWriter/**ELFLinkingContext.h
>>>      lld/trunk/include/lld/**ReaderWriter/**MachOLinkingContext.h
>>>      lld/trunk/include/lld/**ReaderWriter/**PECOFFLinkingContext.h
>>>      lld/trunk/include/lld/**ReaderWriter/Simple.h
>>>      lld/trunk/lib/Core/**LinkingContext.cpp
>>>      lld/trunk/lib/Core/**PassManager.cpp
>>>      lld/trunk/lib/Core/Resolver.**cpp
>>>      lld/trunk/lib/Driver/Driver.**cpp
>>>      lld/trunk/lib/Passes/**CMakeLists.txt
>>>      lld/trunk/lib/Passes/GOTPass.**cpp
>>>      lld/trunk/lib/Passes/**LayoutPass.cpp
>>>      lld/trunk/lib/Passes/**StubsPass.cpp
>>>      lld/trunk/lib/ReaderWriter/**CoreLinkingContext.cpp
>>>      lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.cpp
>>>      lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.h
>>>      lld/trunk/lib/ReaderWriter/**ELF/ELFLinkingContext.cpp
>>>      lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**HexagonLinkingContext.h
>>>      lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**HexagonTargetHandler.cpp
>>>      lld/trunk/lib/ReaderWriter/**ELF/PPC/PPCLinkingContext.cpp
>>>      lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64LinkingContext.cpp
>>>      lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64LinkingContext.h
>>>      lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64RelocationPass.cpp
>>>      lld/trunk/lib/ReaderWriter/**MachO/MachOLinkingContext.cpp
>>>      lld/trunk/lib/ReaderWriter/**PECOFF/GroupedSectionsPass.h
>>>      lld/trunk/lib/ReaderWriter/**PECOFF/IdataPass.h
>>>      lld/trunk/lib/ReaderWriter/**PECOFF/PECOFFLinkingContext.**cpp
>>>
>>> Modified: lld/trunk/include/lld/Core/**LinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Core/LinkingContext.h?rev=**193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Core/**LinkingContext.h (original)
>>> +++ lld/trunk/include/lld/Core/**LinkingContext.h Tue Oct 29 00:12:14
>>> 2013
>>> @@ -293,7 +293,7 @@ public:
>>>
>>>     /// This method is called by core linking to build the list of Passes
>>> to be
>>>     /// run on the merged/linked graph of all input files.
>>> -  virtual void addPasses(PassManager &pm) const;
>>> +  virtual void addPasses(PassManager &pm);
>>>
>>>     /// Calls through to the writeFile() method on the specified Writer.
>>>     ///
>>>
>>> Modified: lld/trunk/include/lld/Core/**Pass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Core/Pass.h?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Pass.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Core/**Pass.h (original)
>>> +++ lld/trunk/include/lld/Core/**Pass.h Tue Oct 29 00:12:14 2013
>>> @@ -36,7 +36,7 @@ public:
>>>     virtual ~Pass() { }
>>>
>>>     /// Do the actual work of the Pass.
>>> -  virtual void perform(MutableFile &mergedFile) = 0;
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile) = 0;
>>>
>>>   protected:
>>>     // Only subclassess can be instantiated.
>>> @@ -53,7 +53,7 @@ public:
>>>     /// Scans all Atoms looking for call-site uses of SharedLibraryAtoms
>>>     /// and transfroms the call-site to call a stub instead using the
>>>     /// helper methods below.
>>> -  virtual void perform(MutableFile &mergedFile);
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile);
>>>
>>>     /// If true, the pass should use stubs for references
>>>     /// to shared library symbols. If false, the pass
>>> @@ -87,7 +87,7 @@ public:
>>>     /// Scans all Atoms looking for pointer to SharedLibraryAtoms
>>>     /// and transfroms them to a pointer to a GOT entry using the
>>>     /// helper methods below.
>>> -  virtual void perform(MutableFile &mergedFile);
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile);
>>>
>>>     /// If true, the pass will use GOT entries for references
>>>     /// to shared library symbols. If false, the pass
>>>
>>> Modified: lld/trunk/include/lld/Core/**PassManager.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Core/PassManager.h?rev=193585&**r1=193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/PassManager.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Core/**PassManager.h (original)
>>> +++ lld/trunk/include/lld/Core/**PassManager.h Tue Oct 29 00:12:14 2013
>>> @@ -32,7 +32,7 @@ public:
>>>       _passes.push_back(std::move(**pass));
>>>     }
>>>
>>> -  ErrorOr<void> runOnFile(MutableFile &);
>>> +  ErrorOr<void> runOnFile(std::unique_ptr<**MutableFile> &);
>>>
>>>   private:
>>>     /// \brief Passes in the order they should run.
>>>
>>> Modified: lld/trunk/include/lld/Core/**Resolver.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Core/Resolver.h?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/Resolver.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Core/**Resolver.h (original)
>>> +++ lld/trunk/include/lld/Core/**Resolver.h Tue Oct 29 00:12:14 2013
>>> @@ -37,8 +37,9 @@ public:
>>>     };
>>>
>>>     Resolver(LinkingContext &context)
>>> -      : _context(context), _symbolTable(context), _result(context),
>>> -        _haveLLVMObjs(false), _addToFinalSection(false) {}
>>> +      : _context(context), _symbolTable(context),
>>> +        _result(new MergedFile(context)), _haveLLVMObjs(false),
>>> +        _addToFinalSection(false) {}
>>>
>>>     virtual ~Resolver() {}
>>>
>>> @@ -62,9 +63,7 @@ public:
>>>     /// @brief do work of merging and resolving and return list
>>>     bool resolve();
>>>
>>> -  MutableFile& resultFile() {
>>> -    return _result;
>>> -  }
>>> +  std::unique_ptr<MutableFile> resultFile() { return
>>> std::move(_result); }
>>>
>>>   private:
>>>
>>> @@ -117,7 +116,7 @@ private:
>>>     std::set<const Atom *>        _deadStripRoots;
>>>     std::vector<const Atom *>     _**atomsWithUnresolvedReferences;
>>>     llvm::DenseSet<const Atom *>  _liveAtoms;
>>> -  MergedFile                    _result;
>>> +  std::unique_ptr<MergedFile> _result;
>>>     bool                          _haveLLVMObjs;
>>>     bool _addToFinalSection;
>>>   };
>>>
>>> Modified: lld/trunk/include/lld/Passes/**LayoutPass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Passes/LayoutPass.h?rev=**193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Passes/LayoutPass.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Passes/**LayoutPass.h (original)
>>> +++ lld/trunk/include/lld/Passes/**LayoutPass.h Tue Oct 29 00:12:14 2013
>>> @@ -48,7 +48,7 @@ public:
>>>     LayoutPass() : Pass(), _compareAtoms(*this) {}
>>>
>>>     /// Sorts atoms in mergedFile by content type then by command line
>>> order.
>>> -  virtual void perform(MutableFile &mergedFile);
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile);
>>>
>>>     virtual ~LayoutPass() {}
>>>
>>>
>>> Added: lld/trunk/include/lld/Passes/**RoundTripNativePass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Passes/RoundTripNativePass.h?**rev=193585&view=auto<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Passes/RoundTripNativePass.h?rev=193585&view=auto>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Passes/**RoundTripNativePass.h (added)
>>> +++ lld/trunk/include/lld/Passes/**RoundTripNativePass.h Tue Oct 29
>>> 00:12:14
>>> 2013
>>> @@ -0,0 +1,41 @@
>>> +//===--Passes/**RoundTripNativePass.h - Write Native file/Read it
>>> back------===//
>>> +//
>>> +//                             The LLVM Linker
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===------------------------**------------------------------**
>>> ----------------===//
>>> +
>>> +#ifndef LLD_PASSES_ROUND_TRIP_NATIVE_**PASS_H
>>> +#define LLD_PASSES_ROUND_TRIP_NATIVE_**PASS_H
>>> +
>>> +#include "lld/Core/File.h"
>>> +#include "lld/Core/LinkingContext.h"
>>> +#include "lld/Core/Pass.h"
>>> +
>>> +#include <map>
>>> +#include <vector>
>>> +
>>> +namespace lld {
>>> +class RoundTripNativePass : public Pass {
>>> +public:
>>> +  RoundTripNativePass(**LinkingContext &context) : Pass(),
>>> _context(context) {}
>>> +
>>> +  /// Writes to a native file and reads the atoms from the native file
>>> back.
>>> +  /// Replaces mergedFile with the contents of the native File.
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile);
>>> +
>>> +  virtual ~RoundTripNativePass() {}
>>> +
>>> +private:
>>> +  LinkingContext &_context;
>>> +  // Keep the parsed file alive for the rest of the link. All atoms
>>> +  // that are created by the RoundTripNativePass are owned by the
>>> +  // nativeFile.
>>> +  std::vector<std::unique_ptr<**File> > _nativeFile;
>>> +};
>>> +
>>> +} // namespace lld
>>> +
>>> +#endif // LLD_PASSES_ROUND_TRIP_NATIVE_**PASS_H
>>>
>>> Added: lld/trunk/include/lld/Passes/**RoundTripYAMLPass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> Passes/RoundTripYAMLPass.h?**rev=193585&view=auto<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Passes/RoundTripYAMLPass.h?rev=193585&view=auto>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/Passes/**RoundTripYAMLPass.h (added)
>>> +++ lld/trunk/include/lld/Passes/**RoundTripYAMLPass.h Tue Oct 29
>>> 00:12:14
>>> 2013
>>> @@ -0,0 +1,41 @@
>>> +//===--Passes/**RoundTripYAMLPass.h- Write YAML file/Read it
>>> back-----------===//
>>> +//
>>> +//                             The LLVM Linker
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===------------------------**------------------------------**
>>> ----------------===//
>>> +
>>> +#ifndef LLD_PASSES_ROUND_TRIP_YAML_**PASS_H
>>> +#define LLD_PASSES_ROUND_TRIP_YAML_**PASS_H
>>> +
>>> +#include "lld/Core/File.h"
>>> +#include "lld/Core/LinkingContext.h"
>>> +#include "lld/Core/Pass.h"
>>> +
>>> +#include <map>
>>> +#include <vector>
>>> +
>>> +namespace lld {
>>> +class RoundTripYAMLPass : public Pass {
>>> +public:
>>> +  RoundTripYAMLPass(**LinkingContext &context) : Pass(),
>>> _context(context)
>>> {}
>>> +
>>> +  /// Writes to a YAML file and reads the atoms from the YAML file back.
>>> +  /// Replaces the mergedFile with new contents.
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile);
>>> +
>>> +  virtual ~RoundTripYAMLPass() {}
>>> +
>>> +private:
>>> +  LinkingContext &_context;
>>> +  // Keep the parsed file alive for the rest of the link. All atoms
>>> +  // that are created by the RoundTripYAMLPass are owned by the
>>> +  // yamlFile.
>>> +  std::vector<std::unique_ptr<**File> > _yamlFile;
>>> +};
>>> +
>>> +} // namespace lld
>>> +
>>> +#endif // LLD_PASSES_ROUND_TRIP_YAML_**PASS_H
>>>
>>> Modified: lld/trunk/include/lld/**ReaderWriter/**CoreLinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> ReaderWriter/**CoreLinkingContext.h?rev=**193585&r1=193584&r2=193585&**
>>> view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/CoreLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/**ReaderWriter/**CoreLinkingContext.h
>>> (original)
>>> +++ lld/trunk/include/lld/**ReaderWriter/**CoreLinkingContext.h Tue Oct
>>> 29
>>> 00:12:14 2013
>>> @@ -23,7 +23,7 @@ public:
>>>     CoreLinkingContext();
>>>
>>>     virtual bool validateImpl(raw_ostream &diagnostics);
>>> -  virtual void addPasses(PassManager &pm) const;
>>> +  virtual void addPasses(PassManager &pm);
>>>     virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str)
>>> const;
>>>     virtual ErrorOr<std::string> stringFromRelocKind(Reference:**:Kind
>>> kind)
>>> const;
>>>
>>>
>>> Modified: lld/trunk/include/lld/**ReaderWriter/**ELFLinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> ReaderWriter/**ELFLinkingContext.h?rev=**193585&r1=193584&r2=193585&**
>>> view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/**ReaderWriter/**ELFLinkingContext.h
>>> (original)
>>> +++ lld/trunk/include/lld/**ReaderWriter/**ELFLinkingContext.h Tue Oct
>>> 29
>>> 00:12:14 2013
>>> @@ -130,7 +130,7 @@ public:
>>>       return static_cast<lld::elf::**TargetHandler<ELFT>
>>> &>(*_targetHandler.get());
>>>     }
>>>
>>> -  virtual void addPasses(PassManager &pm) const;
>>> +  virtual void addPasses(PassManager &pm);
>>>
>>>     void setTriple(llvm::Triple trip) { _triple = trip; }
>>>     void setNoInhibitExec(bool v) { _noInhibitExec = v; }
>>>
>>> Modified: lld/trunk/include/lld/**ReaderWriter/**MachOLinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> ReaderWriter/**MachOLinkingContext.h?rev=**193585&r1=193584&r2=193585&**
>>> view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/MachOLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/**ReaderWriter/**MachOLinkingContext.h
>>> (original)
>>> +++ lld/trunk/include/lld/**ReaderWriter/**MachOLinkingContext.h Tue
>>> Oct 29
>>> 00:12:14 2013
>>> @@ -27,7 +27,7 @@ public:
>>>     MachOLinkingContext();
>>>     ~MachOLinkingContext();
>>>
>>> -  virtual void addPasses(PassManager &pm) const;
>>> +  virtual void addPasses(PassManager &pm);
>>>     virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str)
>>> const;
>>>     virtual ErrorOr<std::string> stringFromRelocKind(Reference:**:Kind
>>> kind)
>>> const;
>>>     virtual bool validateImpl(raw_ostream &diagnostics);
>>>
>>> Modified: lld/trunk/include/lld/**ReaderWriter/**PECOFFLinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> ReaderWriter/**PECOFFLinkingContext.h?rev=**193585&r1=193584&r2=193585&*
>>> *view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/**ReaderWriter/**PECOFFLinkingContext.h
>>> (original)
>>> +++ lld/trunk/include/lld/**ReaderWriter/**PECOFFLinkingContext.h Tue
>>> Oct 29
>>> 00:12:14 2013
>>> @@ -65,7 +65,7 @@ public:
>>>     virtual Writer &writer() const;
>>>     virtual bool validateImpl(raw_ostream &diagnostics);
>>>
>>> -  virtual void addPasses(PassManager &pm) const;
>>> +  virtual void addPasses(PassManager &pm);
>>>
>>>     virtual bool
>>>     createImplicitFiles(std::**vector<std::unique_ptr<File> > &result)
>>> const;
>>>
>>> Modified: lld/trunk/include/lld/**ReaderWriter/Simple.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/include/lld/**
>>> ReaderWriter/Simple.h?rev=**193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/Simple.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/include/lld/**ReaderWriter/Simple.h (original)
>>> +++ lld/trunk/include/lld/**ReaderWriter/Simple.h Tue Oct 29 00:12:14
>>> 2013
>>> @@ -62,13 +62,31 @@ public:
>>>       return make_range(_definedAtoms._**atoms);
>>>     }
>>>
>>> -private:
>>> +protected:
>>>     atom_collection_vector<**DefinedAtom> _definedAtoms;
>>>     atom_collection_vector<**UndefinedAtom> _undefinedAtoms;
>>>     atom_collection_vector<**SharedLibraryAtom> _sharedLibraryAtoms;
>>>     atom_collection_vector<**AbsoluteAtom> _absoluteAtoms;
>>>   };
>>>
>>> +class FileToMutable : public SimpleFile {
>>> +public:
>>> +  explicit FileToMutable(const LinkingContext &context, File &file)
>>> +      : SimpleFile(context, file.path()), _file(file) {
>>> +    for (auto definedAtom : _file.defined())
>>> +      _definedAtoms._atoms.push_**back(std::move(definedAtom));
>>> +    for (auto undefAtom : _file.undefined())
>>> +      _undefinedAtoms._atoms.push_**back(std::move(undefAtom));
>>> +    for (auto shlibAtom : _file.sharedLibrary())
>>> +      _sharedLibraryAtoms._atoms.**push_back(std::move(shlibAtom)**);
>>> +    for (auto absAtom : _file.absolute())
>>> +      _absoluteAtoms._atoms.push_**back(std::move(absAtom));
>>> +  }
>>> +
>>> +private:
>>> +  const File &_file;
>>> +};
>>> +
>>>   class SimpleReference : public Reference {
>>>   public:
>>>     SimpleReference(Reference::**Kind k, uint64_t off, const Atom *t,
>>>
>>> Modified: lld/trunk/lib/Core/**LinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Core/**
>>> LinkingContext.cpp?rev=193585&**r1=193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/LinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Core/**LinkingContext.cpp (original)
>>> +++ lld/trunk/lib/Core/**LinkingContext.cpp Tue Oct 29 00:12:14 2013
>>> @@ -108,6 +108,6 @@ ErrorOr<File &> LinkingContext::nextFile
>>>     }
>>>   }
>>>
>>> -void LinkingContext::addPasses(**PassManager &pm) const {}
>>> +void LinkingContext::addPasses(**PassManager &pm) {}
>>>
>>>   } // end namespace lld
>>>
>>> Modified: lld/trunk/lib/Core/**PassManager.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Core/**
>>> PassManager.cpp?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/PassManager.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Core/**PassManager.cpp (original)
>>> +++ lld/trunk/lib/Core/**PassManager.cpp Tue Oct 29 00:12:14 2013
>>> @@ -15,7 +15,7 @@
>>>   #include "llvm/Support/ErrorOr.h"
>>>
>>>   namespace lld {
>>> -ErrorOr<void> PassManager::runOnFile(**MutableFile &mf) {
>>> +ErrorOr<void> PassManager::runOnFile(std::**unique_ptr<MutableFile>
>>> &mf) {
>>>     for (auto &pass : _passes) {
>>>       pass->perform(mf);
>>>     }
>>>
>>> Modified: lld/trunk/lib/Core/Resolver.**cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Core/**
>>> Resolver.cpp?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Core/Resolver.**cpp (original)
>>> +++ lld/trunk/lib/Core/Resolver.**cpp Tue Oct 29 00:12:14 2013
>>> @@ -480,7 +480,7 @@ bool Resolver::resolve() {
>>>     }
>>>     this->**removeCoalescedAwayAtoms();
>>>     this->linkTimeOptimize();
>>> -  this->_result.addAtoms(_atoms)**;
>>> +  this->_result->addAtoms(_**atoms);
>>>     return true;
>>>   }
>>>
>>>
>>> Modified: lld/trunk/lib/Driver/Driver.**cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Driver/**
>>> Driver.cpp?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Driver.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Driver/Driver.**cpp (original)
>>> +++ lld/trunk/lib/Driver/Driver.**cpp Tue Oct 29 00:12:14 2013
>>> @@ -16,6 +16,8 @@
>>>   #include "lld/Core/Resolver.h"
>>>   #include "lld/ReaderWriter/Reader.h"
>>>   #include "lld/ReaderWriter/Writer.h"
>>> +#include "lld/Passes/**RoundTripNativePass.h"
>>> +#include "lld/Passes/RoundTripYAMLPass.**h"
>>>
>>>   #include "llvm/ADT/StringExtras.h"
>>>   #include "llvm/ADT/StringSwitch.h"
>>> @@ -105,19 +107,27 @@ bool Driver::link(LinkingContext &contex
>>>     Resolver resolver(context);
>>>     if (!resolver.resolve())
>>>       return false;
>>> -  MutableFile &merged = resolver.resultFile();
>>> +  std::unique_ptr<MutableFile> merged = resolver.resultFile();
>>>     resolveTask.end();
>>>
>>>     // Run passes on linked atoms.
>>>     ScopedTask passTask(getDefaultDomain(), "Passes");
>>>     PassManager pm;
>>>     context.addPasses(pm);
>>> +
>>> +// TODO: Replace the code with #ifndef NDEBUG after fixing the
>>> +// failures with pecoff
>>> +#ifdef FIXME
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripNativePass(context)))**;
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripYAMLPass(context)));
>>> +#endif
>>> +
>>>     pm.runOnFile(merged);
>>>     passTask.end();
>>>
>>>     // Give linked atoms to Writer to generate output file.
>>>     ScopedTask writeTask(getDefaultDomain(), "Write");
>>> -  if (error_code ec = context.writeFile(merged)) {
>>> +  if (error_code ec = context.writeFile(*merged)) {
>>>       diagnostics << "Failed to write file '" << context.outputPath()
>>>                   << "': " << ec.message() << "\n";
>>>       return false;
>>>
>>> Modified: lld/trunk/lib/Passes/**CMakeLists.txt
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Passes/**
>>> CMakeLists.txt?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/CMakeLists.txt?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Passes/**CMakeLists.txt (original)
>>> +++ lld/trunk/lib/Passes/**CMakeLists.txt Tue Oct 29 00:12:14 2013
>>> @@ -2,4 +2,8 @@ add_lld_library(lldPasses
>>>     GOTPass.cpp
>>>     StubsPass.cpp
>>>     LayoutPass.cpp
>>> +  RoundTripNativePass.cpp
>>> +  RoundTripYAMLPass.cpp
>>>     )
>>> +
>>> +target_link_libraries(**lldPasses lldReaderWriter)
>>>
>>> Modified: lld/trunk/lib/Passes/GOTPass.**cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Passes/**
>>> GOTPass.cpp?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/GOTPass.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Passes/GOTPass.**cpp (original)
>>> +++ lld/trunk/lib/Passes/GOTPass.**cpp Tue Oct 29 00:12:14 2013
>>> @@ -67,12 +67,12 @@ findGOTAtom(const Atom *target,
>>>   }
>>>   } // end anonymous namespace
>>>
>>> -void GOTPass::perform(MutableFile &mergedFile) {
>>> +void GOTPass::perform(std::unique_**ptr<MutableFile> &mergedFile) {
>>>     // Use map so all pointers to same symbol use same GOT entry.
>>>     llvm::DenseMap<const Atom*, const DefinedAtom*> targetToGOT;
>>>
>>>     // Scan all references in all atoms.
>>> -  for(const DefinedAtom *atom : mergedFile.defined()) {
>>> +  for (const DefinedAtom *atom : mergedFile->defined()) {
>>>       for (const Reference *ref : *atom) {
>>>         // Look at instructions accessing the GOT.
>>>         bool canBypassGOT;
>>> @@ -102,7 +102,7 @@ void GOTPass::perform(MutableFile &merge
>>>
>>>     // add all created GOT Atoms to master file
>>>     for (auto &it : targetToGOT) {
>>> -    mergedFile.addAtom(*it.second)**;
>>> +    mergedFile->addAtom(*it.**second);
>>>     }
>>>   }
>>>   }
>>>
>>> Modified: lld/trunk/lib/Passes/**LayoutPass.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Passes/**
>>> LayoutPass.cpp?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/LayoutPass.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Passes/**LayoutPass.cpp (original)
>>> +++ lld/trunk/lib/Passes/**LayoutPass.cpp Tue Oct 29 00:12:14 2013
>>> @@ -1,4 +1,4 @@
>>> -//===- Passes/LayoutPass.cpp - Layout atoms
>>> ------------------------------**-===//
>>> +//===--Passes/LayoutPass.cpp - Layout atoms
>>> ------------------------------**-===//
>>>   //
>>>   //                             The LLVM Linker
>>>   //
>>> @@ -6,7 +6,6 @@
>>>   // License. See LICENSE.TXT for details.
>>>   //
>>>
>>>   //===-------------------------**------------------------------**
>>> ---------------===//
>>>
>>> -//===------------------------**------------------------------**
>>> ----------------===//
>>>
>>>   #define DEBUG_TYPE "LayoutPass"
>>>
>>> @@ -534,9 +533,9 @@ void LayoutPass::**checkFollowonChain(Muta
>>>   #endif  // #ifndef NDEBUG
>>>
>>>   /// Perform the actual pass
>>> -void LayoutPass::perform(**MutableFile &mergedFile) {
>>> +void LayoutPass::perform(std::**unique_ptr<MutableFile> &mergedFile) {
>>>     ScopedTask task(getDefaultDomain(), "LayoutPass");
>>> -  MutableFile::DefinedAtomRange atomRange = mergedFile.definedAtoms();
>>> +  MutableFile::DefinedAtomRange atomRange = mergedFile->definedAtoms();
>>>
>>>     // Build follow on tables
>>>     buildFollowOnTable(atomRange);
>>>
>>> Added: lld/trunk/lib/Passes/**RoundTripNativePass.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Passes/**
>>> RoundTripNativePass.cpp?rev=**193585&view=auto<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/RoundTripNativePass.cpp?rev=193585&view=auto>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Passes/**RoundTripNativePass.cpp (added)
>>> +++ lld/trunk/lib/Passes/**RoundTripNativePass.cpp Tue Oct 29 00:12:14
>>> 2013
>>> @@ -0,0 +1,44 @@
>>> +//===--Passes/**RoundTripNativePass.cpp - Write Native file/Read it
>>> back-----===//
>>> +//
>>> +//                             The LLVM Linker
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===------------------------**------------------------------**
>>> ----------------===//
>>> +
>>> +#define DEBUG_TYPE "RoundTripNativePass"
>>> +
>>> +#include "lld/Core/Instrumentation.h"
>>> +#include "lld/Passes/**RoundTripNativePass.h"
>>> +#include "lld/ReaderWriter/Simple.h"
>>> +#include "lld/ReaderWriter/Writer.h"
>>> +
>>> +#include "llvm/Support/Path.h"
>>> +
>>> +using namespace lld;
>>> +
>>> +/// Perform the actual pass
>>> +void RoundTripNativePass::perform(**std::unique_ptr<MutableFile>
>>> &mergedFile) {
>>> +  ScopedTask task(getDefaultDomain(), "RoundTripNativePass");
>>> +  std::unique_ptr<Writer> nativeWriter = createWriterNative(_context);
>>> +  SmallString<128> tmpNativeFile;
>>> +  // Separate the directory from the filename
>>> +  StringRef outFile = llvm::sys::path::filename(_**
>>> context.outputPath());
>>> +  if (llvm::sys::fs::**createTemporaryFile(outFile, "native",
>>> tmpNativeFile))
>>> +    return;
>>> +
>>> +  // The file that is written would be kept around if there is a problem
>>> +  // writing to the file or when reading atoms back from the file.
>>> +  nativeWriter->writeFile(***mergedFile, tmpNativeFile.str());
>>> +  llvm::OwningPtr<llvm::**MemoryBuffer> buff;
>>> +  if (llvm::MemoryBuffer::**getFileOrSTDIN(tmpNativeFile.**str(),
>>> buff))
>>> +    return;
>>> +
>>> +  std::unique_ptr<MemoryBuffer> mb(buff.take());
>>> +  _context.getNativeReader().**parseFile(mb, _nativeFile);
>>> +
>>> +  mergedFile.reset(new FileToMutable(_context, *_nativeFile[0].get()));
>>> +
>>> +  llvm::sys::fs::remove(**tmpNativeFile.str());
>>> +}
>>>
>>> Added: lld/trunk/lib/Passes/**RoundTripYAMLPass.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Passes/**
>>> RoundTripYAMLPass.cpp?rev=**193585&view=auto<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/RoundTripYAMLPass.cpp?rev=193585&view=auto>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Passes/**RoundTripYAMLPass.cpp (added)
>>> +++ lld/trunk/lib/Passes/**RoundTripYAMLPass.cpp Tue Oct 29 00:12:14
>>> 2013
>>> @@ -0,0 +1,43 @@
>>> +//===--Passes/**RoundTripYAMLPass.cpp - Write YAML file/Read it
>>> back---------===//
>>> +//
>>> +//                             The LLVM Linker
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===------------------------**------------------------------**
>>> ----------------===//
>>> +#define DEBUG_TYPE "RoundTripYAMLPass"
>>> +
>>> +#include "lld/Core/Instrumentation.h"
>>> +#include "lld/Passes/RoundTripYAMLPass.**h"
>>> +#include "lld/ReaderWriter/Simple.h"
>>> +#include "lld/ReaderWriter/Writer.h"
>>> +
>>> +#include "llvm/Support/Path.h"
>>> +
>>> +using namespace lld;
>>> +
>>> +/// Perform the actual pass
>>> +void RoundTripYAMLPass::perform(**std::unique_ptr<MutableFile>
>>> &mergedFile)
>>> {
>>> +  ScopedTask task(getDefaultDomain(), "RoundTripYAMLPass");
>>> +  std::unique_ptr<Writer> yamlWriter = createWriterYAML(_context);
>>> +  SmallString<128> tmpYAMLFile;
>>> +  // Separate the directory from the filename
>>> +  StringRef outFile = llvm::sys::path::filename(_**
>>> context.outputPath());
>>> +  if (llvm::sys::fs::**createTemporaryFile(outFile, "yaml",
>>> tmpYAMLFile))
>>> +    return;
>>> +
>>> +  // The file that is written would be kept around if there is a problem
>>> +  // writing to the file or when reading atoms back from the file.
>>> +  yamlWriter->writeFile(***mergedFile, tmpYAMLFile.str());
>>> +  llvm::OwningPtr<llvm::**MemoryBuffer> buff;
>>> +  if (llvm::MemoryBuffer::**getFileOrSTDIN(tmpYAMLFile.**str(), buff))
>>> +    return;
>>> +
>>> +  std::unique_ptr<MemoryBuffer> mb(buff.take());
>>> +  _context.getYAMLReader().**parseFile(mb, _yamlFile);
>>> +
>>> +  mergedFile.reset(new FileToMutable(_context, *_yamlFile[0].get()));
>>> +
>>> +  llvm::sys::fs::remove(**tmpYAMLFile.str());
>>> +}
>>>
>>> Modified: lld/trunk/lib/Passes/**StubsPass.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/Passes/**
>>> StubsPass.cpp?rev=193585&r1=**193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Passes/StubsPass.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/Passes/**StubsPass.cpp (original)
>>> +++ lld/trunk/lib/Passes/**StubsPass.cpp Tue Oct 29 00:12:14 2013
>>> @@ -23,13 +23,13 @@
>>>
>>>   namespace lld {
>>>
>>> -void StubsPass::perform(MutableFile &mergedFile) {
>>> +void StubsPass::perform(std::**unique_ptr<MutableFile> &mergedFile) {
>>>     // Skip this pass if output format uses text relocations instead of
>>> stubs.
>>>     if ( ! this->noTextRelocs() )
>>>       return;
>>>
>>>     // Scan all references in all atoms.
>>> -  for(const DefinedAtom *atom : mergedFile.defined()) {
>>> +  for (const DefinedAtom *atom : mergedFile->defined()) {
>>>       for (const Reference *ref : *atom) {
>>>         // Look at call-sites.
>>>         if (this->isCallSite(ref->kind()) ) {
>>> @@ -61,6 +61,6 @@ void StubsPass::perform(MutableFile &mer
>>>     }
>>>
>>>     // Add all created stubs and support Atoms.
>>> - this->addStubAtoms(mergedFile)**;
>>> +  this->addStubAtoms(***mergedFile);
>>>   }
>>>   }
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**CoreLinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**ReaderWriter/**
>>> CoreLinkingContext.cpp?rev=**193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/CoreLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**CoreLinkingContext.cpp (original)
>>> +++ lld/trunk/lib/ReaderWriter/**CoreLinkingContext.cpp Tue Oct 29
>>> 00:12:14
>>> 2013
>>> @@ -12,6 +12,9 @@
>>>   #include "lld/Core/Pass.h"
>>>   #include "lld/Core/PassManager.h"
>>>   #include "lld/Passes/LayoutPass.h"
>>> +#include "lld/Passes/**RoundTripNativePass.h"
>>> +#include "lld/Passes/RoundTripYAMLPass.**h"
>>> +#include "lld/ReaderWriter/Simple.h"
>>>
>>>   #include "llvm/ADT/ArrayRef.h"
>>>
>>> @@ -149,10 +152,10 @@ private:
>>>     uint32_t _ordinal;
>>>   };
>>>
>>> -class TestingPassFile : public MutableFile {
>>> +class TestingPassFile : public SimpleFile {
>>>   public:
>>>     TestingPassFile(const LinkingContext &ctx)
>>> -      : MutableFile(ctx, "Testing pass") {}
>>> +      : SimpleFile(ctx, "Testing pass") {}
>>>
>>>     virtual void addAtom(const Atom &atom) {
>>>       if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&atom))
>>> @@ -277,7 +280,7 @@ bool CoreLinkingContext::**validateImpl(ra
>>>     return true;
>>>   }
>>>
>>> -void CoreLinkingContext::addPasses(**PassManager &pm) const {
>>> +void CoreLinkingContext::addPasses(**PassManager &pm) {
>>>     for (StringRef name : _passNames) {
>>>       if (name.equals("layout"))
>>>         pm.add(std::unique_ptr<Pass>((**new LayoutPass())));
>>> @@ -288,6 +291,10 @@ void CoreLinkingContext::addPasses(**PassM
>>>       else
>>>         llvm_unreachable("bad pass name");
>>>     }
>>> +#ifndef NDEBUG
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripYAMLPass(*this)));
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripNativePass(*this)));
>>> +#endif
>>>   }
>>>
>>>   Writer &CoreLinkingContext::writer() const { return *_writer; }
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**ReaderWriter/ELF/*
>>> *ArrayOrderPass.cpp?rev=193585&**r1=193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ArrayOrderPass.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.cpp (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.cpp Tue Oct 29
>>> 00:12:14
>>> 2013
>>> @@ -13,8 +13,8 @@
>>>
>>>   namespace lld {
>>>   namespace elf {
>>> -void ArrayOrderPass::perform(**MutableFile &f) {
>>> -  auto definedAtoms = f.definedAtoms();
>>> +void ArrayOrderPass::perform(std::**unique_ptr<MutableFile> &f) {
>>> +  auto definedAtoms = f->definedAtoms();
>>>     std::stable_sort(definedAtoms.**begin(), definedAtoms.end(),
>>>                      [](const DefinedAtom *left, const DefinedAtom
>>> *right) {
>>>       if (left->sectionChoice() != DefinedAtom::**sectionCustomRequired
>>> ||
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**ReaderWriter/ELF/*
>>> *ArrayOrderPass.h?rev=193585&**r1=193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ArrayOrderPass.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.h (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/ArrayOrderPass.h Tue Oct 29
>>> 00:12:14
>>> 2013
>>> @@ -18,7 +18,7 @@ namespace elf {
>>>   class ArrayOrderPass : public Pass {
>>>   public:
>>>     ArrayOrderPass() : Pass() {}
>>> -  virtual void perform(MutableFile &mergedFile) LLVM_OVERRIDE;
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile)
>>> LLVM_OVERRIDE;
>>>   };
>>>   }
>>>   }
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/ELFLinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**ReaderWriter/ELF/*
>>> *ELFLinkingContext.cpp?rev=**193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/ELFLinkingContext.cpp (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/ELFLinkingContext.cpp Tue Oct 29
>>> 00:12:14 2013
>>> @@ -16,6 +16,8 @@
>>>
>>>   #include "lld/Core/Instrumentation.h"
>>>   #include "lld/Passes/LayoutPass.h"
>>> +#include "lld/Passes/**RoundTripNativePass.h"
>>> +#include "lld/Passes/RoundTripYAMLPass.**h"
>>>   #include "lld/ReaderWriter/**ReaderLinkerScript.h"
>>>
>>>   #include "llvm/ADT/Triple.h"
>>> @@ -52,10 +54,14 @@ bool ELFLinkingContext::**isLittleEndian()
>>>     return true;
>>>   }
>>>
>>> -void ELFLinkingContext::addPasses(**PassManager &pm) const {
>>> +void ELFLinkingContext::addPasses(**PassManager &pm) {
>>>     if (_runLayoutPass)
>>>       pm.add(std::unique_ptr<Pass>(**new LayoutPass()));
>>>     pm.add(std::unique_ptr<Pass>(**new elf::ArrayOrderPass()));
>>> +#ifndef NDEBUG
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripYAMLPass(*this)));
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripNativePass(*this)));
>>> +#endif
>>>   }
>>>
>>>   uint16_t ELFLinkingContext::**getOutputMachine() const {
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**
>>> HexagonLinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/ELF/Hexagon/**HexagonLinkingContext.h?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**HexagonLinkingContext.h
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**HexagonLinkingContext.h
>>> Tue Oct
>>> 29 00:12:14 2013
>>> @@ -29,7 +29,7 @@ public:
>>>     virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str)
>>> const;
>>>     virtual ErrorOr<std::string> stringFromRelocKind(Reference:**:Kind
>>> kind)
>>> const;
>>>
>>> -  virtual void addPasses(PassManager &) const;
>>> +  virtual void addPasses(PassManager &);
>>>
>>>     virtual bool isDynamicRelocation(const DefinedAtom &,
>>>                                      const Reference &r) const {
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**
>>> HexagonTargetHandler.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/ELF/Hexagon/**HexagonTargetHandler.cpp?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**HexagonTargetHandler.cpp
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/Hexagon/**HexagonTargetHandler.cpp
>>> Tue
>>> Oct 29 00:12:14 2013
>>> @@ -157,9 +157,9 @@ public:
>>>     ///
>>>     /// After all references are handled, the atoms created during that
>>> are
>>> all
>>>     /// added to mf.
>>> -  virtual void perform(MutableFile &mf) {
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mf) {
>>>       // Process all references.
>>> -    for (const auto &atom : mf.defined())
>>> +    for (const auto &atom : mf->defined())
>>>         for (const auto &ref : *atom)
>>>           handleReference(*atom, *ref);
>>>
>>> @@ -167,23 +167,23 @@ public:
>>>       uint64_t ordinal = 0;
>>>       if (_PLT0) {
>>>         _PLT0->setOrdinal(ordinal++);
>>> -      mf.addAtom(*_PLT0);
>>> +      mf->addAtom(*_PLT0);
>>>       }
>>>       for (auto &plt : _pltVector) {
>>>         plt->setOrdinal(ordinal++);
>>> -      mf.addAtom(*plt);
>>> +      mf->addAtom(*plt);
>>>       }
>>>       if (_null) {
>>>         _null->setOrdinal(ordinal++);
>>> -      mf.addAtom(*_null);
>>> +      mf->addAtom(*_null);
>>>       }
>>>       if (_got0) {
>>>         _got0->setOrdinal(ordinal++);
>>> -      mf.addAtom(*_got0);
>>> +      mf->addAtom(*_got0);
>>>       }
>>>       for (auto &got : _gotVector) {
>>>         got->setOrdinal(ordinal++);
>>> -      mf.addAtom(*got);
>>> +      mf->addAtom(*got);
>>>       }
>>>     }
>>>
>>> @@ -293,7 +293,7 @@ public:
>>>   };
>>>   } // end anonymous namespace
>>>
>>> -void elf::HexagonLinkingContext::**addPasses(PassManager &pm) const {
>>> +void elf::HexagonLinkingContext::**addPasses(PassManager &pm) {
>>>     if (isDynamic())
>>>       pm.add(std::unique_ptr<Pass>(**new DynamicGOTPLTPass(*this)));
>>>     ELFLinkingContext::addPasses(**pm);
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/PPC/PPCLinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/ELF/PPC/**PPCLinkingContext.cpp?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/PPC/PPCLinkingContext.cpp
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/PPC/PPCLinkingContext.cpp Tue Oct
>>> 29
>>> 00:12:14 2013
>>> @@ -21,7 +21,7 @@ using namespace lld;
>>>   ErrorOr<Reference::Kind>
>>>   elf::PPCLinkingContext::**relocKindFromString(StringRef str) const {
>>>     int32_t ret = llvm::StringSwitch<int32_t>(**str)
>>> LLD_CASE(R_PPC_NONE)
>>> -      LLD_CASE(R_PPC_ADDR32).**Default(-1);
>>> +                LLD_CASE(R_PPC_ADDR32) LLD_CASE(R_PPC_REL24).Default(**
>>> -1);
>>>
>>>     if (ret == -1)
>>>       return make_error_code(**YamlReaderError::illegal_**value);
>>> @@ -39,6 +39,7 @@ elf::PPCLinkingContext::**stringFromRelocK
>>>     switch (kind) {
>>>       LLD_CASE(R_PPC_NONE)
>>>       LLD_CASE(R_PPC_ADDR32)
>>> +    LLD_CASE(R_PPC_REL24)
>>>     }
>>>
>>>     return make_error_code(**YamlReaderError::illegal_**value);
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**
>>> 64LinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/ELF/X86_64/X86_**64LinkingContext.cpp?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64LinkingContext.cpp
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64LinkingContext.cpp
>>> Tue Oct
>>> 29 00:12:14 2013
>>> @@ -90,8 +90,7 @@ private:
>>>
>>>   } // end anon namespace
>>>
>>> -
>>> -void elf::X86_64LinkingContext::**addPasses(PassManager &pm) const {
>>> +void elf::X86_64LinkingContext::**addPasses(PassManager &pm) {
>>>     auto pass = createX86_64RelocationPass(***this);
>>>     if (pass)
>>>       pm.add(std::move(pass));
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**
>>> 64LinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/ELF/X86_64/X86_**64LinkingContext.h?rev=193585&**
>>> r1=193584&r2=193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64LinkingContext.h
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64LinkingContext.h
>>> Tue Oct
>>> 29 00:12:14 2013
>>> @@ -33,7 +33,7 @@ public:
>>>         : ELFLinkingContext(triple, std::unique_ptr<**
>>> TargetHandlerBase>(
>>>                                         new X86_64TargetHandler(*this)))
>>> {}
>>>
>>> -  virtual void addPasses(PassManager &) const;
>>> +  virtual void addPasses(PassManager &);
>>>
>>>     virtual uint64_t getBaseAddress() const {
>>>       if (_baseAddress == 0)
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**
>>> 64RelocationPass.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/ELF/X86_64/X86_**64RelocationPass.cpp?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64RelocationPass.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64RelocationPass.cpp
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**ELF/X86_64/X86_**64RelocationPass.cpp
>>> Tue Oct
>>> 29 00:12:14 2013
>>> @@ -217,10 +217,10 @@ public:
>>>     ///
>>>     /// After all references are handled, the atoms created during that
>>> are
>>> all
>>>     /// added to mf.
>>> -  virtual void perform(MutableFile &mf) {
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mf) {
>>>       ScopedTask task(getDefaultDomain(), "X86-64 GOT/PLT Pass");
>>>       // Process all references.
>>> -    for (const auto &atom : mf.defined())
>>> +    for (const auto &atom : mf->defined())
>>>         for (const auto &ref : *atom)
>>>           handleReference(*atom, *ref);
>>>
>>> @@ -228,29 +228,29 @@ public:
>>>       uint64_t ordinal = 0;
>>>       if (_PLT0) {
>>>         _PLT0->setOrdinal(ordinal++);
>>> -      mf.addAtom(*_PLT0);
>>> +      mf->addAtom(*_PLT0);
>>>       }
>>>       for (auto &plt : _pltVector) {
>>>         plt->setOrdinal(ordinal++);
>>> -      mf.addAtom(*plt);
>>> +      mf->addAtom(*plt);
>>>       }
>>>       if (_null) {
>>>         _null->setOrdinal(ordinal++);
>>> -      mf.addAtom(*_null);
>>> +      mf->addAtom(*_null);
>>>       }
>>>       if (_PLT0) {
>>>         _got0->setOrdinal(ordinal++);
>>>         _got1->setOrdinal(ordinal++);
>>> -      mf.addAtom(*_got0);
>>> -      mf.addAtom(*_got1);
>>> +      mf->addAtom(*_got0);
>>> +      mf->addAtom(*_got1);
>>>       }
>>>       for (auto &got : _gotVector) {
>>>         got->setOrdinal(ordinal++);
>>> -      mf.addAtom(*got);
>>> +      mf->addAtom(*got);
>>>       }
>>>       for (auto obj : _objectVector) {
>>>         obj->setOrdinal(ordinal++);
>>> -      mf.addAtom(*obj);
>>> +      mf->addAtom(*obj);
>>>       }
>>>     }
>>>
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**MachO/MachOLinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/MachO/**MachOLinkingContext.cpp?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachOLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**MachO/MachOLinkingContext.cpp
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**MachO/MachOLinkingContext.cpp Tue Oct
>>> 29
>>> 00:12:14 2013
>>> @@ -16,6 +16,8 @@
>>>   #include "lld/ReaderWriter/Reader.h"
>>>   #include "lld/ReaderWriter/Writer.h"
>>>   #include "lld/Passes/LayoutPass.h"
>>> +#include "lld/Passes/**RoundTripNativePass.h"
>>> +#include "lld/Passes/RoundTripYAMLPass.**h"
>>>
>>>   #include "llvm/ADT/StringExtras.h"
>>>   #include "llvm/ADT/Triple.h"
>>> @@ -235,10 +237,14 @@ bool MachOLinkingContext::setOS(OS os, S
>>>     return parsePackedVersion(**minOSVersion, _osMinVersion);
>>>   }
>>>
>>> -void MachOLinkingContext::**addPasses(PassManager &pm) const {
>>> +void MachOLinkingContext::**addPasses(PassManager &pm) {
>>>     pm.add(std::unique_ptr<Pass>(**new mach_o::GOTPass));
>>>     pm.add(std::unique_ptr<Pass>(**new mach_o::StubsPass(*this)));
>>>     pm.add(std::unique_ptr<Pass>(**new LayoutPass()));
>>> +#ifndef NDEBUG
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripYAMLPass(*this)));
>>> +  pm.add(std::unique_ptr<Pass>(**new RoundTripNativePass(*this)));
>>> +#endif
>>>   }
>>>
>>>   Writer &MachOLinkingContext::writer() const {
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**PECOFF/GroupedSectionsPass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/PECOFF/**GroupedSectionsPass.h?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/GroupedSectionsPass.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**PECOFF/GroupedSectionsPass.h (original)
>>> +++ lld/trunk/lib/ReaderWriter/**PECOFF/GroupedSectionsPass.h Tue Oct 29
>>> 00:12:14 2013
>>> @@ -60,9 +60,9 @@ class GroupedSectionsPass : public lld::
>>>   public:
>>>     GroupedSectionsPass() {}
>>>
>>> -  virtual void perform(MutableFile &mergedFile) {
>>> -    std::map<StringRef, std::vector<COFFDefinedAtom *>>
>>> sectionToHeadAtoms(
>>> -        filterHeadAtoms(mergedFile));
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &mergedFile) {
>>> +    std::map<StringRef, std::vector<COFFDefinedAtom *> >
>>> sectionToHeadAtoms(
>>> +        filterHeadAtoms(*mergedFile));
>>>       std::vector<std::vector<**COFFDefinedAtom *>> groupedAtomsList(
>>>           groupBySectionName(**sectionToHeadAtoms));
>>>       for (auto &groupedAtoms : groupedAtomsList)
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**PECOFF/IdataPass.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/PECOFF/IdataPass.**h?rev=193585&r1=193584&r2=**
>>> 193585&view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**PECOFF/IdataPass.h (original)
>>> +++ lld/trunk/lib/ReaderWriter/**PECOFF/IdataPass.h Tue Oct 29 00:12:14
>>> 2013
>>> @@ -252,13 +252,13 @@ class IdataPass : public lld::Pass {
>>>   public:
>>>     IdataPass(const LinkingContext &ctx) : _dummyFile(ctx) {}
>>>
>>> -  virtual void perform(MutableFile &file) {
>>> -    if (file.sharedLibrary().size() == 0)
>>> +  virtual void perform(std::unique_ptr<**MutableFile> &file) {
>>> +    if (file->sharedLibrary().size() == 0)
>>>         return;
>>>
>>> -    Context context(file, _dummyFile);
>>> +    Context context(*file, _dummyFile);
>>>       map<StringRef, vector<COFFSharedLibraryAtom *> > sharedAtoms =
>>> -        groupByLoadName(file);
>>> +        groupByLoadName(*file);
>>>       for (auto i : sharedAtoms) {
>>>         StringRef loadName = i.first;
>>>         vector<COFFSharedLibraryAtom *> &atoms = i.second;
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/**PECOFF/PECOFFLinkingContext.**cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/lib/**
>>> ReaderWriter/PECOFF/**PECOFFLinkingContext.cpp?rev=**
>>> 193585&r1=193584&r2=193585&**view=diff<http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=193585&r1=193584&r2=193585&view=diff>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/lib/ReaderWriter/**PECOFF/PECOFFLinkingContext.**cpp
>>> (original)
>>> +++ lld/trunk/lib/ReaderWriter/**PECOFF/PECOFFLinkingContext.**cpp Tue
>>> Oct 29
>>> 00:12:14 2013
>>> @@ -204,7 +204,7 @@ PECOFFLinkingContext::**stringFromRelocKin
>>>     return make_error_code(**YamlReaderError::illegal_**value);
>>>   }
>>>
>>> -void PECOFFLinkingContext::**addPasses(PassManager &pm) const {
>>> +void PECOFFLinkingContext::**addPasses(PassManager &pm) {
>>>     pm.add(std::unique_ptr<Pass>(**new pecoff::GroupedSectionsPass())**
>>> );
>>>     pm.add(std::unique_ptr<Pass>(**new pecoff::IdataPass(*this)));
>>>     pm.add(std::unique_ptr<Pass>(**new LayoutPass()));
>>>
>>> Added: lld/trunk/test/elf/roundtrip.**test
>>> URL:
>>> http://llvm.org/viewvc/llvm-**project/lld/trunk/test/elf/**
>>> roundtrip.test?rev=193585&**view=auto<http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/roundtrip.test?rev=193585&view=auto>
>>>
>>> ==============================**==============================**
>>> ==================
>>> --- lld/trunk/test/elf/roundtrip.**test (added)
>>> +++ lld/trunk/test/elf/roundtrip.**test Tue Oct 29 00:12:14 2013
>>> @@ -0,0 +1,9 @@
>>> +# This tests the functionality of the RoundTrip Passes and verifies
>>> +# that the atoms belong to the native file after the passes finish
>>> +
>>> +RUN: lld -flavor gnu -target x86_64 %p/Inputs/foo.o.x86-64
>>> --noinhibit-exec  \
>>> +RUN: --output-filetype=yaml -o %t1
>>> +RUN: FileCheck %s < %t1
>>> +
>>> +CHECK:path:{{.*}}.native
>>> +
>>>
>>>
>>> ______________________________**_________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>>
>>>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
> by the Linux Foundation
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131029/15ef8b27/attachment.html>


More information about the llvm-commits mailing list