[Beignet] [PATCH] clean llvm resource in compiler (libgbe.so)
Zhigang Gong
zhigang.gong at linux.intel.com
Thu Jul 24 23:58:44 PDT 2014
Pushed, thanks.
On Fri, Jul 25, 2014 at 01:23:00AM +0000, Luo, Xionghu wrote:
> This patch LGTM.
>
> Thanks
> Yejun
>
>
> -----Original Message-----
> From: Guo, Yejun
> Sent: Friday, July 18, 2014 7:17 AM
> To: beignet at lists.freedesktop.org
> Cc: Guo, Yejun
> Subject: [PATCH] clean llvm resource in compiler (libgbe.so)
>
> 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 <yejun.guo at intel.com>
> ---
> 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
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list