[Beignet] [PATCH] Fix based on piglit OpenCL failed case (cl-program-tester).
Yan Wang
yan.wang at linux.intel.com
Tue Dec 2 00:07:06 PST 2014
Fix tests/cl/program/build/optimization-options-cl10.cl
After calling check_cl_version_option, -cl-std=CLX.X should be
removed. This options couldn't be accepted by the subsequent
process.
Signed-off-by: Yan Wang <yan.wang at linux.intel.com>
---
src/cl_program.c | 50 ++++++++++++++++++++++++++++++++++++++------------
1 file changed, 38 insertions(+), 12 deletions(-)
diff --git a/src/cl_program.c b/src/cl_program.c
index c30f85e..07de15b 100644
--- a/src/cl_program.c
+++ b/src/cl_program.c
@@ -438,7 +438,7 @@ error:
/* Before we do the real work, we need to check whether our platform
cl version can meet -cl-std= */
-static int check_cl_version_option(cl_program p, const char* options) {
+static int check_cl_version_option(cl_program p, const char* options, char** fopt) {
const char* s = NULL;
int ver1 = 0;
int ver2 = 0;
@@ -467,16 +467,25 @@ static int check_cl_version_option(cl_program p, const char* options) {
if (ver2 < ver1)
return 0;
+ TRY_ALLOC_NO_ERR (*fopt, cl_calloc(strlen(options) + 1, sizeof(char)));
+ memcpy(*fopt, options, s - options);
+ if (s + strlen("-cl-std=CLX.X") < options + strlen(options))
+ memcpy((*fopt) + (s - options), s + strlen("-cl-std=CLX.X"),
+ options + strlen(options) - s - strlen("-cl-std=CLX.X"));
+
return 1;
}
return 1;
+error:
+ return 0;
}
LOCAL cl_int
cl_program_build(cl_program p, const char *options)
{
cl_int err = CL_SUCCESS;
+ char* filter_options = NULL;
int i = 0;
int copyed = 0;
@@ -485,7 +494,7 @@ cl_program_build(cl_program p, const char *options)
goto error;
}
- if (!check_cl_version_option(p, options)) {
+ if (!check_cl_version_option(p, options, &filter_options)) {
err = CL_BUILD_PROGRAM_FAILURE;
goto error;
}
@@ -495,8 +504,12 @@ cl_program_build(cl_program p, const char *options)
cl_free(p->build_opts);
p->build_opts = NULL;
}
- TRY_ALLOC (p->build_opts, cl_calloc(strlen(options) + 1, sizeof(char)));
- memcpy(p->build_opts, options, strlen(options));
+ if (filter_options) {
+ p->build_opts = filter_options;
+ } else {
+ TRY_ALLOC (p->build_opts, cl_calloc(strlen(options) + 1, sizeof(char)));
+ memcpy(p->build_opts, options, strlen(options));
+ }
p->source_type = p->source ? FROM_SOURCE : p->binary ? FROM_BINARY : FROM_LLVM;
}
@@ -515,7 +528,8 @@ cl_program_build(cl_program p, const char *options)
goto error;
}
- p->opaque = compiler_program_new_from_source(p->ctx->device->vendor_id, p->source, p->build_log_max_sz, options, p->build_log, &p->build_log_sz);
+ p->opaque = compiler_program_new_from_source(p->ctx->device->vendor_id, p->source, p->build_log_max_sz,
+ filter_options ? filter_options : options, p->build_log, &p->build_log_sz);
if (UNLIKELY(p->opaque == NULL)) {
if (p->build_log_sz > 0 && strstr(p->build_log, "error: error reading 'options'"))
err = CL_INVALID_BUILD_OPTIONS;
@@ -532,7 +546,8 @@ cl_program_build(cl_program p, const char *options)
goto error;
}
- compiler_program_build_from_llvm(p->opaque, p->build_log_max_sz, p->build_log, &p->build_log_sz, options);
+ compiler_program_build_from_llvm(p->opaque, p->build_log_max_sz, p->build_log, &p->build_log_sz,
+ filter_options ? filter_options : options);
if (UNLIKELY(p->opaque == NULL)) {
if (p->build_log_sz > 0 && strstr(p->build_log, "error: error reading 'options'"))
err = CL_INVALID_BUILD_OPTIONS;
@@ -587,9 +602,10 @@ cl_program_link(cl_context context,
cl_int err = CL_SUCCESS;
cl_int i = 0;
int copyed = 0;
+ char* filter_options = NULL;
p = cl_program_new(context);
- if (!check_cl_version_option(p, options)) {
+ if (!check_cl_version_option(p, options, &filter_options)) {
err = CL_BUILD_PROGRAM_FAILURE;
goto error;
}
@@ -614,7 +630,8 @@ cl_program_link(cl_context context,
p->binary_type = CL_PROGRAM_BINARY_TYPE_EXECUTABLE;
}
- compiler_program_build_from_llvm(p->opaque, p->build_log_max_sz, p->build_log, &p->build_log_sz, options);
+ compiler_program_build_from_llvm(p->opaque, p->build_log_max_sz, p->build_log, &p->build_log_sz,
+ filter_options ? filter_options : options);
/* Create all the kernels */
TRY (cl_program_load_gen_program, p);
@@ -633,6 +650,8 @@ cl_program_link(cl_context context,
copyed += sz;
}
done:
+ if (filter_options)
+ cl_free(filter_options);
p->is_built = 1;
p->build_status = CL_BUILD_SUCCESS;
if (errcode_ret)
@@ -640,6 +659,8 @@ done:
return p;
error:
+ if (filter_options)
+ cl_free(filter_options);
p->build_status = CL_BUILD_ERROR;
if (errcode_ret)
*errcode_ret = err;
@@ -655,13 +676,14 @@ cl_program_compile(cl_program p,
{
cl_int err = CL_SUCCESS;
int i = 0;
+ char* filter_options = NULL;
if (p->ref_n > 1) {
err = CL_INVALID_OPERATION;
goto error;
}
- if (!check_cl_version_option(p, options)) {
+ if (!check_cl_version_option(p, options, &filter_options)) {
err = CL_BUILD_PROGRAM_FAILURE;
goto error;
}
@@ -672,8 +694,12 @@ cl_program_compile(cl_program p,
cl_free(p->build_opts);
p->build_opts = NULL;
}
- TRY_ALLOC (p->build_opts, cl_calloc(strlen(options) + 1, sizeof(char)));
- memcpy(p->build_opts, options, strlen(options));
+ if (filter_options) {
+ p->build_opts = filter_options;
+ } else {
+ TRY_ALLOC (p->build_opts, cl_calloc(strlen(options) + 1, sizeof(char)));
+ memcpy(p->build_opts, options, strlen(options));
+ }
p->source_type = p->source ? FROM_SOURCE : p->binary ? FROM_BINARY : FROM_LLVM;
}
@@ -725,7 +751,7 @@ cl_program_compile(cl_program p,
}
p->opaque = compiler_program_compile_from_source(p->ctx->device->vendor_id, p->source, temp_header_path,
- p->build_log_max_sz, options, p->build_log, &p->build_log_sz);
+ p->build_log_max_sz, filter_options ? filter_options : options, p->build_log, &p->build_log_sz);
char rm_path[255]="rm ";
strncat(rm_path, temp_header_path, strlen(temp_header_path));
--
1.9.3
More information about the Beignet
mailing list