<div dir="ltr">On Tue, May 28, 2013 at 11:37 AM, Michael J. Spencer <span dir="ltr"><<a href="mailto:bigcheesegs@gmail.com" target="_blank">bigcheesegs@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mspencer<br>
Date: Tue May 28 13:37:39 2013<br>
New Revision: 182786<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=182786&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=182786&view=rev</a><br>
Log:<br>
[Driver] Parallelize reading initial object files.<br>
<br>
Modified:<br>
    lld/trunk/lib/Driver/Driver.cpp<br>
<br>
Modified: lld/trunk/lib/Driver/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Driver.cpp?rev=182786&r1=182785&r2=182786&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/Driver.cpp?rev=182786&r1=182785&r2=182786&view=diff</a><br>


==============================================================================<br>
--- lld/trunk/lib/Driver/Driver.cpp (original)<br>
+++ lld/trunk/lib/Driver/Driver.cpp Tue May 28 13:37:39 2013<br>
@@ -8,10 +8,12 @@<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 #include "lld/Driver/Driver.h"<br>
+<br>
 #include "lld/Core/LLVM.h"<br>
 #include "lld/Core/InputFiles.h"<br>
-#include "lld/Core/Resolver.h"<br>
 #include "lld/Core/PassManager.h"<br>
+#include "lld/Core/Parallel.h"<br>
+#include "lld/Core/Resolver.h"<br>
 #include "lld/ReaderWriter/Reader.h"<br>
 #include "lld/ReaderWriter/Writer.h"<br>
<br>
@@ -39,20 +41,33 @@ bool Driver::link(const TargetInfo &targ<br>
   }<br>
<br>
   // Read inputs<br>
-  InputFiles inputs;<br>
+  std::vector<std::vector<std::unique_ptr<File>>> files(<br>
+      targetInfo.inputFiles().size());<br>
+  size_t index = 0;<br>
+  std::atomic<bool> fail(false);<br>
+  TaskGroup tg;<br>
   for (const auto &input : targetInfo.inputFiles()) {<br>
-    std::vector<std::unique_ptr<File>> files;<br>
     if (targetInfo.logInputFiles())<br>
       llvm::outs() << input.getPath() << "\n";<br>
-<br>
-    error_code ec = targetInfo.readFile(input.getPath(), files);<br>
-    if (ec) {<br>
-      diagnostics   << "Failed to read file: " << input.getPath() << ": "<br>
-                    << ec.message() << "\n";<br>
-      return true;<br>
-    }<br>
-    inputs.appendFiles(files);<br>
+<br>
+    tg.spawn([&, index] {<br>
+      if (error_code ec = targetInfo.readFile(input.getPath(), files[index])) {<br>
+        diagnostics << "Failed to read file: " << input.getPath()<br>
+                    << ": " << ec.message() << "\n";<br>
+        fail = true;<br>
+        return;<br>
+      }<br>
+    });<br>
+    ++index;<br></blockquote><div><br></div><div style>It's coming back to the other thread, but if targetInfo needs to be updated during input file parsing, parallelizing this piece of code would result in unpredictable behavior. I'm not saying that we can't paralellize this but just don't have a good idea to deal with that.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   }<br>
+  tg.sync();<br>
+<br>
+  if (fail)<br>
+    return true;<br>
+<br>
+  InputFiles inputs;<br>
+  for (auto &f : files)<br>
+    inputs.appendFiles(f);<br>
<br>
   // Give target a chance to add files.<br>
   targetInfo.addImplicitFiles(inputs);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>