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

Shankar Easwaran shankare at codeaurora.org
Tue Oct 29 08:38:53 PDT 2013


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


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list