summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorTom Stellard <[email protected]>2014-06-17 08:12:06 -0700
committerTom Stellard <[email protected]>2014-06-19 10:41:10 -0400
commit4aa128a123d7285677a527e724809339f15d33a7 (patch)
tree6842936c78f550111ad7513cd3e28463188e0b74 /src/gallium
parent0cc391f0136c1532701a04c9b2f3a4cc49f25e8c (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')
-rw-r--r--src/gallium/state_trackers/clover/llvm/invocation.cpp15
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);