#endif
}
- GenProgram::~GenProgram(void){
+ void GenProgram::CleanLlvmResource(void){
#ifdef GBE_COMPILER_AVAILABLE
if(module){
delete (llvm::Module*)module;
/*! 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. */
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);
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(),
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;
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;
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;
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 */
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;
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;
}
}
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;
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);