[Driver] Parallelize reading initial object files.

llvm-svn: 182786
diff --git a/lld/lib/Driver/Driver.cpp b/lld/lib/Driver/Driver.cpp
index cb3c611..983c9dc 100644
--- a/lld/lib/Driver/Driver.cpp
+++ b/lld/lib/Driver/Driver.cpp
@@ -8,10 +8,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "lld/Driver/Driver.h"
+
 #include "lld/Core/LLVM.h"
 #include "lld/Core/InputFiles.h"
-#include "lld/Core/Resolver.h"
 #include "lld/Core/PassManager.h"
+#include "lld/Core/Parallel.h"
+#include "lld/Core/Resolver.h"
 #include "lld/ReaderWriter/Reader.h"
 #include "lld/ReaderWriter/Writer.h"
 
@@ -39,20 +41,33 @@
   }
 
   // Read inputs
-  InputFiles inputs;
+  std::vector<std::vector<std::unique_ptr<File>>> files(
+      targetInfo.inputFiles().size());
+  size_t index = 0;
+  std::atomic<bool> fail(false);
+  TaskGroup tg;
   for (const auto &input : targetInfo.inputFiles()) {
-    std::vector<std::unique_ptr<File>> files;
     if (targetInfo.logInputFiles())
       llvm::outs() << input.getPath() << "\n";
-      
-    error_code ec = targetInfo.readFile(input.getPath(), files);
-    if (ec) {
-      diagnostics   << "Failed to read file: " << input.getPath() << ": "
-                    << ec.message() << "\n";
-      return true;
-    }
-    inputs.appendFiles(files);
+
+    tg.spawn([&, index] {
+      if (error_code ec = targetInfo.readFile(input.getPath(), files[index])) {
+        diagnostics << "Failed to read file: " << input.getPath()
+                    << ": " << ec.message() << "\n";
+        fail = true;
+        return;
+      }
+    });
+    ++index;
   }
+  tg.sync();
+
+  if (fail)
+    return true;
+
+  InputFiles inputs;
+  for (auto &f : files)
+    inputs.appendFiles(f);
 
   // Give target a chance to add files.
   targetInfo.addImplicitFiles(inputs);