since we have separated the compiler (libgbe.so) and the interpreter (libgbeinterp.so), the LLVM resource cleanup task should be done in the compiler instead of the GenProgram::~GenProgram which has no way to clean llvm resources in libgbeinterp.so
Signed-off-by: Guo Yejun <[email protected]> --- backend/src/backend/gen_program.cpp | 2 +- backend/src/backend/gen_program.hpp | 4 +++- backend/src/backend/program.cpp | 9 ++++++++- backend/src/backend/program.h | 4 ++++ backend/src/backend/program.hpp | 2 ++ src/cl_gbe_loader.cpp | 5 +++++ src/cl_gbe_loader.h | 1 + src/cl_program.c | 6 +++++- 8 files changed, 29 insertions(+), 4 deletions(-) diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index c846786..3e16fd6 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -112,7 +112,7 @@ namespace gbe { #endif } - GenProgram::~GenProgram(void){ + void GenProgram::CleanLlvmResource(void){ #ifdef GBE_COMPILER_AVAILABLE if(module){ delete (llvm::Module*)module; diff --git a/backend/src/backend/gen_program.hpp b/backend/src/backend/gen_program.hpp index d5c9079..1b5136e 100644 --- a/backend/src/backend/gen_program.hpp +++ b/backend/src/backend/gen_program.hpp @@ -64,7 +64,9 @@ namespace gbe /*! Current device ID*/ uint32_t deviceID; /*! Destroy the program */ - virtual ~GenProgram(void); + virtual ~GenProgram(void) {}; + /*! Clean LLVM resource */ + virtual void CleanLlvmResource(void); /*! Implements base class */ virtual Kernel *compileKernel(const ir::Unit &unit, const std::string &name, bool relaxMath); /*! Allocate an empty kernel. */ diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index c35db1b..57ef515 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -528,6 +528,11 @@ namespace gbe { GBE_SAFE_DELETE(program); } + static void programCleanLlvmResource(gbe_program gbeProgram) { + gbe::Program *program = (gbe::Program*)(gbeProgram); + program->CleanLlvmResource(); + } + #ifdef GBE_COMPILER_AVAILABLE BVAR(OCL_OUTPUT_BUILD_LOG, false); SVAR(OCL_PCH_PATH, PCH_OBJECT_DIR); @@ -838,7 +843,7 @@ namespace gbe { processSourceAndOption(source, options, NULL, clOpt, clName, optLevel); gbe_program p; - // will delete the module and act in the destructor of GenProgram. + // will delete the module and act in GenProgram::CleanLlvmResource(). llvm::Module * out_module; llvm::LLVMContext* llvm_ctx = new llvm::LLVMContext; if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, clOpt.c_str(), @@ -1165,6 +1170,7 @@ GBE_EXPORT_SYMBOL gbe_program_link_from_llvm_cb *gbe_program_link_from_llvm = NU GBE_EXPORT_SYMBOL gbe_program_build_from_llvm_cb *gbe_program_build_from_llvm = NULL; GBE_EXPORT_SYMBOL gbe_program_get_global_constant_size_cb *gbe_program_get_global_constant_size = NULL; GBE_EXPORT_SYMBOL gbe_program_get_global_constant_data_cb *gbe_program_get_global_constant_data = NULL; +GBE_EXPORT_SYMBOL gbe_program_clean_llvm_resource_cb *gbe_program_clean_llvm_resource = NULL; GBE_EXPORT_SYMBOL gbe_program_delete_cb *gbe_program_delete = NULL; GBE_EXPORT_SYMBOL gbe_program_get_kernel_num_cb *gbe_program_get_kernel_num = NULL; GBE_EXPORT_SYMBOL gbe_program_get_kernel_by_name_cb *gbe_program_get_kernel_by_name = NULL; @@ -1210,6 +1216,7 @@ namespace gbe gbe_program_link_program = gbe::programLinkProgram; gbe_program_get_global_constant_size = gbe::programGetGlobalConstantSize; gbe_program_get_global_constant_data = gbe::programGetGlobalConstantData; + gbe_program_clean_llvm_resource = gbe::programCleanLlvmResource; gbe_program_delete = gbe::programDelete; gbe_program_get_kernel_num = gbe::programGetKernelNum; gbe_program_get_kernel_by_name = gbe::programGetKernelByName; diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h index c56b94a..2a3841a 100644 --- a/backend/src/backend/program.h +++ b/backend/src/backend/program.h @@ -239,6 +239,10 @@ extern gbe_kernel_get_sampler_data_cb *gbe_kernel_get_sampler_data; typedef void (gbe_kernel_get_compile_wg_size_cb)(gbe_kernel gbeKernel, size_t wg_sz[3]); extern gbe_kernel_get_compile_wg_size_cb *gbe_kernel_get_compile_wg_size; +/*! Clean LLVM resource of the given program */ +typedef void (gbe_program_clean_llvm_resource_cb)(gbe_program); +extern gbe_program_clean_llvm_resource_cb *gbe_program_clean_llvm_resource; + /*! Destroy and deallocate the given program */ typedef void (gbe_program_delete_cb)(gbe_program); extern gbe_program_delete_cb *gbe_program_delete; diff --git a/backend/src/backend/program.hpp b/backend/src/backend/program.hpp index d8a9d22..b780c42 100644 --- a/backend/src/backend/program.hpp +++ b/backend/src/backend/program.hpp @@ -225,6 +225,8 @@ namespace gbe { Program(void); /*! Destroy the program */ virtual ~Program(void); + /*! Clean LLVM resource of the program */ + virtual void CleanLlvmResource() = 0; /*! Get the number of kernels in the program */ uint32_t getKernelNum(void) const { return kernels.size(); } /*! Get the kernel from its name */ diff --git a/src/cl_gbe_loader.cpp b/src/cl_gbe_loader.cpp index 2fda50c..c2a61c4 100644 --- a/src/cl_gbe_loader.cpp +++ b/src/cl_gbe_loader.cpp @@ -32,6 +32,7 @@ gbe_program_new_from_llvm_binary_cb *compiler_program_new_from_llvm_binary = NUL gbe_program_serialize_to_binary_cb *compiler_program_serialize_to_binary = NULL; gbe_program_new_from_llvm_cb *compiler_program_new_from_llvm = NULL; gbe_set_image_base_index_cb *compiler_set_image_base_index = NULL; +gbe_program_clean_llvm_resource_cb *compiler_program_clean_llvm_resource = NULL; //function pointer from libgbeinterp.so gbe_program_new_from_binary_cb *interp_program_new_from_binary = NULL; @@ -289,6 +290,10 @@ struct GbeLoaderInitializer if (compiler_set_image_base_index == NULL) return; + compiler_program_clean_llvm_resource = *(gbe_program_clean_llvm_resource_cb **)dlsym(dlhCompiler, "gbe_program_clean_llvm_resource"); + if (compiler_program_clean_llvm_resource == NULL) + return; + compilerLoaded = true; } } diff --git a/src/cl_gbe_loader.h b/src/cl_gbe_loader.h index 632163b..f855390 100644 --- a/src/cl_gbe_loader.h +++ b/src/cl_gbe_loader.h @@ -33,6 +33,7 @@ extern gbe_program_new_from_llvm_binary_cb *compiler_program_new_from_llvm_binar extern gbe_program_serialize_to_binary_cb *compiler_program_serialize_to_binary; extern gbe_program_new_from_llvm_cb *compiler_program_new_from_llvm; extern gbe_set_image_base_index_cb *compiler_set_image_base_index; +extern gbe_program_clean_llvm_resource_cb *compiler_program_clean_llvm_resource; extern gbe_program_new_from_binary_cb *interp_program_new_from_binary; extern gbe_program_get_global_constant_size_cb *interp_program_get_global_constant_size; diff --git a/src/cl_program.c b/src/cl_program.c index 7d33f2a..c141a35 100644 --- a/src/cl_program.c +++ b/src/cl_program.c @@ -101,7 +101,11 @@ cl_program_delete(cl_program p) cl_context_delete(p->ctx); /* Free the program as allocated by the compiler */ - if (p->opaque) interp_program_delete(p->opaque); + if (p->opaque) { + if (CompilerSupported()) + compiler_program_clean_llvm_resource(p->opaque); + interp_program_delete(p->opaque); + } p->magic = CL_MAGIC_DEAD_HEADER; /* For safety */ cl_free(p); -- 1.8.3.2 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
