From: Zhu Bingbing <bingbingx....@intel.com> After llvm3.9, the global context is a static variable. When call CleanLlvmResource, this global context may has been deleted. When delete the context, the module been deleted. So check the context before delete module.
Signed-off-by: Yang Rong <rong.r.y...@intel.com> --- backend/src/backend/gen_program.cpp | 8 +++++++- backend/src/backend/program.cpp | 4 ++-- backend/src/llvm/llvm_to_gen.cpp | 15 +++++++++++++-- backend/src/llvm/llvm_to_gen.hpp | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index bb1d22f..e7a88b4 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -126,6 +126,12 @@ namespace gbe { void GenProgram::CleanLlvmResource(void){ #ifdef GBE_COMPILER_AVAILABLE +#if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 39 + llvm::LLVMContext* c = GBEGetLLVMContext(); + //context has been deleted, the module instantiated in the context + //also been deleted when delete context. + if (c == NULL) return; +#endif if(module){ delete (llvm::Module*)module; module = NULL; @@ -353,7 +359,7 @@ namespace gbe { binary_content.assign(binary+1, size-1); llvm::StringRef llvm_bin_str(binary_content); #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 39 - llvm::LLVMContext& c = GBEGetLLVMContext(); + llvm::LLVMContext& c = *GBEGetLLVMContext(); #else llvm::LLVMContext& c = llvm::getGlobalContext(); #endif diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index c06ae5a..fda2b33 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -1104,7 +1104,7 @@ EXTEND_QUOTE: return NULL; #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 39 - llvm::LLVMContext& c = GBEGetLLVMContext(); + llvm::LLVMContext& c = *GBEGetLLVMContext(); #else llvm::LLVMContext& c = llvm::getGlobalContext(); #endif @@ -1156,7 +1156,7 @@ EXTEND_QUOTE: //for some functions, so we use global context now, need switch to new context later. llvm::Module * out_module; #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 39 - llvm::LLVMContext* llvm_ctx = &GBEGetLLVMContext(); + llvm::LLVMContext* llvm_ctx = GBEGetLLVMContext(); #else llvm::LLVMContext* llvm_ctx = &llvm::getGlobalContext(); #endif diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp index 8546f73..a155459 100644 --- a/backend/src/llvm/llvm_to_gen.cpp +++ b/backend/src/llvm/llvm_to_gen.cpp @@ -47,8 +47,19 @@ namespace gbe using namespace llvm; #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 39 - llvm::LLVMContext& GBEGetLLVMContext() { - static llvm::LLVMContext GBEContext; + llvm::LLVMContext *GBEContext = NULL; + bool initialized = false; + + void destroyLLVMContext (void) { + delete GBEContext; + GBEContext = NULL; + } + llvm::LLVMContext* GBEGetLLVMContext() { + if (initialized == false) { + GBEContext = new llvm::LLVMContext(); + atexit(destroyLLVMContext); + initialized = true; + } return GBEContext; } #endif diff --git a/backend/src/llvm/llvm_to_gen.hpp b/backend/src/llvm/llvm_to_gen.hpp index 73e8819..56b8619 100644 --- a/backend/src/llvm/llvm_to_gen.hpp +++ b/backend/src/llvm/llvm_to_gen.hpp @@ -38,7 +38,7 @@ namespace gbe { bool llvmToGen(ir::Unit &unit, const void* module, int optLevel, bool strictMath, int profiling, std::string &errors); #if LLVM_VERSION_MAJOR * 10 + LLVM_VERSION_MINOR >= 39 - extern llvm::LLVMContext& GBEGetLLVMContext(); + extern llvm::LLVMContext* GBEGetLLVMContext(); #endif } /* namespace gbe */ -- 2.1.4 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet