diff options
author | Tom Stellard <[email protected]> | 2014-06-17 08:12:06 -0700 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2014-06-19 10:41:10 -0400 |
commit | 4aa128a123d7285677a527e724809339f15d33a7 (patch) | |
tree | 6842936c78f550111ad7513cd3e28463188e0b74 /src/gallium/state_trackers/clover | |
parent | 0cc391f0136c1532701a04c9b2f3a4cc49f25e8c (diff) |
clover: Don't use llvm's global context
An LLVMContext should only be accessed by a single and using the global
context was causing crashes in multi-threaded environments. Now we use
a separate context for each compile.
Reviewed-by: Francisco Jerez <[email protected]>
CC: "10.1 10.2" <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/clover')
-rw-r--r-- | src/gallium/state_trackers/clover/llvm/invocation.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 0148721921a..c3daa817938 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -117,12 +117,13 @@ namespace { #endif llvm::Module * - compile(const std::string &source, const std::string &name, - const std::string &triple, const std::string &processor, - const std::string &opts, clang::LangAS::Map& address_spaces) { + compile(llvm::LLVMContext &llvm_ctx, const std::string &source, + const std::string &name, const std::string &triple, + const std::string &processor, const std::string &opts, + clang::LangAS::Map& address_spaces) { clang::CompilerInstance c; - clang::EmitLLVMOnlyAction act(&llvm::getGlobalContext()); + clang::EmitLLVMOnlyAction act(&llvm_ctx); std::string log; llvm::raw_string_ostream s_log(log); std::string libclc_path = LIBCLC_LIBEXECDIR + processor + "-" @@ -399,10 +400,12 @@ clover::compile_program_llvm(const compat::string &source, target.size() - processor_str_len - 1); clang::LangAS::Map address_spaces; + llvm::LLVMContext llvm_ctx; + // The input file name must have the .cl extension in order for the // CompilerInvocation class to recognize it as an OpenCL source file. - llvm::Module *mod = compile(source, "input.cl", triple, processor, opts, - address_spaces); + llvm::Module *mod = compile(llvm_ctx, source, "input.cl", triple, processor, + opts, address_spaces); find_kernels(mod, kernels); |