From 1a69469405846c197cae04023b343e651cdb54ee Mon Sep 17 00:00:00 2001 From: Junyan He Date: Fri, 8 Nov 2013 18:41:59 +0800 Subject: [PATCH] Fixup the problem of CL_PROGRAM_BINARIES in clGetProgramInfo API clGetProgramInfo using CL_PROGRAM_BINARIES to get the binary will not be right because the binary got is not the serilization one. Add the serilization there to fix this bug. Signed-off-by: Junyan He Reviewed-by: Zhigang Gong --- backend/src/backend/gen_program.cpp | 17 +++++++++++++++++ backend/src/backend/program.cpp | 1 + backend/src/backend/program.h | 4 ++++ src/cl_api.c | 20 +++++++++++++++----- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index 40ab176..67d4cab 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -131,6 +131,22 @@ namespace gbe { return reinterpret_cast(program); } + static size_t genProgramSerializeToBinary(gbe_program program, char **binary) { + using namespace gbe; + size_t sz; + std::ostringstream oss; + GenProgram *prog = (GenProgram*)program; + + if ((sz = prog->serializeToBin(oss)) == 0) { + *binary = 0; + return 0; + } + + *binary = (char *)malloc(sizeof(char) * sz); + memcpy(*binary, oss.str().c_str(), sz*sizeof(char)); + return sz; + } + static gbe_program genProgramNewFromLLVM(const char *fileName, size_t stringSize, char *err, @@ -157,5 +173,6 @@ namespace gbe { void genSetupCallBacks(void) { gbe_program_new_from_binary = gbe::genProgramNewFromBinary; + gbe_program_serialize_to_binary = gbe::genProgramSerializeToBinary; gbe_program_new_from_llvm = gbe::genProgramNewFromLLVM; } diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index e692186..43893fe 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -798,6 +798,7 @@ namespace gbe { GBE_EXPORT_SYMBOL gbe_program_new_from_source_cb *gbe_program_new_from_source = NULL; GBE_EXPORT_SYMBOL gbe_program_new_from_binary_cb *gbe_program_new_from_binary = NULL; +GBE_EXPORT_SYMBOL gbe_program_serialize_to_binary_cb *gbe_program_serialize_to_binary = NULL; GBE_EXPORT_SYMBOL gbe_program_new_from_llvm_cb *gbe_program_new_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; diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h index b0149da..2640b65 100644 --- a/backend/src/backend/program.h +++ b/backend/src/backend/program.h @@ -122,6 +122,10 @@ extern gbe_program_new_from_source_cb *gbe_program_new_from_source; typedef gbe_program (gbe_program_new_from_binary_cb)(const char *binary, size_t size); extern gbe_program_new_from_binary_cb *gbe_program_new_from_binary; +/*! Serialize a program to a bin */ +typedef size_t (gbe_program_serialize_to_binary_cb)(gbe_program program, char **binary); +extern gbe_program_serialize_to_binary_cb *gbe_program_serialize_to_binary; + /*! Create a new program from the given LLVM file */ typedef gbe_program (gbe_program_new_from_llvm_cb)(const char *fileName, size_t string_size, diff --git a/src/cl_api.c b/src/cl_api.c index 6acc1a2..d04ff00 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -909,7 +909,14 @@ clGetProgramInfo(cl_program program, FILL_GETINFO_RET (char, (strlen(program->source) + 1), program->source, CL_SUCCESS); } else if (param_name == CL_PROGRAM_BINARY_SIZES) { - FILL_GETINFO_RET (size_t, 1, (&program->bin_sz), CL_SUCCESS); + if (program->binary == NULL) { + program->binary_sz = gbe_program_serialize_to_binary(program->opaque, &program->binary); + } + + if (program->binary == NULL || program->binary_sz == 0) { + return CL_OUT_OF_RESOURCES; + } + FILL_GETINFO_RET (size_t, 1, (&program->binary_sz), CL_SUCCESS); } else if (param_name == CL_PROGRAM_BINARIES) { if (param_value_size_ret) *param_value_size_ret = sizeof(void*); @@ -918,12 +925,15 @@ clGetProgramInfo(cl_program program, /* param_value points to an array of n pointers allocated by the caller */ - if (program->bin_sz > 0) { - memcpy(*((void **)param_value), program->bin, program->bin_sz); - } else { - memcpy(*((void **)param_value), ret_str, 1); + if (program->binary == NULL) { + program->binary_sz = gbe_program_serialize_to_binary(program->opaque, &program->binary); + } + + if (program->binary == NULL || program->binary_sz == 0) { + return CL_OUT_OF_RESOURCES; } + memcpy(*((void **)param_value), program->binary, program->binary_sz); return CL_SUCCESS; } else { return CL_INVALID_VALUE; -- 2.7.4