//===----------------------------------------------------------------------===//
//
// 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.
#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
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
std::move(BC));
});
- for (std::thread &T : Threads)
+ for (thread &T : Threads)
T.join();
return {};