From: Peter Collingbourne <peter@pcc.me.uk>
Date: Mon, 31 Aug 2015 00:09:01 +0000 (+0000)
Subject: Support: Support LLVM_ENABLE_THREADS=0 in llvm/Support/thread.h.
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ae55d356be840aab2898f47a9c704e7a542f76c2;p=oota-llvm.git

Support: Support LLVM_ENABLE_THREADS=0 in llvm/Support/thread.h.

Specifically, the header now provides llvm::thread, which is either a
typedef of std::thread or a replacement that calls the function synchronously
depending on the value of LLVM_ENABLE_THREADS.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246402 91177308-0d34-0410-b5e6-96231b3b80d8
---

diff --git a/include/llvm/Support/thread.h b/include/llvm/Support/thread.h
index b61177d5989..2d1f1b3a3ec 100644
--- a/include/llvm/Support/thread.h
+++ b/include/llvm/Support/thread.h
@@ -8,13 +8,19 @@
 //===----------------------------------------------------------------------===//
 //
 // This header is a wrapper for <thread> that works around problems with the
-// MSVC headers when exceptions are disabled.
+// MSVC headers when exceptions are disabled. It also provides llvm::thread,
+// which is either a typedef of std::thread or a replacement that calls the
+// function synchronously depending on the value of LLVM_ENABLE_THREADS.
 //
 //===----------------------------------------------------------------------===//
 
 #ifndef LLVM_SUPPORT_THREAD_H
 #define LLVM_SUPPORT_THREAD_H
 
+#include "llvm/Config/llvm-config.h"
+
+#if LLVM_ENABLE_THREADS
+
 #ifdef _MSC_VER
 // concrt.h depends on eh.h for __uncaught_exception declaration
 // even if we disable exceptions.
@@ -31,4 +37,28 @@
 #pragma warning(pop)
 #endif
 
+namespace llvm {
+typedef std::thread thread;
+}
+
+#else // !LLVM_ENABLE_THREADS
+
+namespace llvm {
+
+struct thread {
+  thread() {}
+  thread(thread &&other) {}
+  template <class Function, class... Args>
+  explicit thread(Function &&f, Args &&... args) {
+    f(std::forward<Args>(args)...);
+  }
+  thread(const thread &) = delete;
+
+  void join() {}
+};
+
+}
+
+#endif // LLVM_ENABLE_THREADS
+
 #endif
diff --git a/lib/CodeGen/ParallelCG.cpp b/lib/CodeGen/ParallelCG.cpp
index 3e6a71d602b..748d3883ea1 100644
--- a/lib/CodeGen/ParallelCG.cpp
+++ b/lib/CodeGen/ParallelCG.cpp
@@ -56,7 +56,7 @@ llvm::splitCodeGen(std::unique_ptr<Module> M,
     return M;
   }
 
-  std::vector<std::thread> Threads;
+  std::vector<thread> Threads;
   SplitModule(std::move(M), OSs.size(), [&](std::unique_ptr<Module> MPart) {
     // We want to clone the module in a new context to multi-thread the codegen.
     // We do it by serializing partition modules to bitcode (while still on the
@@ -88,7 +88,7 @@ llvm::splitCodeGen(std::unique_ptr<Module> M,
         std::move(BC));
   });
 
-  for (std::thread &T : Threads)
+  for (thread &T : Threads)
     T.join();
 
   return {};