Re-commit r225674: Convert other drivers to use WrapperNode.

The original commit had an issue with Mac OS dylib files. It didn't
handle fat binary dylib files correctly. This patch includes a fix.
A test for that case has already been committed in r225764.

llvm-svn: 226123
diff --git a/lld/lib/ReaderWriter/ELF/ELFReader.h b/lld/lib/ReaderWriter/ELF/ELFReader.h
index 881cd40..08aa717 100644
--- a/lld/lib/ReaderWriter/ELF/ELFReader.h
+++ b/lld/lib/ReaderWriter/ELF/ELFReader.h
@@ -33,8 +33,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+           std::vector<std::unique_ptr<File>> &result) const override {
     std::size_t maxAlignment =
         1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
     auto f =
@@ -72,8 +72,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+           std::vector<std::unique_ptr<File>> &result) const override {
     std::size_t maxAlignment =
         1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
     auto f =
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
index aeb424d..95643bc 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
@@ -49,12 +49,12 @@
         _flagMerger(flagMerger) {}
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
+           std::vector<std::unique_ptr<File>> &result) const override {
     auto &hdr = *elfHeader(*mb);
     if (std::error_code ec = _flagMerger.merge(hdr.getFileClass(), hdr.e_flags))
       return ec;
-    return BaseReaderType::parseFile(std::move(mb), registry, result);
+    return BaseReaderType::loadFile(std::move(mb), registry, result);
   }
 
 private:
@@ -72,12 +72,12 @@
         _flagMerger(flagMerger) {}
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
+           std::vector<std::unique_ptr<File>> &result) const override {
     auto &hdr = *elfHeader(*mb);
     if (std::error_code ec = _flagMerger.merge(hdr.getFileClass(), hdr.e_flags))
       return ec;
-    return BaseReaderType::parseFile(std::move(mb), registry, result);
+    return BaseReaderType::loadFile(std::move(mb), registry, result);
   }
 
 private:
diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp
index 5080c2a..a344fdf 100644
--- a/lld/lib/ReaderWriter/FileArchive.cpp
+++ b/lld/lib/ReaderWriter/FileArchive.cpp
@@ -67,7 +67,9 @@
 
   /// \brief parse each member
   std::error_code
-  parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+  parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
+    if (std::error_code ec = parse())
+      return ec;
     for (auto mf = _archive->child_begin(), me = _archive->child_end();
          mf != me; ++mf) {
       std::unique_ptr<File> file;
@@ -152,9 +154,12 @@
         mb.getBuffer(), memberPath, false));
 
     std::vector<std::unique_ptr<File>> files;
-    _registry.parseFile(std::move(memberMB), files);
+    if (std::error_code ec = _registry.loadFile(std::move(memberMB), files))
+      return ec;
     assert(files.size() == 1);
     result = std::move(files[0]);
+    if (std::error_code ec = result->parse())
+      return ec;
 
     // The memory buffer is co-owned by the archive file and the children,
     // so that the bufffer is deallocated when all the members are destructed.
@@ -232,8 +237,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &reg,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &reg,
+           std::vector<std::unique_ptr<File>> &result) const override {
     StringRef path = mb->getBufferIdentifier();
     std::unique_ptr<FileArchive> file(
         new FileArchive(std::move(mb), reg, path, _logLoading));
diff --git a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
index ba2df6c..df0414d 100644
--- a/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
+++ b/lld/lib/ReaderWriter/MachO/ExecutableAtoms.hpp
@@ -91,7 +91,7 @@
   }
 
   std::error_code
-  parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+  parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
     return std::error_code();
   }
 
diff --git a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
index 9e372d0..c9afbc6 100644
--- a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
+++ b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp
@@ -12,8 +12,9 @@
 #include "File.h"
 #include "MachONormalizedFile.h"
 #include "MachOPasses.h"
+#include "lld/Core/ArchiveLibraryFile.h"
 #include "lld/Core/PassManager.h"
-#include "lld/Driver/DarwinInputGraph.h"
+#include "lld/Driver/Driver.h"
 #include "lld/Passes/LayoutPass.h"
 #include "lld/Passes/RoundTripYAMLPass.h"
 #include "lld/ReaderWriter/Reader.h"
@@ -605,20 +606,19 @@
 }
 
 MachODylibFile* MachOLinkingContext::loadIndirectDylib(StringRef path) {
-  std::unique_ptr<MachOFileNode> node(new MachOFileNode(path, *this));
-  std::error_code ec = node->parse(*this, llvm::errs());
-  if (ec)
+  ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
+    DarwinLdDriver::getMemoryBuffer(*this, path);
+  if (mbOrErr.getError())
     return nullptr;
 
-  assert(node->files().size() == 1 && "expected one file in dylib");
-  // lld::File object is owned by MachOFileNode object. This method returns
-  // an unowned pointer to the lld::File object.
-  MachODylibFile* result = reinterpret_cast<MachODylibFile*>(
-                                                   node->files().front().get());
-
+  std::vector<std::unique_ptr<File>> files;
+  if (registry().loadFile(std::move(mbOrErr.get()), files))
+    return nullptr;
+  assert(files.size() == 1 && "expected one file in dylib");
+  files[0]->parse();
+  MachODylibFile* result = reinterpret_cast<MachODylibFile*>(files[0].get());
   // Node object now owned by _indirectDylibs vector.
-  _indirectDylibs.push_back(std::move(node));
-
+  _indirectDylibs.push_back(std::move(files[0]));
   return result;
 }
 
diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
index 84bf400..052b64e 100644
--- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
+++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
@@ -527,8 +527,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
+           std::vector<std::unique_ptr<File>> &result) const override {
     auto *file = new MachOFile(std::move(mb), &_ctx);
     result.push_back(std::unique_ptr<MachOFile>(file));
     return std::error_code();
@@ -554,8 +554,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &registry,
+           std::vector<std::unique_ptr<File>> &result) const override {
     auto *file = new MachODylibFile(std::move(mb), &_ctx);
     result.push_back(std::unique_ptr<MachODylibFile>(file));
     return std::error_code();
@@ -580,4 +580,3 @@
 
 
 } // namespace lld
-
diff --git a/lld/lib/ReaderWriter/Native/ReaderNative.cpp b/lld/lib/ReaderWriter/Native/ReaderNative.cpp
index c6932e6..c73ac2b 100644
--- a/lld/lib/ReaderWriter/Native/ReaderNative.cpp
+++ b/lld/lib/ReaderWriter/Native/ReaderNative.cpp
@@ -999,8 +999,8 @@
   }
 
   virtual std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+           std::vector<std::unique_ptr<File>> &result) const override {
     auto *file = new lld::native::File(std::move(mb));
     result.push_back(std::unique_ptr<File>(file));
     return std::error_code();
diff --git a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
index be1d843..994858f 100644
--- a/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
+++ b/lld/lib/ReaderWriter/PECOFF/LinkerGeneratedSymbolFile.h
@@ -88,7 +88,7 @@
   }
 
   std::error_code
-  parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+  parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
     return std::error_code();
   }
 
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
index 574badc..adcee29 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
@@ -1077,8 +1077,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const Registry &,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &,
+           std::vector<std::unique_ptr<File>> &result) const override {
     // Parse the memory buffer as PECOFF file.
     auto *file = new FileCOFF(std::move(mb), _ctx);
     result.push_back(std::unique_ptr<File>(file));
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
index dc158cd..85812d5 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
@@ -354,7 +354,7 @@
 
 class COFFImportLibraryReader : public Reader {
 public:
-  COFFImportLibraryReader(MachineTypes machine) : _machine(machine) {}
+  COFFImportLibraryReader(PECOFFLinkingContext &ctx) : _ctx(ctx) {}
 
   bool canParse(file_magic magic, StringRef,
                 const MemoryBuffer &mb) const override {
@@ -364,22 +364,21 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
-            std::vector<std::unique_ptr<File> > &result) const override {
-    auto *file = new FileImportLibrary(std::move(mb), _machine);
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+           std::vector<std::unique_ptr<File> > &result) const override {
+    auto *file = new FileImportLibrary(std::move(mb), _ctx.getMachineType());
     result.push_back(std::unique_ptr<File>(file));
     return std::error_code();
   }
 
 private:
-  MachineTypes _machine;
+  PECOFFLinkingContext &_ctx;
 };
 
 } // end anonymous namespace
 
 void Registry::addSupportCOFFImportLibraries(PECOFFLinkingContext &ctx) {
-  MachineTypes machine = ctx.getMachineType();
-  add(llvm::make_unique<COFFImportLibraryReader>(machine));
+  add(llvm::make_unique<COFFImportLibraryReader>(ctx));
 }
 
 } // end namespace lld
diff --git a/lld/lib/ReaderWriter/Reader.cpp b/lld/lib/ReaderWriter/Reader.cpp
index 8cbaae1..616f475 100644
--- a/lld/lib/ReaderWriter/Reader.cpp
+++ b/lld/lib/ReaderWriter/Reader.cpp
@@ -30,8 +30,8 @@
 }
 
 std::error_code
-Registry::parseFile(std::unique_ptr<MemoryBuffer> mb,
-                    std::vector<std::unique_ptr<File>> &result) const {
+Registry::loadFile(std::unique_ptr<MemoryBuffer> mb,
+                   std::vector<std::unique_ptr<File>> &result) const {
   // Get file type.
   StringRef content(mb->getBufferStart(), mb->getBufferSize());
   llvm::sys::fs::file_magic fileType = llvm::sys::fs::identify_magic(content);
@@ -42,11 +42,8 @@
   for (const std::unique_ptr<Reader> &reader : _readers) {
     if (!reader->canParse(fileType, extension, *mb))
       continue;
-    if (std::error_code ec = reader->parseFile(std::move(mb), *this, result))
+    if (std::error_code ec = reader->loadFile(std::move(mb), *this, result))
       return ec;
-    for (std::unique_ptr<File> &file : result)
-      if (std::error_code ec = file->parse())
-        return ec;
     return std::error_code();
   }
 
diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
index 628f8d3..faa5614 100644
--- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
+++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
@@ -648,7 +648,7 @@
     }
 
     virtual std::error_code
-    parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override {
+    parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
       return std::error_code();
     }
 
@@ -1325,8 +1325,8 @@
   }
 
   std::error_code
-  parseFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
-            std::vector<std::unique_ptr<File>> &result) const override {
+  loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
+           std::vector<std::unique_ptr<File>> &result) const override {
     // Create YAML Input Reader.
     YamlContext yamlContext;
     yamlContext._registry = &_registry;
@@ -1343,7 +1343,7 @@
 
     std::shared_ptr<MemoryBuffer> smb(mb.release());
     for (const File *file : createdFiles) {
-      // Note: parseFile() should return vector of *const* File
+      // Note: loadFile() should return vector of *const* File
       File *f = const_cast<File *>(file);
       f->setLastError(std::error_code());
       f->setSharedMemoryBuffer(smb);