/*
* Copyright © 2014 Intel Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
*/
#include
#include
#include
#include
#include "cl_gbe_loader.h"
#include "backend/src/GBEConfig.h"
//function pointer from libgbe.so
gbe_program_new_from_source_cb *compiler_program_new_from_source = NULL;
gbe_program_new_from_llvm_file_cb *compiler_program_new_from_llvm_file = NULL;
gbe_program_compile_from_source_cb *compiler_program_compile_from_source = NULL;
gbe_program_new_gen_program_cb *compiler_program_new_gen_program = NULL;
gbe_program_link_program_cb *compiler_program_link_program = NULL;
gbe_program_check_opt_cb *compiler_program_check_opt = NULL;
gbe_program_build_from_llvm_cb *compiler_program_build_from_llvm = NULL;
gbe_program_new_from_llvm_binary_cb *compiler_program_new_from_llvm_binary = NULL;
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_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;
gbe_program_get_global_constant_size_cb *interp_program_get_global_constant_size = NULL;
gbe_program_get_global_constant_data_cb *interp_program_get_global_constant_data = NULL;
gbe_program_get_global_reloc_count_cb *interp_program_get_global_reloc_count = NULL;
gbe_program_get_global_reloc_table_cb *interp_program_get_global_reloc_table = NULL;
gbe_program_delete_cb *interp_program_delete = NULL;
gbe_program_get_kernel_num_cb *interp_program_get_kernel_num = NULL;
gbe_program_get_kernel_by_name_cb *interp_program_get_kernel_by_name = NULL;
gbe_program_get_kernel_cb *interp_program_get_kernel = NULL;
gbe_program_get_device_enqueue_kernel_name_cb *interp_program_get_device_enqueue_kernel_name = NULL;
gbe_kernel_get_name_cb *interp_kernel_get_name = NULL;
gbe_kernel_get_attributes_cb *interp_kernel_get_attributes = NULL;
gbe_kernel_get_code_cb *interp_kernel_get_code = NULL;
gbe_kernel_get_code_size_cb *interp_kernel_get_code_size = NULL;
gbe_kernel_get_arg_num_cb *interp_kernel_get_arg_num = NULL;
gbe_kernel_get_arg_size_cb *interp_kernel_get_arg_size = NULL;
gbe_kernel_get_arg_bti_cb *interp_kernel_get_arg_bti = NULL;
gbe_kernel_get_arg_type_cb *interp_kernel_get_arg_type = NULL;
gbe_kernel_get_arg_align_cb *interp_kernel_get_arg_align = NULL;
gbe_kernel_get_simd_width_cb *interp_kernel_get_simd_width = NULL;
gbe_kernel_get_curbe_offset_cb *interp_kernel_get_curbe_offset = NULL;
gbe_kernel_get_curbe_size_cb *interp_kernel_get_curbe_size = NULL;
gbe_kernel_get_stack_size_cb *interp_kernel_get_stack_size = NULL;
gbe_kernel_get_scratch_size_cb *interp_kernel_get_scratch_size = NULL;
gbe_kernel_get_required_work_group_size_cb *interp_kernel_get_required_work_group_size = NULL;
gbe_kernel_use_slm_cb *interp_kernel_use_slm = NULL;
gbe_kernel_get_slm_size_cb *interp_kernel_get_slm_size = NULL;
gbe_kernel_get_sampler_size_cb *interp_kernel_get_sampler_size = NULL;
gbe_kernel_get_sampler_data_cb *interp_kernel_get_sampler_data = NULL;
gbe_kernel_get_compile_wg_size_cb *interp_kernel_get_compile_wg_size = NULL;
gbe_kernel_get_image_size_cb *interp_kernel_get_image_size = NULL;
gbe_kernel_get_image_data_cb *interp_kernel_get_image_data = NULL;
gbe_kernel_get_ocl_version_cb *interp_kernel_get_ocl_version = NULL;
gbe_output_profiling_cb* interp_output_profiling = NULL;
gbe_get_profiling_bti_cb* interp_get_profiling_bti = NULL;
gbe_dup_profiling_cb* interp_dup_profiling = NULL;
gbe_get_printf_num_cb* interp_get_printf_num = NULL;
gbe_get_printf_buf_bti_cb* interp_get_printf_buf_bti = NULL;
gbe_dup_printfset_cb* interp_dup_printfset = NULL;
gbe_release_printf_info_cb* interp_release_printf_info = NULL;
gbe_output_printf_cb* interp_output_printf = NULL;
gbe_kernel_get_arg_info_cb *interp_kernel_get_arg_info = NULL;
gbe_kernel_use_device_enqueue_cb *interp_kernel_use_device_enqueue = NULL;
struct GbeLoaderInitializer
{
GbeLoaderInitializer()
{
LoadCompiler();
const char* path;
if (!LoadInterp(path))
std::cerr << "unable to load " << path << " which is part of the driver, please check!" << std::endl;
}
bool LoadInterp(const char*& path)
{
const char* interpPath = getenv("OCL_INTERP_PATH");
if (interpPath == NULL|| !strcmp(interpPath, ""))
interpPath = INTERP_OBJECT_DIR;
path = interpPath;
dlhInterp = dlopen(interpPath, RTLD_LAZY | RTLD_LOCAL);
if (dlhInterp == NULL) {
return false;
}
interp_program_new_from_binary = *(gbe_program_new_from_binary_cb**)dlsym(dlhInterp, "gbe_program_new_from_binary");
if (interp_program_new_from_binary == NULL)
return false;
interp_program_get_global_constant_size = *(gbe_program_get_global_constant_size_cb**)dlsym(dlhInterp, "gbe_program_get_global_constant_size");
if (interp_program_get_global_constant_size == NULL)
return false;
interp_program_get_global_constant_data = *(gbe_program_get_global_constant_data_cb**)dlsym(dlhInterp, "gbe_program_get_global_constant_data");
if (interp_program_get_global_constant_data == NULL)
return false;
interp_program_get_global_reloc_count = *(gbe_program_get_global_reloc_count_cb**)dlsym(dlhInterp, "gbe_program_get_global_reloc_count");
if (interp_program_get_global_reloc_count == NULL)
return false;
interp_program_get_global_reloc_table = *(gbe_program_get_global_reloc_table_cb**)dlsym(dlhInterp, "gbe_program_get_global_reloc_table");
if (interp_program_get_global_reloc_table == NULL)
return false;
interp_program_delete = *(gbe_program_delete_cb**)dlsym(dlhInterp, "gbe_program_delete");
if (interp_program_delete == NULL)
return false;
interp_program_get_kernel_num = *(gbe_program_get_kernel_num_cb**)dlsym(dlhInterp, "gbe_program_get_kernel_num");
if (interp_program_get_kernel_num == NULL)
return false;
interp_program_get_kernel_by_name = *(gbe_program_get_kernel_by_name_cb**)dlsym(dlhInterp, "gbe_program_get_kernel_by_name");
if (interp_program_get_kernel_by_name == NULL)
return false;
interp_program_get_kernel = *(gbe_program_get_kernel_cb**)dlsym(dlhInterp, "gbe_program_get_kernel");
if (interp_program_get_kernel == NULL)
return false;
interp_program_get_device_enqueue_kernel_name = *(gbe_program_get_device_enqueue_kernel_name_cb**)dlsym(dlhInterp, "gbe_program_get_device_enqueue_kernel_name");
if (interp_program_get_device_enqueue_kernel_name == NULL)
return false;
interp_kernel_get_name = *(gbe_kernel_get_name_cb**)dlsym(dlhInterp, "gbe_kernel_get_name");
if (interp_kernel_get_name == NULL)
return false;
interp_kernel_get_attributes = *(gbe_kernel_get_attributes_cb**)dlsym(dlhInterp, "gbe_kernel_get_attributes");
if (interp_kernel_get_attributes == NULL)
return false;
interp_kernel_get_code = *(gbe_kernel_get_code_cb**)dlsym(dlhInterp, "gbe_kernel_get_code");
if (interp_kernel_get_code == NULL)
return false;
interp_kernel_get_code_size = *(gbe_kernel_get_code_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_code_size");
if (interp_kernel_get_code_size == NULL)
return false;
interp_kernel_get_arg_num = *(gbe_kernel_get_arg_num_cb**)dlsym(dlhInterp, "gbe_kernel_get_arg_num");
if (interp_kernel_get_arg_num == NULL)
return false;
interp_kernel_get_arg_size = *(gbe_kernel_get_arg_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_arg_size");
if (interp_kernel_get_arg_size == NULL)
return false;
interp_kernel_get_arg_bti = *(gbe_kernel_get_arg_bti_cb**)dlsym(dlhInterp, "gbe_kernel_get_arg_bti");
if (interp_kernel_get_arg_bti == NULL)
return false;
interp_kernel_get_arg_type = *(gbe_kernel_get_arg_type_cb**)dlsym(dlhInterp, "gbe_kernel_get_arg_type");
if (interp_kernel_get_arg_type == NULL)
return false;
interp_kernel_get_arg_align = *(gbe_kernel_get_arg_align_cb**)dlsym(dlhInterp, "gbe_kernel_get_arg_align");
if (interp_kernel_get_arg_align == NULL)
return false;
interp_kernel_get_simd_width = *(gbe_kernel_get_simd_width_cb**)dlsym(dlhInterp, "gbe_kernel_get_simd_width");
if (interp_kernel_get_simd_width == NULL)
return false;
interp_kernel_get_curbe_offset = *(gbe_kernel_get_curbe_offset_cb**)dlsym(dlhInterp, "gbe_kernel_get_curbe_offset");
if (interp_kernel_get_curbe_offset == NULL)
return false;
interp_kernel_get_curbe_size = *(gbe_kernel_get_curbe_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_curbe_size");
if (interp_kernel_get_curbe_size == NULL)
return false;
interp_kernel_get_stack_size = *(gbe_kernel_get_stack_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_stack_size");
if (interp_kernel_get_stack_size == NULL)
return false;
interp_kernel_get_scratch_size = *(gbe_kernel_get_scratch_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_scratch_size");
if (interp_kernel_get_scratch_size == NULL)
return false;
interp_kernel_get_required_work_group_size = *(gbe_kernel_get_required_work_group_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_required_work_group_size");
if (interp_kernel_get_required_work_group_size == NULL)
return false;
interp_kernel_use_slm = *(gbe_kernel_use_slm_cb**)dlsym(dlhInterp, "gbe_kernel_use_slm");
if (interp_kernel_use_slm == NULL)
return false;
interp_kernel_get_slm_size = *(gbe_kernel_get_slm_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_slm_size");
if (interp_kernel_get_slm_size == NULL)
return false;
interp_kernel_get_sampler_size = *(gbe_kernel_get_sampler_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_sampler_size");
if (interp_kernel_get_sampler_size == NULL)
return false;
interp_kernel_get_sampler_data = *(gbe_kernel_get_sampler_data_cb**)dlsym(dlhInterp, "gbe_kernel_get_sampler_data");
if (interp_kernel_get_sampler_data == NULL)
return false;
interp_kernel_get_compile_wg_size = *(gbe_kernel_get_compile_wg_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_compile_wg_size");
if (interp_kernel_get_compile_wg_size == NULL)
return false;
interp_kernel_get_image_size = *(gbe_kernel_get_image_size_cb**)dlsym(dlhInterp, "gbe_kernel_get_image_size");
if (interp_kernel_get_image_size == NULL)
return false;
interp_kernel_get_image_data = *(gbe_kernel_get_image_data_cb**)dlsym(dlhInterp, "gbe_kernel_get_image_data");
if (interp_kernel_get_image_data == NULL)
return false;
interp_kernel_get_ocl_version = *(gbe_kernel_get_ocl_version_cb**)dlsym(dlhInterp, "gbe_kernel_get_ocl_version");
if (interp_kernel_get_ocl_version == NULL)
return false;
interp_output_profiling = *(gbe_output_profiling_cb**)dlsym(dlhInterp, "gbe_output_profiling");
if (interp_output_profiling == NULL)
return false;
interp_get_profiling_bti = *(gbe_get_profiling_bti_cb**)dlsym(dlhInterp, "gbe_get_profiling_bti");
if (interp_get_profiling_bti == NULL)
return false;
interp_dup_profiling = *(gbe_dup_profiling_cb**)dlsym(dlhInterp, "gbe_dup_profiling");
if (interp_dup_profiling == NULL)
return false;
interp_get_printf_num = *(gbe_get_printf_num_cb**)dlsym(dlhInterp, "gbe_get_printf_num");
if (interp_get_printf_num == NULL)
return false;
interp_get_printf_buf_bti = *(gbe_get_printf_buf_bti_cb**)dlsym(dlhInterp, "gbe_get_printf_buf_bti");
if (interp_get_printf_buf_bti == NULL)
return false;
interp_dup_printfset = *(gbe_dup_printfset_cb**)dlsym(dlhInterp, "gbe_dup_printfset");
if (interp_dup_printfset == NULL)
return false;
interp_release_printf_info = *(gbe_release_printf_info_cb**)dlsym(dlhInterp, "gbe_release_printf_info");
if (interp_release_printf_info == NULL)
return false;
interp_output_printf = *(gbe_output_printf_cb**)dlsym(dlhInterp, "gbe_output_printf");
if (interp_output_printf == NULL)
return false;
interp_kernel_get_arg_info = *(gbe_kernel_get_arg_info_cb**)dlsym(dlhInterp, "gbe_kernel_get_arg_info");
if (interp_kernel_get_arg_info == NULL)
return false;
interp_kernel_use_device_enqueue = *(gbe_kernel_use_device_enqueue_cb**)dlsym(dlhInterp, "gbe_kernel_use_device_enqueue");
if (interp_kernel_use_device_enqueue == NULL)
return false;
return true;
}
void LoadCompiler()
{
compilerLoaded = false;
const char* nonCompiler = getenv("OCL_NON_COMPILER");
if (nonCompiler != NULL) {
if (strcmp(nonCompiler, "1") == 0)
return;
}
const char* gbePath = getenv("OCL_GBE_PATH");
if (gbePath == NULL || !strcmp(gbePath, ""))
gbePath = GBE_OBJECT_DIR;
dlhCompiler = dlopen(gbePath, RTLD_LAZY | RTLD_LOCAL);
if (dlhCompiler != NULL) {
compiler_program_new_from_source = *(gbe_program_new_from_source_cb **)dlsym(dlhCompiler, "gbe_program_new_from_source");
if (compiler_program_new_from_source == NULL)
return;
compiler_program_new_from_llvm_file = *(gbe_program_new_from_llvm_file_cb **)dlsym(dlhCompiler, "gbe_program_new_from_llvm_file");
if (compiler_program_new_from_llvm_file == NULL)
return;
compiler_program_compile_from_source = *(gbe_program_compile_from_source_cb **)dlsym(dlhCompiler, "gbe_program_compile_from_source");
if (compiler_program_compile_from_source == NULL)
return;
compiler_program_new_gen_program = *(gbe_program_new_gen_program_cb **)dlsym(dlhCompiler, "gbe_program_new_gen_program");
if (compiler_program_new_gen_program == NULL)
return;
compiler_program_link_program = *(gbe_program_link_program_cb **)dlsym(dlhCompiler, "gbe_program_link_program");
if (compiler_program_link_program == NULL)
return;
compiler_program_check_opt = *(gbe_program_check_opt_cb **)dlsym(dlhCompiler, "gbe_program_check_opt");
if (compiler_program_check_opt == NULL)
return;
compiler_program_build_from_llvm = *(gbe_program_build_from_llvm_cb **)dlsym(dlhCompiler, "gbe_program_build_from_llvm");
if (compiler_program_build_from_llvm == NULL)
return;
compiler_program_new_from_llvm_binary = *(gbe_program_new_from_llvm_binary_cb **)dlsym(dlhCompiler, "gbe_program_new_from_llvm_binary");
if (compiler_program_new_from_llvm_binary == NULL)
return;
compiler_program_serialize_to_binary = *(gbe_program_serialize_to_binary_cb **)dlsym(dlhCompiler, "gbe_program_serialize_to_binary");
if (compiler_program_serialize_to_binary == NULL)
return;
compiler_program_new_from_llvm = *(gbe_program_new_from_llvm_cb **)dlsym(dlhCompiler, "gbe_program_new_from_llvm");
if (compiler_program_new_from_llvm == 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;
}
}
~GbeLoaderInitializer()
{
if (dlhCompiler != NULL)
dlclose(dlhCompiler);
if (dlhInterp != NULL)
dlclose(dlhInterp);
//When destroy, set the release relative functions
//to NULL to avoid dangling pointer visit.
compiler_program_clean_llvm_resource = NULL;
interp_program_delete = NULL;
}
bool compilerLoaded;
void *dlhCompiler;
void *dlhInterp;
};
static struct GbeLoaderInitializer gbeLoader;
int CompilerSupported()
{
if (gbeLoader.compilerLoaded)
return 1;
else
return 0;
}