All programs or none programs specified by input_programs contain a compiled 
binary or library
for the device. Otherwise return CL_INVALID_OPERATION.
Correct this condition check.

Signed-off-by: Yang Rong <rong.r.y...@intel.com>
---
 src/cl_api.c     |  2 +-
 src/cl_program.c | 43 ++++++++++++++++++++++++++++---------------
 2 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/cl_api.c b/src/cl_api.c
index 0c16a42..4376a5e 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -1019,7 +1019,7 @@ clLinkProgram(cl_context            context,
 
   program = cl_program_link(context, num_input_programs, input_programs, 
options, &err);
 
-  program->is_built = CL_TRUE;
+  if(program) program->is_built = CL_TRUE;
 
   if (pfn_notify) pfn_notify(program, user_data);
 
diff --git a/src/cl_program.c b/src/cl_program.c
index ee5b8b1..0564b6f 100644
--- a/src/cl_program.c
+++ b/src/cl_program.c
@@ -604,13 +604,8 @@ cl_program_link(cl_context            context,
   cl_int err = CL_SUCCESS;
   cl_int i = 0;
   int copyed = 0;
-  p = cl_program_new(context);
   cl_bool ret = 0;
-
-  if (!check_cl_version_option(p, options)) {
-    err = CL_BUILD_PROGRAM_FAILURE;
-    goto error;
-  }
+  int avialable_program = 0;
 
   //Although we don't use options, but still need check options
   if(!compiler_program_check_opt(options)) {
@@ -618,15 +613,33 @@ cl_program_link(cl_context            context,
     goto error;
   }
 
-  p->opaque = compiler_program_new_gen_program(context->device->device_id, 
NULL, NULL);
-
-  for(i = 1; i < num_input_programs; i++) {
+  for(i = 0; i < num_input_programs; i++) {
     //num_input_programs >0 and input_programs MUST not NULL, so compare with 
input_programs[0] directly.
-    if(input_programs[i]->binary_type != input_programs[0]->binary_type) {
-      err = CL_INVALID_OPERATION;
-      goto error;
+    if(input_programs[i]->binary_type == CL_PROGRAM_BINARY_TYPE_LIBRARY ||
+       input_programs[i]->binary_type == 
CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT) {
+      avialable_program++;
     }
   }
+
+  //None of program contain a compilerd binary or library.
+  if(avialable_program == 0) {
+    goto done;
+  }
+
+  //Must all of program contain a compilerd binary or library.
+  if(avialable_program < num_input_programs) {
+    err = CL_INVALID_OPERATION;
+    goto error;
+  }
+
+  p = cl_program_new(context);
+
+  if (!check_cl_version_option(p, options)) {
+    err = CL_BUILD_PROGRAM_FAILURE;
+    goto error;
+  }
+
+  p->opaque = compiler_program_new_gen_program(context->device->device_id, 
NULL, NULL);
   for(i = 0; i < num_input_programs; i++) {
     // if program create with llvm binary, need deserilize first to get module.
     if(input_programs[i])
@@ -664,14 +677,14 @@ cl_program_link(cl_context            context,
     copyed += sz;
   }
 done:
-  p->is_built = 1;
-  p->build_status = CL_BUILD_SUCCESS;
+  if(p) p->is_built = 1;
+  if(p) p->build_status = CL_BUILD_SUCCESS;
   if (errcode_ret)
     *errcode_ret = err;
   return p;
 
 error:
-  p->build_status = CL_BUILD_ERROR;
+  if(p) p->build_status = CL_BUILD_ERROR;
   if (errcode_ret)
     *errcode_ret = err;
   return p;
-- 
1.9.1

_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to