From 69ef168544e4f15b793dd35d272008fde9a6e835 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 28 Jan 2016 20:44:50 -0800 Subject: [PATCH] Don't compile usage of std::thread As of the time of this writing it's not actually used anywhere meaningfullly throughout the LLVM repo that we need, and it unfortunately uses `std::thread` which isn't available in mingw-w64 toolchains with the win32 threading model (the one that we use). Two major changes were made to achieve this: 1. The `ThreadPool.cpp` file was just entirely commented out. This isn't used anywhere in the LLVM repo nor in Rust itself. 2. The `ParallelCG.cpp` file was mostly deleted. Unfortunately it's used a few places in LLVM and is needed to link correctly, but we in Rust don't use it at all. For now it's just a stub implementation that hopefully compiles everywhere, but perhaps we can find a less invasive (aka doesn't have rebase conflicts in the future) change to apply soon. For reference, the upstream LLVM bug has been reported [1] [1]: https://llvm.org/bugs/show_bug.cgi?id=26365 --- include/llvm/Support/ThreadPool.h | 4 ++ include/llvm/Support/thread.h | 4 ++ lib/CodeGen/ParallelCG.cpp | 63 +------------------------------ lib/Support/ThreadPool.cpp | 4 ++ 4 files changed, 13 insertions(+), 62 deletions(-) diff --git a/include/llvm/Support/ThreadPool.h b/include/llvm/Support/ThreadPool.h index 745334db4450..4564615b53d3 100644 --- a/include/llvm/Support/ThreadPool.h +++ b/include/llvm/Support/ThreadPool.h @@ -11,6 +11,8 @@ // //===----------------------------------------------------------------------===// +#if 0 + #ifndef LLVM_SUPPORT_THREAD_POOL_H #define LLVM_SUPPORT_THREAD_POOL_H @@ -134,3 +136,5 @@ class ThreadPool { } #endif // LLVM_SUPPORT_THREAD_POOL_H + +#endif diff --git a/include/llvm/Support/thread.h b/include/llvm/Support/thread.h index 2d130418a57f..80340e65de6b 100644 --- a/include/llvm/Support/thread.h +++ b/include/llvm/Support/thread.h @@ -14,6 +14,8 @@ // //===----------------------------------------------------------------------===// +#if 0 + #ifndef LLVM_SUPPORT_THREAD_H #define LLVM_SUPPORT_THREAD_H @@ -64,3 +66,5 @@ struct thread { #endif // LLVM_ENABLE_THREADS #endif + +#endif diff --git a/lib/CodeGen/ParallelCG.cpp b/lib/CodeGen/ParallelCG.cpp index e73ba0296045..7362cdaf2d4c 100644 --- a/lib/CodeGen/ParallelCG.cpp +++ b/lib/CodeGen/ParallelCG.cpp @@ -25,72 +25,11 @@ using namespace llvm; -static void codegen(Module *M, llvm::raw_pwrite_stream &OS, - const Target *TheTarget, StringRef CPU, StringRef Features, - const TargetOptions &Options, Reloc::Model RM, - CodeModel::Model CM, CodeGenOpt::Level OL, - TargetMachine::CodeGenFileType FileType) { - std::unique_ptr TM(TheTarget->createTargetMachine( - M->getTargetTriple(), CPU, Features, Options, RM, CM, OL)); - - legacy::PassManager CodeGenPasses; - if (TM->addPassesToEmitFile(CodeGenPasses, OS, FileType)) - report_fatal_error("Failed to setup codegen"); - CodeGenPasses.run(*M); -} - std::unique_ptr llvm::splitCodeGen(std::unique_ptr M, ArrayRef OSs, StringRef CPU, StringRef Features, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOpt::Level OL, TargetMachine::CodeGenFileType FileType) { - StringRef TripleStr = M->getTargetTriple(); - std::string ErrMsg; - const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrMsg); - if (!TheTarget) - report_fatal_error(Twine("Target not found: ") + ErrMsg); - - if (OSs.size() == 1) { - codegen(M.get(), *OSs[0], TheTarget, CPU, Features, Options, RM, CM, - OL, FileType); - return M; - } - - std::vector Threads; - SplitModule(std::move(M), OSs.size(), [&](std::unique_ptr 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 - // main thread, in order to avoid data races) and spinning up new threads - // which deserialize the partitions into separate contexts. - // FIXME: Provide a more direct way to do this in LLVM. - SmallVector BC; - raw_svector_ostream BCOS(BC); - WriteBitcodeToFile(MPart.get(), BCOS); - - llvm::raw_pwrite_stream *ThreadOS = OSs[Threads.size()]; - Threads.emplace_back( - [TheTarget, CPU, Features, Options, RM, CM, OL, FileType, - ThreadOS](const SmallVector &BC) { - LLVMContext Ctx; - ErrorOr> MOrErr = - parseBitcodeFile(MemoryBufferRef(StringRef(BC.data(), BC.size()), - ""), - Ctx); - if (!MOrErr) - report_fatal_error("Failed to read bitcode"); - std::unique_ptr MPartInCtx = std::move(MOrErr.get()); - - codegen(MPartInCtx.get(), *ThreadOS, TheTarget, CPU, Features, - Options, RM, CM, OL, FileType); - }, - // Pass BC using std::move to ensure that it get moved rather than - // copied into the thread's context. - std::move(BC)); - }); - - for (thread &T : Threads) - T.join(); - - return {}; + return M; } diff --git a/lib/Support/ThreadPool.cpp b/lib/Support/ThreadPool.cpp index d4dcb2ee96df..bc25c591666c 100644 --- a/lib/Support/ThreadPool.cpp +++ b/lib/Support/ThreadPool.cpp @@ -11,6 +11,8 @@ // //===----------------------------------------------------------------------===// +#if 0 + #include "llvm/Support/ThreadPool.h" #include "llvm/Config/llvm-config.h" @@ -153,3 +155,5 @@ ThreadPool::~ThreadPool() { } #endif + +#endif