From 66e21f8b2b675260055924e396eab6584fa36721 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 29 Jan 2019 17:04:03 +0100 Subject: [PATCH 1/2] [SYCL] Mark createSpirvProgram as static It's only used from this compilation unit, and there's no header-declaration, so let's mark it as static. Signed-off-by: Erik Faye-Lund --- sycl/source/detail/program_manager/program_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index f34cc28acfdd3..5509c7325fff2 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -73,8 +73,8 @@ static cl_program createBinaryProgram(const cl_context Context, return Program; } -cl_program createSpirvProgram(const cl_context Context, - const vector_class &SpirvProg) { +static cl_program createSpirvProgram(const cl_context Context, + const vector_class &SpirvProg) { cl_int Err = CL_SUCCESS; cl_program ClProgram = clCreateProgramWithIL(Context, SpirvProg.data(), SpirvProg.size(), &Err); From b8ce98d481aecccffecd69a134f97ec4b32ca75e Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 29 Jan 2019 22:05:20 +0100 Subject: [PATCH 2/2] [SYCL] Do not call unsupported function This degrades the error-mode from a SIGSEGV to a runtime-error when running with an incompatible OpenCL implementation. Signed-off-by: Erik Faye-Lund --- .../detail/program_manager/program_manager.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 5509c7325fff2..d5ea66c11c21d 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -82,7 +82,8 @@ static cl_program createSpirvProgram(const cl_context Context, return ClProgram; } -static cl_program createProgram(cl_context Context, +static cl_program createProgram(const platform &Platform, + cl_context Context, const vector_class &DeviceProg) { cl_program Program = nullptr; int32_t SpirvMagic = 0; @@ -93,7 +94,13 @@ static cl_program createProgram(cl_context Context, (char*)&SpirvMagic); if (SpirvMagic == ValidSpirvMagic) { - Program = createSpirvProgram(Context, DeviceProg); + if (Platform.has_extension("cl_khr_il_program") || + Platform.get_info().find(" 2.1") != + string_class::npos) { + Program = createSpirvProgram(Context, DeviceProg); + } else { + return nullptr; + } } } @@ -111,7 +118,8 @@ cl_program ProgramManager::getBuiltOpenCLProgram(const context &Context) { vector_class DeviceProg = getSpirvSource(); cl_context ClContext = Context.get(); - ClProgram = createProgram(ClContext, DeviceProg); + const platform &Platform = Context.get_platform(); + ClProgram = createProgram(Platform, ClContext, DeviceProg); clReleaseContext(ClContext); build(ClProgram);