Index: include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp
===================================================================
--- include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp
+++ include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp
@@ -14,8 +14,9 @@
 #include "clang/Tooling/CommonOptionsParser.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/Support/Path.h"
-
+#include "llvm/Support/ThreadPool.h"
 #include <map>
+#include <mutex>
 #include <string>
 #include <vector>
 
@@ -74,23 +75,34 @@
 };
 
 bool Merge(llvm::StringRef MergeDir, llvm::StringRef OutputFile) {
-  std::error_code EC;
   std::set<SymbolInfo> UniqueSymbols;
+  std::mutex SymbolMutex;
+  auto AddSymbols = [&](ArrayRef<SymbolInfo> Symbols) {
+    // Synchronize set accesses.
+    std::unique_lock<std::mutex> LockGuard(SymbolMutex);
+    for (const SymbolInfo &Symbol : Symbols)
+      UniqueSymbols.insert(Symbol);
+  };
+
   // Load all symbol files in MergeDir.
+  llvm::ThreadPool Pool;
+  std::error_code EC;
   for (llvm::sys::fs::directory_iterator Dir(MergeDir, EC), DirEnd;
        Dir != DirEnd && !EC; Dir.increment(EC)) {
-    int ReadFD = 0;
-    if (llvm::sys::fs::openFileForRead(Dir->path(), ReadFD)) {
-      llvm::errs() << "Cann't open " << Dir->path() << "\n";
-      continue;
-    }
-    auto Buffer = llvm::MemoryBuffer::getOpenFile(ReadFD, Dir->path(), -1);
-    if (!Buffer)
-      continue;
-    std::vector<SymbolInfo> Symbols =
-        ReadSymbolInfosFromYAML(Buffer.get()->getBuffer());
-    for (const auto &Symbol : Symbols)
-      UniqueSymbols.insert(Symbol);
+    // Do the YAML file parsing in parallel.
+    Pool.async(
+        [&AddSymbols](std::string Path) {
+          auto Buffer = llvm::MemoryBuffer::getFile(Path);
+          if (!Buffer) {
+            llvm::errs() << "Cann't open " << Path << "\n";
+            return;
+          }
+          std::vector<SymbolInfo> Symbols =
+              ReadSymbolInfosFromYAML(Buffer.get()->getBuffer());
+          // FIXME: Merge without creating such a heavy contention point.
+          AddSymbols(Symbols);
+        },
+        Dir->path());
   }
 
   llvm::raw_fd_ostream OS(OutputFile, EC, llvm::sys::fs::F_None);