[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