The package rpms/pocl.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/pocl.git/commit/?id=98665204460fc....
Change:
+%ifarch aarch64 %{arm}
Thanks.
Full change:
============
commit 98665204460fc0ddcb7c47ee2a62b4951a845f5a
Author: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
Date: Fri Jan 12 11:52:40 2018 +0100
un-exclude arm
Signed-off-by: Igor Gnatenko <ignatenkobrain(a)fedoraproject.org>
diff --git a/0001-Fix-issue-597-for-32bit-ARM.patch
b/0001-Fix-issue-597-for-32bit-ARM.patch
new file mode 100644
index 0000000..1473b15
--- /dev/null
+++ b/0001-Fix-issue-597-for-32bit-ARM.patch
@@ -0,0 +1,32 @@
+From dca128f42d3b9401eeb5760b129987091657753f Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Wed, 3 Jan 2018 11:07:35 +0100
+Subject: [PATCH 01/14] Fix issue #597 for 32bit ARM
+
+---
+ lib/kernel/libclc/vtables_fp64.cl | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/lib/kernel/libclc/vtables_fp64.cl b/lib/kernel/libclc/vtables_fp64.cl
+index 44142909..0f4d5753 100644
+--- a/lib/kernel/libclc/vtables_fp64.cl
++++ b/lib/kernel/libclc/vtables_fp64.cl
+@@ -1025,9 +1025,6 @@ DECLARE_VTABLE(double2, CBRT_REM_TBL, 5) = {
+ (double2)(0x1.965fea0000000p+0, 0x1.4f5b8f20ac166p-26),
+ };
+
+-#endif // cl_khr_fp64
+-
+-
+ VTABLE_FUNCTION(double, CBRT_INV_TBL, cbrt_inv_tbl);
+
+ VTABLE_FUNCTION2(v2double, LN_TBL, ln_tbl);
+@@ -1037,3 +1034,5 @@ VTABLE_FUNCTION2(v2double, SINH_TBL, sinh_tbl);
+ VTABLE_FUNCTION2(v2double, COSH_TBL, cosh_tbl);
+ VTABLE_FUNCTION2(v2double, CBRT_DBL_TBL, cbrt_dbl_tbl);
+ VTABLE_FUNCTION2(v2double, CBRT_REM_TBL, cbrt_rem_tbl);
++
++#endif // cl_khr_fp64
+--
+2.15.1
+
diff --git a/0001-Revert-lib-kernel-printf.c-fix-nan-on-output.patch
b/0001-Revert-lib-kernel-printf.c-fix-nan-on-output.patch
deleted file mode 100644
index 4779fb6..0000000
--- a/0001-Revert-lib-kernel-printf.c-fix-nan-on-output.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From e9bab88cffde2871c3f7ca4339552fb3dcb66154 Mon Sep 17 00:00:00 2001
-From: Tom Stellard <tstellar(a)redhat.com>
-Date: Wed, 25 Oct 2017 15:04:43 -0700
-Subject: [PATCH] Revert "lib/kernel/printf.c: fix "-nan" on output"
-
-This reverts commit 3877d6316985fdf36a54cfee745952436744ebcc.
----
- lib/kernel/printf.c | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/lib/kernel/printf.c b/lib/kernel/printf.c
-index bd522fb..1564121 100644
---- a/lib/kernel/printf.c
-+++ b/lib/kernel/printf.c
-@@ -28,7 +28,6 @@
- #include <limits.h>
- #include <stdarg.h>
- #include <stdbool.h>
--#include <math.h>
-
- // We implement the OpenCL printf by calling the C99 printf. This is
- // not very efficient, but is easy to implement.
-@@ -111,6 +110,9 @@ float __attribute__((overloadable)) vload_half(size_t offset,
-
- // Note: To simplify implementation, we print double values with %lf,
- // although %f would suffice as well
-+#define FLOAT_CONV_half "h"
-+#define FLOAT_CONV_float ""
-+#define FLOAT_CONV_double "l"
- #define FLOAT_GET_half(ptr) vload_half(0, ptr)
- #define FLOAT_GET_float(ptr) (*(ptr))
- #define FLOAT_GET_double(ptr) (*(ptr))
-@@ -121,7 +123,7 @@ float __attribute__((overloadable)) vload_half(size_t offset,
- { \
- DEBUG_PRINTF(("[printf:floats:n=%dd]\n", n)); \
- char outfmt[1000]; \
-- OCL_C_AS char str[] = "%%%s%s%s%s%s%.0d%s%.0d" "%c";
\
-+ OCL_C_AS char str[] = "%%%s%s%s%s%s%.0d%s%.0d" FLOAT_CONV_##WIDTH
"%c"; \
- snprintf(outfmt, sizeof outfmt, \
- str, \
- flags.left ? "-" : "",
\
-@@ -138,10 +140,7 @@ float __attribute__((overloadable)) vload_half(size_t offset,
- for (int d=0; d<n; ++d) { \
- DEBUG_PRINTF(("[printf:floats:d=%d]\n", d)); \
- if (d != 0) printf(comma); \
-- WIDTH val = (FLOAT_GET_##WIDTH((OCL_C_AS const WIDTH*)vals+d)); \
-- if (isnan (val)) \
-- val = NAN; \
-- printf(outfmt, (double)val); \
-+ printf(outfmt, FLOAT_GET_##WIDTH((OCL_C_AS const WIDTH*)vals+d)); \
- } \
- DEBUG_PRINTF(("[printf:floats:done]\n")); \
- }
---
-1.8.3.1
-
diff --git a/0002-Try-to-fix-596-provide-additional-pocl-build-informa.patch
b/0002-Try-to-fix-596-provide-additional-pocl-build-informa.patch
new file mode 100644
index 0000000..709f6a9
--- /dev/null
+++ b/0002-Try-to-fix-596-provide-additional-pocl-build-informa.patch
@@ -0,0 +1,177 @@
+From 020cd9dbd8e356cc370b090d416c6e8b912c6b47 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Wed, 3 Jan 2018 12:55:54 +0100
+Subject: [PATCH 02/14] Try to fix #596 - provide additional pocl build
+ information
+
+---
+ CMakeLists.txt | 6 +++++-
+ config.h.in.cmake | 5 +++++
+ lib/CL/clGetPlatformInfo.c | 43 ++++++++++++++++++++++++++++++++++++++--
+ lib/CL/devices/basic/basic.c | 8 +++++++-
+ lib/CL/devices/pthread/pthread.c | 12 ++++++++++-
+ tests/runtime/test_version.c | 12 ++++++-----
+ 6 files changed, 76 insertions(+), 10 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 44a51c94..a836da90 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -308,7 +308,11 @@ if (OCS_AVAILABLE)
+ endif()
+
+ if(NOT DEFINED HOST_DEVICE_BUILD_HASH)
+- set(HOST_DEVICE_BUILD_HASH "${LLC_TRIPLE}-${LLC_HOST_CPU}")
++ if(KERNELLIB_HOST_CPU_VARIANTS STREQUAL "distro")
++ set(HOST_DEVICE_BUILD_HASH "${LLC_TRIPLE}")
++ else()
++ set(HOST_DEVICE_BUILD_HASH "${LLC_TRIPLE}-${LLC_HOST_CPU}")
++ endif()
+ endif()
+
+ if(ARM AND LLVM_3_9)
+diff --git a/config.h.in.cmake b/config.h.in.cmake
+index 7a6f72a1..cd75d7ce 100644
+--- a/config.h.in.cmake
++++ b/config.h.in.cmake
+@@ -28,6 +28,11 @@
+
+ #define FORCED_CLFLAGS "@FORCED_CLFLAGS@"
+
++#cmakedefine ENABLE_ASAN
++#cmakedefine ENABLE_LSAN
++#cmakedefine ENABLE_TSAN
++#cmakedefine ENABLE_UBSAN
++
+ #cmakedefine ENABLE_CONFORMANCE
+
+ #cmakedefine ENABLE_POCL_BUILDING
+diff --git a/lib/CL/clGetPlatformInfo.c b/lib/CL/clGetPlatformInfo.c
+index 74c15c92..5bb9c0ac 100644
+--- a/lib/CL/clGetPlatformInfo.c
++++ b/lib/CL/clGetPlatformInfo.c
+@@ -51,8 +51,47 @@ POname(clGetPlatformInfo)(cl_platform_id platform,
+
+ case CL_PLATFORM_VERSION:
+ #ifdef OCS_AVAILABLE
+- POCL_RETURN_GETINFO_STR("OpenCL " POCL_CL_VERSION\
+- " pocl " PACKAGE_VERSION ", LLVM "
LLVM_VERSION);
++ POCL_RETURN_GETINFO_STR ("OpenCL " POCL_CL_VERSION
++ " pocl " PACKAGE_VERSION ", LLVM "
LLVM_VERSION
++#ifdef LLVM_BUILD_MODE_DEBUG
++ " - debug"
++#endif
++
++#ifdef ENABLE_ASAN
++ ", ASAN"
++#endif
++#ifdef ENABLE_TSAN
++ ", TSAN"
++#endif
++#ifdef ENABLE_LSAN
++ ", LSAN"
++#endif
++#ifdef ENABLE_UBSAN
++ ", UBSAN"
++#endif
++
++#ifdef BUILD_CUDA
++ ", CUDA"
++#endif
++#ifdef BUILD_HSA
++ ", HSA"
++#endif
++#ifdef TCE_AVAILABLE
++ ", TCE"
++#endif
++#ifdef HAVE_LTTNG_UST
++ ", LTTNG"
++#endif
++#ifdef KERNELLIB_HOST_DISTRO_VARIANTS
++ ", DISTRO"
++#endif
++#ifdef POCL_DEBUG_MESSAGES
++ ", POCL_DEBUG"
++#endif
++#ifndef _CL_DISABLE_HALF
++ ", FP16"
++#endif
++ );
+ #else
+ POCL_RETURN_GETINFO_STR("OpenCL " POCL_CL_VERSION\
+ " pocl " PACKAGE_VERSION ", no online compiler
support");
+diff --git a/lib/CL/devices/basic/basic.c b/lib/CL/devices/basic/basic.c
+index 433ce943..8d1d8910 100644
+--- a/lib/CL/devices/basic/basic.c
++++ b/lib/CL/devices/basic/basic.c
+@@ -134,7 +134,13 @@ char *
+ pocl_basic_build_hash (cl_device_id device)
+ {
+ char* res = calloc(1000, sizeof(char));
+- snprintf(res, 1000, "basic-%s", HOST_DEVICE_BUILD_HASH);
++#ifdef KERNELLIB_HOST_DISTRO_VARIANTS
++ char *name = get_cpu_name ();
++ snprintf (res, 1000, "basic-%s-%s", HOST_DEVICE_BUILD_HASH, name);
++ POCL_MEM_FREE (name);
++#else
++ snprintf (res, 1000, "basic-%s", HOST_DEVICE_BUILD_HASH);
++#endif
+ return res;
+ }
+
+diff --git a/lib/CL/devices/pthread/pthread.c b/lib/CL/devices/pthread/pthread.c
+index b3d91fdb..0b88a74c 100644
+--- a/lib/CL/devices/pthread/pthread.c
++++ b/lib/CL/devices/pthread/pthread.c
+@@ -51,6 +51,10 @@
+ #include "pocl_util.h"
+ #include "pocl_mem_management.h"
+
++#ifdef OCS_AVAILABLE
++#include "pocl_llvm.h"
++#endif
++
+ //#define DEBUG_MT
+
+ #ifdef CUSTOM_BUFFER_ALLOCATOR
+@@ -149,7 +153,13 @@ char *
+ pocl_pthread_build_hash (cl_device_id device)
+ {
+ char* res = calloc(1000, sizeof(char));
+- snprintf(res, 1000, "pthread-%s", HOST_DEVICE_BUILD_HASH);
++#ifdef KERNELLIB_HOST_DISTRO_VARIANTS
++ char *name = get_cpu_name ();
++ snprintf (res, 1000, "pthread-%s-%s", HOST_DEVICE_BUILD_HASH, name);
++ POCL_MEM_FREE (name);
++#else
++ snprintf (res, 1000, "pthread-%s", HOST_DEVICE_BUILD_HASH);
++#endif
+ return res;
+ }
+
+diff --git a/tests/runtime/test_version.c b/tests/runtime/test_version.c
+index c41ef515..6bbc70de 100644
+--- a/tests/runtime/test_version.c
++++ b/tests/runtime/test_version.c
+@@ -33,11 +33,13 @@ int main(void)
+ sizeof(result), result, &rvs));
+
+ result[rvs]=0; // spec doesn't say it is null-terminated.
+- if( strcmp( result,
+- "OpenCL " POCL_CL_VERSION " pocl " PACKAGE_VERSION
", LLVM " LLVM_VERSION) != 0 ) {
+- printf("Error: platform is: %s\n", result);
+- return 2;
+- }
++ const char *expected = "OpenCL " POCL_CL_VERSION
++ " pocl " PACKAGE_VERSION ", LLVM "
LLVM_VERSION;
++ if (strncmp (result, expected, strlen (expected)) != 0)
++ {
++ printf ("Error: platform is: %s\n", result);
++ return 2;
++ }
+
+
+ /* Pocl devices have the form 'type'-'details', if details are
+--
+2.15.1
+
diff --git a/0003-Remove-CL_DISABLE_LONG.patch b/0003-Remove-CL_DISABLE_LONG.patch
new file mode 100644
index 0000000..434764d
--- /dev/null
+++ b/0003-Remove-CL_DISABLE_LONG.patch
@@ -0,0 +1,139 @@
+From 019531349964b7d61a2b658eb81a6b168cde3f29 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Wed, 3 Jan 2018 10:46:47 +0100
+Subject: [PATCH 03/14] Remove CL_DISABLE_LONG
+
+This was a workaround for an OpenCL bug in LLVM 3.3
+---
+ CMakeLists.txt | 37 +++++++++++++++++--------------------
+ config.h.in.cmake | 3 ---
+ lib/CL/devices/basic/basic.c | 5 -----
+ lib/CL/devices/pthread/pthread.c | 5 -----
+ 4 files changed, 17 insertions(+), 33 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index a836da90..60d570b8 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -744,9 +744,13 @@ endif()
+ set(DEFAULT_HOST_CLANG_FLAGS "${CLANG_TARGET_OPTION}${LLC_TRIPLE}")
+ set(DEFAULT_HOST_LLC_FLAGS "-relocation-model=pic -mtriple=${LLC_TRIPLE}")
+
+-if(ARM AND (NOT LLVM_OLDER_THAN_4_0))
+- #ARMs need to enable FP64 manually with 4.0
+- option(ENABLE_FP64 "Enable FP64" ON)
++if(ARM)
++ #ARMs need to enable FP64 manually with LLVM < 4.0
++ if(LLVM_OLDER_THAN_4_0)
++ option(ENABLE_FP64 "Enable FP64 on ARM32 - disabled by default for LLVM <
4" OFF)
++ else()
++ option(ENABLE_FP64 "Enable FP64 on ARM32 - if you have at least VFP support for
doubles, you can leave it ON" ON )
++ endif()
+ endif()
+
+ if(ARM32 OR (LLC_TRIPLE MATCHES "^arm"))
+@@ -764,9 +768,6 @@ if(ARM32 OR (LLC_TRIPLE MATCHES "^arm"))
+ endif()
+ endif()
+
+-if(CL_DISABLE_LONG)
+- set(DEFAULT_HOST_CLANG_FLAGS "${DEFAULT_HOST_CLANG_FLAGS}
-D_CL_DISABLE_LONG")
+-endif()
+ if(CL_DISABLE_HALF)
+ set(DEFAULT_HOST_CLANG_FLAGS "${DEFAULT_HOST_CLANG_FLAGS}
-D_CL_DISABLE_HALF")
+ endif()
+@@ -790,19 +791,17 @@ if(NOT CL_DISABLE_HALF)
+ set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp16")
+ endif()
+
+-if(NOT CL_DISABLE_LONG)
+- # must not be defined in HOST_DEVICE_EXTENSIONS list, because
+- # this extension doesn't exist in official extension list
+- set(HOST_DEVICE_EXTENSION_DEFINES "-Dcl_khr_int64")
++# must not be defined in HOST_DEVICE_EXTENSIONS list, because
++# this extension doesn't exist in official extension list
++# there is "cles_khr_int64" which indicates int64 support for embedded
profiles
++set(HOST_DEVICE_EXTENSION_DEFINES "-Dcl_khr_int64")
+
+- # fp64 requires int64
+- if(X86)
+- set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp64
cl_khr_int64_base_atomics cl_khr_int64_extended_atomics")
+- endif()
+- if(ENABLE_FP64 AND (NOT LLVM_OLDER_THAN_4_0))
+- # 32bit arm doesnt always uspport doubles
+- set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp64")
+- endif()
++if(X86)
++ set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp64
cl_khr_int64_base_atomics cl_khr_int64_extended_atomics")
++endif()
++# 32bit arm doesnt always support doubles
++if(ENABLE_FP64 AND (NOT LLVM_OLDER_THAN_4_0))
++ set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp64")
+ endif()
+
+ set(TEMP_EXT "${HOST_DEVICE_EXTENSIONS}")
+@@ -1145,7 +1144,6 @@ set(BUILD_ICD ${ENABLE_ICD})
+ set(BUILD_HSA ${ENABLE_HSA})
+ set(TCE_AVAILABLE ${ENABLE_TCE})
+ set(TCEMC_AVAILABLE ${ENABLE_TCEMC})
+-set(_CL_DISABLE_LONG ${CL_DISABLE_LONG})
+ set(_CL_DISABLE_HALF ${CL_DISABLE_HALF})
+ set(PACKAGE_VERSION "${POCL_VERSION}")
+
+@@ -1277,7 +1275,6 @@ MESSAGE(STATUS " ")
+ MESSAGE(STATUS "CLANG_MARCH_FLAG: ${CLANG_MARCH_FLAG}")
+ MESSAGE(STATUS "CLANG_TARGET_OPTION: ${CLANG_TARGET_OPTION}")
+ MESSAGE(STATUS "CL_DISABLE_HALF: ${CL_DISABLE_HALF}")
+-MESSAGE(STATUS "CL_DISABLE_LONG: ${CL_DISABLE_LONG}")
+ MESSAGE(STATUS "HAVE_CLOCK_GETTIME: ${HAVE_CLOCK_GETTIME}")
+ MESSAGE(STATUS "HAVE_GLEW: ${HAVE_GLEW}")
+ MESSAGE(STATUS "HAVE_LTTNG_UST: ${HAVE_LTTNG_UST}")
+diff --git a/config.h.in.cmake b/config.h.in.cmake
+index cd75d7ce..7b7e87e6 100644
+--- a/config.h.in.cmake
++++ b/config.h.in.cmake
+@@ -149,9 +149,6 @@
+ /* Defined on big endian systems */
+ #define WORDS_BIGENDIAN @WORDS_BIGENDIAN@
+
+-/* Disable 64bit ints when a clang bug is present */
+-#cmakedefine _CL_DISABLE_LONG
+-
+ /* Disable cl_khr_fp16 because fp16 is not supported */
+ #cmakedefine _CL_DISABLE_HALF
+
+diff --git a/lib/CL/devices/basic/basic.c b/lib/CL/devices/basic/basic.c
+index 8d1d8910..1dc7d303 100644
+--- a/lib/CL/devices/basic/basic.c
++++ b/lib/CL/devices/basic/basic.c
+@@ -381,11 +381,6 @@ pocl_basic_init (unsigned j, cl_device_id device, const char*
parameters)
+ if(device->llvm_cpu && (!strcmp(device->llvm_cpu,
"(unknown)")))
+ device->llvm_cpu = NULL;
+
+- // work-around LLVM bug where sizeof(long)=4
+- #ifdef _CL_DISABLE_LONG
+- device->has_64bit_long=0;
+- #endif
+-
+ return ret;
+ }
+
+diff --git a/lib/CL/devices/pthread/pthread.c b/lib/CL/devices/pthread/pthread.c
+index 0b88a74c..494ae8b2 100644
+--- a/lib/CL/devices/pthread/pthread.c
++++ b/lib/CL/devices/pthread/pthread.c
+@@ -263,11 +263,6 @@ pocl_pthread_init (unsigned j, cl_device_id device, const char*
parameters)
+ if(device->llvm_cpu && (!strcmp(device->llvm_cpu,
"(unknown)")))
+ device->llvm_cpu = NULL;
+
+- // work-around LLVM bug where sizeof(long)=4
+- #ifdef _CL_DISABLE_LONG
+- device->has_64bit_long=0;
+- #endif
+-
+ if (!scheduler_initialized)
+ {
+ scheduler_initialized = 1;
+--
+2.15.1
+
diff --git a/0004-Fix-an-incorrect-env-var-check.patch
b/0004-Fix-an-incorrect-env-var-check.patch
new file mode 100644
index 0000000..3431131
--- /dev/null
+++ b/0004-Fix-an-incorrect-env-var-check.patch
@@ -0,0 +1,27 @@
+From 6c2059eace57aa6fe12db161ac92bd72556680e7 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Thu, 4 Jan 2018 18:17:17 +0100
+Subject: [PATCH 04/14] Fix an incorrect env var check
+
+Thish should be a check for compiler files, not POCL_DEBUG.
+---
+ lib/CL/pocl_llvm_build.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/lib/CL/pocl_llvm_build.cc b/lib/CL/pocl_llvm_build.cc
+index 0d67d22f..9ad22796 100644
+--- a/lib/CL/pocl_llvm_build.cc
++++ b/lib/CL/pocl_llvm_build.cc
+@@ -109,8 +109,7 @@ load_source(FrontendOptions &fe,
+ static inline int
+ unlink_source(FrontendOptions &fe)
+ {
+- // don't unlink in debug mode
+- if (pocl_get_bool_option("POCL_DEBUG", 0))
++ if (pocl_get_bool_option("POCL_LEAVE_KERNEL_COMPILER_TEMP_FILES", 0) != 0)
+ return 0;
+
+ FrontendInputFile const& file = fe.Inputs.front();
+--
+2.15.1
+
diff --git a/0005-Add-asserts-to-pthread-API-calls.patch
b/0005-Add-asserts-to-pthread-API-calls.patch
new file mode 100644
index 0000000..e157788
--- /dev/null
+++ b/0005-Add-asserts-to-pthread-API-calls.patch
@@ -0,0 +1,194 @@
+From ae9c7bc62f6fe78fe894e1a9a9aaca8ed5e04878 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Fri, 5 Jan 2018 12:47:02 +0100
+Subject: [PATCH 05/14] Add asserts to pthread API calls
+
+---
+ lib/CL/devices/common.c | 8 ++--
+ lib/CL/devices/pthread/pocl-pthread_utils.h | 64 +++++++++++++++++++++++++----
+ lib/CL/pocl_cl.h | 49 ++++++++++++++++++----
+ 3 files changed, 102 insertions(+), 19 deletions(-)
+
+diff --git a/lib/CL/devices/common.c b/lib/CL/devices/common.c
+index 8c01191e..9895f1ae 100644
+--- a/lib/CL/devices/common.c
++++ b/lib/CL/devices/common.c
+@@ -1070,12 +1070,12 @@ pocl_memalign_alloc_global_mem(cl_device_id device, size_t align,
size_t size)
+ if (!ptr)
+ return NULL;
+
+- POCL_LOCK_OBJ (mem);
++ POCL_LOCK (mem->pocl_lock);
+ mem->currently_allocated += size;
+ if (mem->max_ever_allocated < mem->currently_allocated)
+ mem->max_ever_allocated = mem->currently_allocated;
+ assert(mem->currently_allocated <= mem->total_alloc_limit);
+- POCL_UNLOCK_OBJ (mem);
++ POCL_UNLOCK (mem->pocl_lock);
+
+ return ptr;
+ }
+@@ -1085,10 +1085,10 @@ pocl_free_global_mem(cl_device_id device, void* ptr, size_t
size)
+ {
+ pocl_global_mem_t *mem = device->global_memory;
+
+- POCL_LOCK_OBJ (mem);
++ POCL_LOCK (mem->pocl_lock);
+ assert(mem->currently_allocated >= size);
+ mem->currently_allocated -= size;
+- POCL_UNLOCK_OBJ (mem);
++ POCL_UNLOCK (mem->pocl_lock);
+
+ POCL_MEM_FREE(ptr);
+ }
+diff --git a/lib/CL/devices/pthread/pocl-pthread_utils.h
b/lib/CL/devices/pthread/pocl-pthread_utils.h
+index 310bab6c..47afc65d 100644
+--- a/lib/CL/devices/pthread/pocl-pthread_utils.h
++++ b/lib/CL/devices/pthread/pocl-pthread_utils.h
+@@ -8,19 +8,67 @@
+ #endif
+
+ /* locking macros */
+-#define PTHREAD_LOCK(__lock) pthread_mutex_lock(__lock)
+-#define PTHREAD_UNLOCK(__lock) pthread_mutex_unlock(__lock)
+-#define PTHREAD_INIT_LOCK(__lock) pthread_mutex_init(__lock, NULL)
+-#define PTHREAD_DESTROY_LOCK(__lock) pthread_mutex_destroy(__lock)
++#define PTHREAD_LOCK(__lock) \
++ do \
++ { \
++ int r = pthread_mutex_lock (__lock); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define PTHREAD_UNLOCK(__lock) \
++ do \
++ { \
++ int r = pthread_mutex_unlock (__lock); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define PTHREAD_INIT_LOCK(__lock) \
++ do \
++ { \
++ int r = pthread_mutex_init (__lock, NULL); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define PTHREAD_DESTROY_LOCK(__lock) \
++ do \
++ { \
++ int r = pthread_mutex_destroy (__lock); \
++ assert (r == 0); \
++ } \
++ while (0)
+
+ /* Apparently Mac OS X does not have spinlock, despite having pthreads.
+ * for now only enable spinlocks on linux.*/
+ #ifdef __linux__
+ #define PTHREAD_FAST_LOCK_T pthread_spinlock_t
+- #define PTHREAD_FAST_LOCK(l) pthread_spin_lock(l)
+- #define PTHREAD_FAST_UNLOCK(l) pthread_spin_unlock(l)
+- #define PTHREAD_FAST_INIT(l) pthread_spin_init(l, PTHREAD_PROCESS_PRIVATE)
+- #define PTHREAD_FAST_DESTROY(l) pthread_spin_destroy(l)
++#define PTHREAD_FAST_LOCK(l) \
++ do \
++ { \
++ int r = pthread_spin_lock (l); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define PTHREAD_FAST_UNLOCK(l) \
++ do \
++ { \
++ int r = pthread_spin_unlock (l); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define PTHREAD_FAST_INIT(l) \
++ do \
++ { \
++ int r = pthread_spin_init (l, PTHREAD_PROCESS_PRIVATE); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define PTHREAD_FAST_DESTROY(l) \
++ do \
++ { \
++ int r = pthread_spin_destroy (l); \
++ assert (r == 0); \
++ } \
++ while (0)
+ #else
+ #define PTHREAD_FAST_LOCK_T pthread_mutex_t
+ #define PTHREAD_FAST_LOCK(l) pthread_mutex_lock(l)
+diff --git a/lib/CL/pocl_cl.h b/lib/CL/pocl_cl.h
+index 03a0e91e..4c399784 100644
+--- a/lib/CL/pocl_cl.h
++++ b/lib/CL/pocl_cl.h
+@@ -63,21 +63,56 @@ typedef pthread_mutex_t pocl_lock_t;
+ /* Generic functionality for handling different types of
+ OpenCL (host) objects. */
+
+-#define POCL_LOCK(__LOCK__) pthread_mutex_lock (&(__LOCK__))
+-#define POCL_UNLOCK(__LOCK__) pthread_mutex_unlock (&(__LOCK__))
+-#define POCL_INIT_LOCK(__LOCK__) pthread_mutex_init (&(__LOCK__), NULL)
++#define POCL_LOCK(__LOCK__) \
++ do \
++ { \
++ int r = pthread_mutex_lock (&(__LOCK__)); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define POCL_UNLOCK(__LOCK__) \
++ do \
++ { \
++ int r = pthread_mutex_unlock (&(__LOCK__)); \
++ assert (r == 0); \
++ } \
++ while (0)
++#define POCL_INIT_LOCK(__LOCK__) \
++ do \
++ { \
++ int r = pthread_mutex_init (&(__LOCK__), NULL); \
++ assert (r == 0); \
++ } \
++ while (0)
+ /* We recycle OpenCL objects by not actually freeing them until the
+ very end. Thus, the lock should not be destoryed at the refcount 0. */
+-#define POCL_DESTROY_LOCK(__LOCK__) pthread_mutex_destroy (&(__LOCK__))
++#define POCL_DESTROY_LOCK(__LOCK__) \
++ do \
++ { \
++ int r = pthread_mutex_destroy (&(__LOCK__)); \
++ assert (r == 0); \
++ } \
++ while (0)
+
+-#define POCL_LOCK_OBJ(__OBJ__) POCL_LOCK((__OBJ__)->pocl_lock)
+-#define POCL_UNLOCK_OBJ(__OBJ__) POCL_UNLOCK((__OBJ__)->pocl_lock)
++#define POCL_LOCK_OBJ(__OBJ__) \
++ do \
++ { \
++ POCL_LOCK ((__OBJ__)->pocl_lock); \
++ assert ((__OBJ__)->pocl_refcount > 0); \
++ } \
++ while (0)
++#define POCL_UNLOCK_OBJ(__OBJ__) \
++ do \
++ { \
++ assert ((__OBJ__)->pocl_refcount >= 0); \
++ POCL_UNLOCK ((__OBJ__)->pocl_lock); \
++ } \
++ while (0)
+
+ #define POCL_RELEASE_OBJECT(__OBJ__, __NEW_REFCOUNT__) \
+ do { \
+ POCL_LOCK_OBJ (__OBJ__); \
+ __NEW_REFCOUNT__ = --(__OBJ__)->pocl_refcount; \
+- assert((__OBJ__)->pocl_refcount >= 0); \
+ POCL_UNLOCK_OBJ (__OBJ__); \
+ } while (0)
+
+--
+2.15.1
+
diff --git a/0006-Do-not-call-clFinish-on-CmdQueues-with-refcount-0.patch
b/0006-Do-not-call-clFinish-on-CmdQueues-with-refcount-0.patch
new file mode 100644
index 0000000..2c49751
--- /dev/null
+++ b/0006-Do-not-call-clFinish-on-CmdQueues-with-refcount-0.patch
@@ -0,0 +1,28 @@
+From 4e1bb5729dca7e294c70c1ed4b3959561d94acb4 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Tue, 9 Jan 2018 12:09:41 +0100
+Subject: [PATCH 06/14] Do not call clFinish on CmdQueues with refcount == 0
+
+This fails with the additional asserts from previous commit.
+Also it's just wrong :)
+---
+ lib/CL/clReleaseCommandQueue.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/CL/clReleaseCommandQueue.c b/lib/CL/clReleaseCommandQueue.c
+index 6feaa450..4e6920bd 100644
+--- a/lib/CL/clReleaseCommandQueue.c
++++ b/lib/CL/clReleaseCommandQueue.c
+@@ -39,8 +39,8 @@ POname(clReleaseCommandQueue)(cl_command_queue command_queue)
CL_API_SUFFIX__VER
+
+ if (new_refcount == 0)
+ {
++ assert (command_queue->command_count == 0);
+ POCL_MSG_PRINT_REFCOUNTS ("Free Command Queue %p\n", command_queue);
+- POname(clFinish)(command_queue);
+ if (command_queue->device->ops->free_queue)
+ command_queue->device->ops->free_queue (command_queue);
+ POCL_DESTROY_OBJECT (command_queue);
+--
+2.15.1
+
diff --git a/0007-Fix-a-potential-data-race-in-pocl_memalign_alloc_glo.patch
b/0007-Fix-a-potential-data-race-in-pocl_memalign_alloc_glo.patch
new file mode 100644
index 0000000..ab8a56d
--- /dev/null
+++ b/0007-Fix-a-potential-data-race-in-pocl_memalign_alloc_glo.patch
@@ -0,0 +1,49 @@
+From 638b0c3a37d599876b83faf42df79079512193a2 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Tue, 9 Jan 2018 13:57:47 +0100
+Subject: [PATCH 07/14] Fix a potential data race in
+ pocl_memalign_alloc_global_mem()
+
+---
+ lib/CL/devices/common.c | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/lib/CL/devices/common.c b/lib/CL/devices/common.c
+index 9895f1ae..f90d2321 100644
+--- a/lib/CL/devices/common.c
++++ b/lib/CL/devices/common.c
+@@ -1063,21 +1063,25 @@ void*
+ pocl_memalign_alloc_global_mem(cl_device_id device, size_t align, size_t size)
+ {
+ pocl_global_mem_t *mem = device->global_memory;
++ void *retval = NULL;
++
++ POCL_LOCK (mem->pocl_lock);
+ if ((mem->total_alloc_limit - mem->currently_allocated) < size)
+- return NULL;
++ goto ERROR;
+
+- void* ptr = pocl_memalign_alloc(align, size);
+- if (!ptr)
+- return NULL;
++ retval = pocl_memalign_alloc (align, size);
++ if (!retval)
++ goto ERROR;
+
+- POCL_LOCK (mem->pocl_lock);
+ mem->currently_allocated += size;
+ if (mem->max_ever_allocated < mem->currently_allocated)
+ mem->max_ever_allocated = mem->currently_allocated;
+ assert(mem->currently_allocated <= mem->total_alloc_limit);
++
++ERROR:
+ POCL_UNLOCK (mem->pocl_lock);
+
+- return ptr;
++ return retval;
+ }
+
+ void
+--
+2.15.1
+
diff --git a/0008-Fix-a-potential-data-race-in-pocl_create_event_sync.patch
b/0008-Fix-a-potential-data-race-in-pocl_create_event_sync.patch
new file mode 100644
index 0000000..8a9e5ae
--- /dev/null
+++ b/0008-Fix-a-potential-data-race-in-pocl_create_event_sync.patch
@@ -0,0 +1,37 @@
+From 59c55c4d58f8f4b60796efb6e53a498086b8f93e Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Tue, 9 Jan 2018 13:58:53 +0100
+Subject: [PATCH 08/14] Fix a potential data race in pocl_create_event_sync()
+
+---
+ lib/CL/pocl_util.c | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+diff --git a/lib/CL/pocl_util.c b/lib/CL/pocl_util.c
+index 1c342924..20bc63b4 100644
+--- a/lib/CL/pocl_util.c
++++ b/lib/CL/pocl_util.c
+@@ -374,16 +374,12 @@ pocl_create_event_sync(cl_event waiting_event,
+ if (notifier_event == NULL)
+ return CL_SUCCESS;
+
+- assert(notifier_event->pocl_refcount != 0);
++ pocl_lock_events_inorder (waiting_event, notifier_event);
++
+ POCL_MSG_PRINT_INFO("create event sync: waiting %d, notifier %d\n",
waiting_event->id, notifier_event->id);
+- if (waiting_event == notifier_event)
+- {
+- printf("waiting id %d, notifier id = %d\n", waiting_event->id,
+- notifier_event->id);
+- assert(waiting_event != notifier_event);
+- }
+
+- pocl_lock_events_inorder (waiting_event, notifier_event);
++ assert (notifier_event->pocl_refcount != 0);
++ assert (waiting_event != notifier_event);
+
+ LL_FOREACH (waiting_event->wait_list, wait_list_item)
+ {
+--
+2.15.1
+
diff --git a/0009-Fix-potential-race-in-clGetEventInfo.patch
b/0009-Fix-potential-race-in-clGetEventInfo.patch
new file mode 100644
index 0000000..b771ce1
--- /dev/null
+++ b/0009-Fix-potential-race-in-clGetEventInfo.patch
@@ -0,0 +1,48 @@
+From 8b77a178d1e6fa657b6b4b66a67a63dd608ca702 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Tue, 9 Jan 2018 14:49:37 +0100
+Subject: [PATCH 09/14] Fix potential race in clGetEventInfo()
+
+---
+ lib/CL/clGetEventInfo.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/lib/CL/clGetEventInfo.c b/lib/CL/clGetEventInfo.c
+index 5ab504b8..f36f6445 100644
+--- a/lib/CL/clGetEventInfo.c
++++ b/lib/CL/clGetEventInfo.c
+@@ -9,19 +9,26 @@ POname(clGetEventInfo)(cl_event event ,
+ CL_API_SUFFIX__VERSION_1_0
+ {
+ POCL_RETURN_ERROR_COND((event == NULL), CL_INVALID_EVENT);
++ POCL_LOCK_OBJ (event);
++ cl_int s = event->status;
++ cl_command_queue q = event->queue;
++ cl_command_type t = event->command_type;
++ cl_uint r = event->pocl_refcount;
++ cl_context c = event->context;
++ POCL_UNLOCK_OBJ (event);
+
+ switch (param_name)
+ {
+ case CL_EVENT_COMMAND_EXECUTION_STATUS:
+- POCL_RETURN_GETINFO (cl_int, event->status);
++ POCL_RETURN_GETINFO (cl_int, s);
+ case CL_EVENT_COMMAND_QUEUE:
+- POCL_RETURN_GETINFO(cl_command_queue, event->queue);
++ POCL_RETURN_GETINFO (cl_command_queue, q);
+ case CL_EVENT_COMMAND_TYPE:
+- POCL_RETURN_GETINFO(cl_command_type, event->command_type);
++ POCL_RETURN_GETINFO (cl_command_type, t);
+ case CL_EVENT_REFERENCE_COUNT:
+- POCL_RETURN_GETINFO(cl_uint, event->pocl_refcount);
++ POCL_RETURN_GETINFO (cl_uint, r);
+ case CL_EVENT_CONTEXT:
+- POCL_RETURN_GETINFO(cl_context, event->context);
++ POCL_RETURN_GETINFO (cl_context, c);
+ default:
+ break;
+ }
+--
+2.15.1
+
diff --git a/0010-Add-fsanitize-recover-address-to-ASAN-flags.patch
b/0010-Add-fsanitize-recover-address-to-ASAN-flags.patch
new file mode 100644
index 0000000..d6a5136
--- /dev/null
+++ b/0010-Add-fsanitize-recover-address-to-ASAN-flags.patch
@@ -0,0 +1,28 @@
+From 16d2c90e7b046137d5a0386ffda9c111ebd3761c Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Tue, 9 Jan 2018 14:22:42 +0100
+Subject: [PATCH 10/14] Add "-fsanitize-recover=address" to ASAN flags
+
+When used with env variable ASAN_OPTIONS=halt_on_error=0, this
+should enable ASAN builds to continue after first error - unlike
+the default which is to exit after first error.
+---
+ lib/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
+index 57690091..2cd3291d 100644
+--- a/lib/CMakeLists.txt
++++ b/lib/CMakeLists.txt
+@@ -34,7 +34,7 @@ endif()
+ set(SANITIZER_OPTIONS "")
+
+ if(ENABLE_ASAN)
+- list(APPEND SANITIZER_OPTIONS "-fsanitize=address")
++ list(APPEND SANITIZER_OPTIONS "-fsanitize=address"
"-fsanitize-recover=address")
+ list(APPEND SANITIZER_LIBS "asan")
+ endif()
+
+--
+2.15.1
+
diff --git a/0011-Fix-a-few-incorrect-missing-ifdef-cl_khr_fp64.patch
b/0011-Fix-a-few-incorrect-missing-ifdef-cl_khr_fp64.patch
new file mode 100644
index 0000000..15e7a97
--- /dev/null
+++ b/0011-Fix-a-few-incorrect-missing-ifdef-cl_khr_fp64.patch
@@ -0,0 +1,361 @@
+From c7102b1d347639d12545f1f00d8c8b1aa076182e Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Thu, 11 Jan 2018 09:33:58 +0100
+Subject: [PATCH 11/14] Fix a few incorrect / missing #ifdef cl_khr_fp64
+
+Simplifies printf.c to not require math.h, which was conflicting
+with pocl-types.h in case cl_khr_fp64 was disabled.
+
+Also fixes CMake variable ENABLE_FP64 to properly disable
+doubles. Pocl now builds with -DENABLE_FP64=OFF on 32bit ARM.
+---
+ CMakeLists.txt | 4 +++-
+ doc/sphinx/source/install.rst | 4 ++++
+ lib/kernel/host/CMakeLists.txt | 14 +++++++----
+ lib/kernel/printf.c | 48 ++++++++++++++++++++-----------------
+ lib/kernel/sleef-pocl/expfrexp.cl | 9 ++++---
+ lib/kernel/sleef/include/sleef_cl.h | 47 ++++++++++++++++++++++++++----------
+ lib/kernel/sleef/libm/sleef_glue.cl | 2 ++
+ 7 files changed, 83 insertions(+), 45 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 60d570b8..b89ccd80 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -751,6 +751,8 @@ if(ARM)
+ else()
+ option(ENABLE_FP64 "Enable FP64 on ARM32 - if you have at least VFP support for
doubles, you can leave it ON" ON )
+ endif()
++else()
++ set(ENABLE_FP64 ON CACHE INTERNAL "FP64, always on except ARM")
+ endif()
+
+ if(ARM32 OR (LLC_TRIPLE MATCHES "^arm"))
+@@ -800,7 +802,7 @@ if(X86)
+ set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp64
cl_khr_int64_base_atomics cl_khr_int64_extended_atomics")
+ endif()
+ # 32bit arm doesnt always support doubles
+-if(ENABLE_FP64 AND (NOT LLVM_OLDER_THAN_4_0))
++if(ARM AND ENABLE_FP64)
+ set(HOST_DEVICE_EXTENSIONS "${HOST_DEVICE_EXTENSIONS} cl_khr_fp64")
+ endif()
+
+diff --git a/doc/sphinx/source/install.rst b/doc/sphinx/source/install.rst
+index ea983cef..9703668e 100644
+--- a/doc/sphinx/source/install.rst
++++ b/doc/sphinx/source/install.rst
+@@ -134,6 +134,10 @@ use ";" as separator (you'll have to escape it for
bash).
+ if you want to avoid ICD and build pocl directly as libOpenCL library.
+ See also :ref:`linking-with-icd`
+
++- ``-DENABLE_FP64`` - for ARM platform only. If your CPU doesn't support any
++ doubles (VFP is enough), disable this. Defaults to OFF when LLVM is older
++ than 4.0, otherwise defaults to ON.
++
+ - ``-DPOCL_INSTALL_<something>_DIR`` The equivalent of ``--bindir``,
+ ``--sbindir`` etc fine-tuning of paths for autotools. See the beginning
+ of toplevel CMakeLists.txt for all the variables.
+diff --git a/lib/kernel/host/CMakeLists.txt b/lib/kernel/host/CMakeLists.txt
+index c3657a06..7a08f2ee 100644
+--- a/lib/kernel/host/CMakeLists.txt
++++ b/lib/kernel/host/CMakeLists.txt
+@@ -118,13 +118,13 @@ function(compile_sleef VARIANT SLEEF_CONFIG SLEEF_CONFIG_NEW
SLEEF_BC)
+
+ set(EXTRA_FLAGS
"-DDORENAME;-DPURE_C;-I${CMAKE_SOURCE_DIR}/lib/kernel/sleef/include")
+
+- if(ENABLE_CONFORMANCE)
++# disabled - this code uses libm
+ # compile_sleef_c_to_bc("c" "sleef/libm/sleef_builtin.c"
+ # "${VARIANT}" BC_FILE_LIST ${EXTRA_FLAGS})
+-# else()
+- # these may be faster than using libm, but not always precise
+- compile_sleef_c_to_bc("c" "sleef/libm/sleefsp.c"
+- "${VARIANT}" BC_FILE_LIST ${EXTRA_FLAGS})
++ compile_sleef_c_to_bc("c" "sleef/libm/sleefsp.c"
++ "${VARIANT}" BC_FILE_LIST ${EXTRA_FLAGS})
++
++ if(ENABLE_FP64)
+ compile_sleef_c_to_bc("c" "sleef/libm/sleefdp.c"
+ "${VARIANT}" BC_FILE_LIST ${EXTRA_FLAGS})
+ endif()
+@@ -135,6 +135,10 @@ function(compile_sleef VARIANT SLEEF_CONFIG SLEEF_CONFIG_NEW
SLEEF_BC)
+ file(READ "${CMAKE_SOURCE_DIR}/lib/kernel/sleef/test.c" TEST_SRC)
+ file(READ "${CMAKE_SOURCE_DIR}/lib/kernel/sleef/fma_test.c" FMA_TEST_SRC)
+
++ if(ENABLE_FP64)
++ set(STR "#define SLEEF_DOUBLE_AVAILABLE\n")
++ file(APPEND "${SLEEF_CONFIG_NEW}" "${STR}")
++ endif()
+ # current SLEEF code does not have code for
+ # ARM32 NEON double vectors (if they even exist)
+ if(NOT ARM32)
+diff --git a/lib/kernel/printf.c b/lib/kernel/printf.c
+index bd522fb0..37c7d6d6 100644
+--- a/lib/kernel/printf.c
++++ b/lib/kernel/printf.c
+@@ -25,10 +25,16 @@
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wformat-security"
+
+-#include <limits.h>
++#ifdef cl_khr_fp64
++#define LARGEST_FLOAT_TYPE double
++#define NAN __builtin_nan("1")
++#else
++#define LARGEST_FLOAT_TYPE float
++#define NAN __builtin_nanf("1")
++#endif
++
+ #include <stdarg.h>
+-#include <stdbool.h>
+-#include <math.h>
++#include <limits.h>
+
+ // We implement the OpenCL printf by calling the C99 printf. This is
+ // not very efficient, but is easy to implement.
+@@ -48,15 +54,13 @@ int snprintf(OCL_C_AS char* restrict str, size_t size,
+
+ // Conversion flags
+ typedef struct {
+- bool left;
+- bool plus;
+- bool space;
+- bool alt;
+- bool zero;
++ int left:1;
++ int plus:1;
++ int space:1;
++ int alt:1;
++ int zero:1;
+ } flags_t;
+
+-
+-
+ // Helper routines to output integers
+
+ #define INT_CONV_char "hh"
+@@ -139,9 +143,9 @@ float __attribute__((overloadable)) vload_half(size_t offset,
+ DEBUG_PRINTF(("[printf:floats:d=%d]\n", d)); \
+ if (d != 0) printf(comma); \
+ WIDTH val = (FLOAT_GET_##WIDTH((OCL_C_AS const WIDTH*)vals+d)); \
+- if (isnan (val)) \
++ if (val != val) \
+ val = NAN; \
+- printf(outfmt, (double)val); \
++ printf (outfmt, (LARGEST_FLOAT_TYPE)val); \
+ } \
+ DEBUG_PRINTF(("[printf:floats:done]\n")); \
+ }
+@@ -249,18 +253,18 @@ int __cl_printf(const OCL_CONSTANT_AS char* restrict format, ...)
+ DEBUG_PRINTF(("[printf:arg]\n"));
+ // Flags
+ flags_t flags;
+- flags.left = false;
+- flags.plus = false;
+- flags.space = false;
+- flags.alt = false;
+- flags.zero = false;
++ flags.left = 0;
++ flags.plus = 0;
++ flags.space = 0;
++ flags.alt = 0;
++ flags.zero = 0;
+ for (;;) {
+ switch (ch) {
+- case '-': if (flags.left) goto error; flags.left = true; break;
+- case '+': if (flags.plus) goto error; flags.plus = true; break;
+- case ' ': if (flags.space) goto error; flags.space = true; break;
+- case '#': if (flags.alt) goto error; flags.alt = true; break;
+- case '0': if (flags.zero) goto error; flags.zero = true; break;
++ case '-': if (flags.left) goto error; flags.left = 1; break;
++ case '+': if (flags.plus) goto error; flags.plus = 1; break;
++ case ' ': if (flags.space) goto error; flags.space = 1; break;
++ case '#': if (flags.alt) goto error; flags.alt = 1; break;
++ case '0': if (flags.zero) goto error; flags.zero = 1; break;
+ default: goto flags_done;
+ }
+ ch = *++format;
+diff --git a/lib/kernel/sleef-pocl/expfrexp.cl b/lib/kernel/sleef-pocl/expfrexp.cl
+index 7c3c595b..60d5f2aa 100644
+--- a/lib/kernel/sleef-pocl/expfrexp.cl
++++ b/lib/kernel/sleef-pocl/expfrexp.cl
+@@ -1,10 +1,5 @@
+ #include "sleef_cl.h"
+
+-_CL_ALWAYSINLINE long2 Sleef_expfrexpd2_long (double2 x);
+-_CL_ALWAYSINLINE long4 Sleef_expfrexpd4_long (double4 x);
+-_CL_ALWAYSINLINE long8 Sleef_expfrexpd8_long (double8 x);
+-
+-
+ _CL_OVERLOADABLE
+ int
+ _cl_expfrexp (float x)
+@@ -91,6 +86,10 @@ _cl_expfrexp (float16 x)
+
+ #ifdef cl_khr_fp64
+
++_CL_ALWAYSINLINE long2 Sleef_expfrexpd2_long (double2 x);
++_CL_ALWAYSINLINE long4 Sleef_expfrexpd4_long (double4 x);
++_CL_ALWAYSINLINE long8 Sleef_expfrexpd8_long (double8 x);
++
+ _CL_OVERLOADABLE
+ long
+ _cl_expfrexp (double x)
+diff --git a/lib/kernel/sleef/include/sleef_cl.h b/lib/kernel/sleef/include/sleef_cl.h
+index 89d2b3aa..6f436271 100644
+--- a/lib/kernel/sleef/include/sleef_cl.h
++++ b/lib/kernel/sleef/include/sleef_cl.h
+@@ -59,14 +59,21 @@ typedef float float4 __attribute__ ((__ext_vector_type__ (4)));
+ typedef float float8 __attribute__ ((__ext_vector_type__ (8)));
+ typedef float float16 __attribute__ ((__ext_vector_type__ (16)));
+
++#ifdef SLEEF_DOUBLE_AVAILABLE
+ typedef double double2 __attribute__ ((__ext_vector_type__ (2)));
+ typedef double double3 __attribute__ ((__ext_vector_type__ (3)));
+ typedef double double4 __attribute__ ((__ext_vector_type__ (4)));
+ typedef double double8 __attribute__ ((__ext_vector_type__ (8)));
+ typedef double double16 __attribute__ ((__ext_vector_type__ (16)));
+
++#define cl_khr_fp64
++
++#endif
++
+ #endif
+
++#ifdef cl_khr_fp64
++
+ #ifndef Sleef_double2_DEFINED
+ #define Sleef_double2_DEFINED
+ typedef struct
+@@ -75,14 +82,6 @@ typedef struct
+ } Sleef_double2;
+ #endif
+
+-#ifndef Sleef_float2_DEFINED
+-#define Sleef_float2_DEFINED
+-typedef struct
+-{
+- float x, y;
+-} Sleef_float2;
+-#endif
+-
+ double Sleef_sin_u35 (double);
+ double Sleef_cos_u35 (double);
+ Sleef_double2 Sleef_sincos_u35 (double);
+@@ -147,6 +146,19 @@ double Sleef_tgamma_u10 (double);
+ double Sleef_erf_u10 (double);
+ double Sleef_erfc_u15 (double);
+
++double Sleef_pown_u10 (double, int);
++double Sleef_powr_u10 (double, double);
++
++#endif
++
++#ifndef Sleef_float2_DEFINED
++#define Sleef_float2_DEFINED
++typedef struct
++{
++ float x, y;
++} Sleef_float2;
++#endif
++
+ float Sleef_sinf_u35 (float);
+ float Sleef_cosf_u35 (float);
+ Sleef_float2 Sleef_sincosf_u35 (float);
+@@ -212,9 +224,7 @@ float Sleef_tgammaf_u10 (float);
+ float Sleef_erff_u10 (float);
+ float Sleef_erfcf_u15 (float);
+
+-double Sleef_pown_u10 (double, int);
+ float Sleef_pownf_u10 (float, int);
+-double Sleef_powr_u10 (double, double);
+ float Sleef_powrf_u10 (float, float);
+
+
+@@ -222,6 +232,8 @@ float Sleef_powrf_u10 (float, float);
+
+ #ifdef SLEEF_VEC_512_AVAILABLE
+
++#ifdef cl_khr_fp64
++
+ #ifndef Sleef_double8_2_DEFINED
+ typedef struct
+ {
+@@ -295,6 +307,8 @@ double8 Sleef_tgammad8_u10 (double8);
+ double8 Sleef_erfd8_u10 (double8);
+ double8 Sleef_erfcd8_u15 (double8);
+
++#endif
++
+ #ifndef Sleef_float16_2_DEFINED
+ typedef struct
+ {
+@@ -380,6 +394,8 @@ float16 Sleef_powrf16_u10 (float16, float16);
+
+ #ifdef SLEEF_VEC_256_AVAILABLE
+
++#ifdef cl_khr_fp64
++
+ #ifndef Sleef_double4_2_DEFINED
+ typedef struct
+ {
+@@ -453,6 +469,8 @@ double4 Sleef_tgammad4_u10 (double4);
+ double4 Sleef_erfd4_u10 (double4);
+ double4 Sleef_erfcd4_u15 (double4);
+
++#endif
++
+ #ifndef Sleef_float8_2_DEFINED
+ typedef struct
+ {
+@@ -535,6 +553,8 @@ float8 Sleef_powrf8_u10 (float8, float8);
+
+ #ifdef SLEEF_VEC_128_AVAILABLE
+
++#ifdef cl_khr_fp64
++
+ #ifndef Sleef_double2_2_DEFINED
+ typedef struct
+ {
+@@ -608,6 +628,11 @@ double2 Sleef_tgammad2_u10 (double2);
+ double2 Sleef_erfd2_u10 (double2);
+ double2 Sleef_erfcd2_u15 (double2);
+
++double2 Sleef_pownd2_u10 (double2, int2);
++double2 Sleef_powrd2_u10 (double2, double2);
++
++#endif
++
+ #ifndef Sleef_float4_2_DEFINED
+ typedef struct
+ {
+@@ -681,9 +706,7 @@ float4 Sleef_tgammaf4_u10 (float4);
+ float4 Sleef_erff4_u10 (float4);
+ float4 Sleef_erfcf4_u15 (float4);
+
+-double2 Sleef_pownd2_u10 (double2, int2);
+ float4 Sleef_pownf4_u10 (float4, int4);
+-double2 Sleef_powrd2_u10 (double2, double2);
+ float4 Sleef_powrf4_u10 (float4, float4);
+
+ #endif
+diff --git a/lib/kernel/sleef/libm/sleef_glue.cl b/lib/kernel/sleef/libm/sleef_glue.cl
+index ad98b43e..cd4bfa34 100644
+--- a/lib/kernel/sleef/libm/sleef_glue.cl
++++ b/lib/kernel/sleef/libm/sleef_glue.cl
+@@ -23,6 +23,7 @@
+
+ #include "sleef_cl.h"
+
++#ifdef cl_khr_fp64
+ #ifdef SLEEF_VEC_128_AVAILABLE
+
+ _CL_ALWAYSINLINE double2 Sleef_ldexpd2_long (double2 x, long2 k);
+@@ -76,3 +77,4 @@ Sleef_expfrexpd8 (double8 x)
+ }
+
+ #endif
++#endif
+--
+2.15.1
+
diff --git a/0012-Mark-test_clSetEventCallback-as-WILL_FAIL-when-TSan-.patch
b/0012-Mark-test_clSetEventCallback-as-WILL_FAIL-when-TSan-.patch
new file mode 100644
index 0000000..e6c8dfb
--- /dev/null
+++ b/0012-Mark-test_clSetEventCallback-as-WILL_FAIL-when-TSan-.patch
@@ -0,0 +1,32 @@
+From 0029cab0c15179cb8a46b419104227c2c1d877a8 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Thu, 11 Jan 2018 12:48:19 +0100
+Subject: [PATCH 12/14] Mark test_clSetEventCallback as WILL_FAIL when TSan is
+ enabled
+
+due to how the test is written, TSan will inevitably complain.
+---
+ tests/runtime/CMakeLists.txt | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/tests/runtime/CMakeLists.txt b/tests/runtime/CMakeLists.txt
+index c68fe327..a0409da9 100644
+--- a/tests/runtime/CMakeLists.txt
++++ b/tests/runtime/CMakeLists.txt
+@@ -126,6 +126,13 @@ set_tests_properties("runtime/test_kernel_cache_includes"
+ PROPERTIES PASS_REGULAR_EXPRESSION
+ "function 1.*first include.*function 2.*second include")
+
++# event callback test changes shared variables in the callbacks
++# doesn't need fixing in test, but TSan inevitably complains
++if(ENABLE_TSAN)
++ set_tests_properties("runtime/clSetEventCallback"
++ PROPERTIES WILL_FAIL 1)
++endif()
++
+ # Label tests that work with CUDA backend
+ set_property(TEST
+ "runtime/clGetDeviceInfo"
+--
+2.15.1
+
diff --git a/0013-Fix-a-compilation-warning.patch b/0013-Fix-a-compilation-warning.patch
new file mode 100644
index 0000000..13b1491
--- /dev/null
+++ b/0013-Fix-a-compilation-warning.patch
@@ -0,0 +1,234 @@
+From 84029fdf7dde331a45632272854922db0da8e3ad Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Thu, 11 Jan 2018 12:50:15 +0100
+Subject: [PATCH 13/14] Fix a compilation warning
+
+(float)(double literal) complains when cl_khr_fp64 is disabled
+---
+ lib/kernel/convert_type.cl | 48 +++++++++++++++++++++++-----------------------
+ lib/kernel/convert_type.py | 4 ++--
+ 2 files changed, 26 insertions(+), 26 deletions(-)
+
+diff --git a/lib/kernel/convert_type.cl b/lib/kernel/convert_type.cl
+index 8da102a3..11aca55c 100644
+--- a/lib/kernel/convert_type.cl
++++ b/lib/kernel/convert_type.cl
+@@ -38567,7 +38567,7 @@ float convert_float_rtz(long x)
+ ulong abs_x = abs(x);
+ ulong abs_y = abs(y);
+ float res = select(r, nextafter(r, sign(r) * (float)-INFINITY), convert_int(abs_y >
abs_x));
+- return select(res, (float)(0x1.fffffep+62), convert_int(x >=
0x7fffffffffffffffL));
++ return select(res, (float)(0x1.fffffep+62f), convert_int(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38597,7 +38597,7 @@ float convert_float_rtn(long x)
+ float r = convert_float(x);
+ long y = convert_long_sat(r);
+ float res = select(r, nextafter(r, (float)-INFINITY), convert_int(y > x));
+- return select(res, (float)(0x1.fffffep+62), convert_int(x >=
0x7fffffffffffffffL));
++ return select(res, (float)(0x1.fffffep+62f), convert_int(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38610,7 +38610,7 @@ float2 convert_float2_rtz(long2 x)
+ ulong2 abs_x = abs(x);
+ ulong2 abs_y = abs(y);
+ float2 res = select(r, nextafter(r, sign(r) * (float2)-INFINITY), convert_int2(abs_y
> abs_x));
+- return select(res, (float2)(0x1.fffffep+62), convert_int2(x >=
0x7fffffffffffffffL));
++ return select(res, (float2)(0x1.fffffep+62f), convert_int2(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38640,7 +38640,7 @@ float2 convert_float2_rtn(long2 x)
+ float2 r = convert_float2(x);
+ long2 y = convert_long2_sat(r);
+ float2 res = select(r, nextafter(r, (float2)-INFINITY), convert_int2(y > x));
+- return select(res, (float2)(0x1.fffffep+62), convert_int2(x >=
0x7fffffffffffffffL));
++ return select(res, (float2)(0x1.fffffep+62f), convert_int2(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38653,7 +38653,7 @@ float3 convert_float3_rtz(long3 x)
+ ulong3 abs_x = abs(x);
+ ulong3 abs_y = abs(y);
+ float3 res = select(r, nextafter(r, sign(r) * (float3)-INFINITY), convert_int3(abs_y
> abs_x));
+- return select(res, (float3)(0x1.fffffep+62), convert_int3(x >=
0x7fffffffffffffffL));
++ return select(res, (float3)(0x1.fffffep+62f), convert_int3(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38683,7 +38683,7 @@ float3 convert_float3_rtn(long3 x)
+ float3 r = convert_float3(x);
+ long3 y = convert_long3_sat(r);
+ float3 res = select(r, nextafter(r, (float3)-INFINITY), convert_int3(y > x));
+- return select(res, (float3)(0x1.fffffep+62), convert_int3(x >=
0x7fffffffffffffffL));
++ return select(res, (float3)(0x1.fffffep+62f), convert_int3(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38696,7 +38696,7 @@ float4 convert_float4_rtz(long4 x)
+ ulong4 abs_x = abs(x);
+ ulong4 abs_y = abs(y);
+ float4 res = select(r, nextafter(r, sign(r) * (float4)-INFINITY), convert_int4(abs_y
> abs_x));
+- return select(res, (float4)(0x1.fffffep+62), convert_int4(x >=
0x7fffffffffffffffL));
++ return select(res, (float4)(0x1.fffffep+62f), convert_int4(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38726,7 +38726,7 @@ float4 convert_float4_rtn(long4 x)
+ float4 r = convert_float4(x);
+ long4 y = convert_long4_sat(r);
+ float4 res = select(r, nextafter(r, (float4)-INFINITY), convert_int4(y > x));
+- return select(res, (float4)(0x1.fffffep+62), convert_int4(x >=
0x7fffffffffffffffL));
++ return select(res, (float4)(0x1.fffffep+62f), convert_int4(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38739,7 +38739,7 @@ float8 convert_float8_rtz(long8 x)
+ ulong8 abs_x = abs(x);
+ ulong8 abs_y = abs(y);
+ float8 res = select(r, nextafter(r, sign(r) * (float8)-INFINITY), convert_int8(abs_y
> abs_x));
+- return select(res, (float8)(0x1.fffffep+62), convert_int8(x >=
0x7fffffffffffffffL));
++ return select(res, (float8)(0x1.fffffep+62f), convert_int8(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38769,7 +38769,7 @@ float8 convert_float8_rtn(long8 x)
+ float8 r = convert_float8(x);
+ long8 y = convert_long8_sat(r);
+ float8 res = select(r, nextafter(r, (float8)-INFINITY), convert_int8(y > x));
+- return select(res, (float8)(0x1.fffffep+62), convert_int8(x >=
0x7fffffffffffffffL));
++ return select(res, (float8)(0x1.fffffep+62f), convert_int8(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38782,7 +38782,7 @@ float16 convert_float16_rtz(long16 x)
+ ulong16 abs_x = abs(x);
+ ulong16 abs_y = abs(y);
+ float16 res = select(r, nextafter(r, sign(r) * (float16)-INFINITY),
convert_int16(abs_y > abs_x));
+- return select(res, (float16)(0x1.fffffep+62), convert_int16(x >=
0x7fffffffffffffffL));
++ return select(res, (float16)(0x1.fffffep+62f), convert_int16(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -38812,7 +38812,7 @@ float16 convert_float16_rtn(long16 x)
+ float16 r = convert_float16(x);
+ long16 y = convert_long16_sat(r);
+ float16 res = select(r, nextafter(r, (float16)-INFINITY), convert_int16(y > x));
+- return select(res, (float16)(0x1.fffffep+62), convert_int16(x >=
0x7fffffffffffffffL));
++ return select(res, (float16)(0x1.fffffep+62f), convert_int16(x >=
0x7fffffffffffffffL));
+ }
+ #endif
+
+@@ -39083,7 +39083,7 @@ float convert_float_rtz(ulong x)
+ ulong abs_x = abs(x);
+ ulong abs_y = abs(y);
+ float res = select(r, nextafter(r, sign(r) * (float)-INFINITY), convert_int(abs_y >
abs_x));
+- return select(res, (float)(0x1.fffffep+63), convert_int(x >=
0xfffffffffffffffeUL));
++ return select(res, (float)(0x1.fffffep+63f), convert_int(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39113,7 +39113,7 @@ float convert_float_rtn(ulong x)
+ float r = convert_float(x);
+ ulong y = convert_ulong_sat(r);
+ float res = select(r, nextafter(r, (float)-INFINITY), convert_int(y > x));
+- return select(res, (float)(0x1.fffffep+63), convert_int(x >=
0xfffffffffffffffeUL));
++ return select(res, (float)(0x1.fffffep+63f), convert_int(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39126,7 +39126,7 @@ float2 convert_float2_rtz(ulong2 x)
+ ulong2 abs_x = abs(x);
+ ulong2 abs_y = abs(y);
+ float2 res = select(r, nextafter(r, sign(r) * (float2)-INFINITY), convert_int2(abs_y
> abs_x));
+- return select(res, (float2)(0x1.fffffep+63), convert_int2(x >=
0xfffffffffffffffeUL));
++ return select(res, (float2)(0x1.fffffep+63f), convert_int2(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39156,7 +39156,7 @@ float2 convert_float2_rtn(ulong2 x)
+ float2 r = convert_float2(x);
+ ulong2 y = convert_ulong2_sat(r);
+ float2 res = select(r, nextafter(r, (float2)-INFINITY), convert_int2(y > x));
+- return select(res, (float2)(0x1.fffffep+63), convert_int2(x >=
0xfffffffffffffffeUL));
++ return select(res, (float2)(0x1.fffffep+63f), convert_int2(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39169,7 +39169,7 @@ float3 convert_float3_rtz(ulong3 x)
+ ulong3 abs_x = abs(x);
+ ulong3 abs_y = abs(y);
+ float3 res = select(r, nextafter(r, sign(r) * (float3)-INFINITY), convert_int3(abs_y
> abs_x));
+- return select(res, (float3)(0x1.fffffep+63), convert_int3(x >=
0xfffffffffffffffeUL));
++ return select(res, (float3)(0x1.fffffep+63f), convert_int3(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39199,7 +39199,7 @@ float3 convert_float3_rtn(ulong3 x)
+ float3 r = convert_float3(x);
+ ulong3 y = convert_ulong3_sat(r);
+ float3 res = select(r, nextafter(r, (float3)-INFINITY), convert_int3(y > x));
+- return select(res, (float3)(0x1.fffffep+63), convert_int3(x >=
0xfffffffffffffffeUL));
++ return select(res, (float3)(0x1.fffffep+63f), convert_int3(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39212,7 +39212,7 @@ float4 convert_float4_rtz(ulong4 x)
+ ulong4 abs_x = abs(x);
+ ulong4 abs_y = abs(y);
+ float4 res = select(r, nextafter(r, sign(r) * (float4)-INFINITY), convert_int4(abs_y
> abs_x));
+- return select(res, (float4)(0x1.fffffep+63), convert_int4(x >=
0xfffffffffffffffeUL));
++ return select(res, (float4)(0x1.fffffep+63f), convert_int4(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39242,7 +39242,7 @@ float4 convert_float4_rtn(ulong4 x)
+ float4 r = convert_float4(x);
+ ulong4 y = convert_ulong4_sat(r);
+ float4 res = select(r, nextafter(r, (float4)-INFINITY), convert_int4(y > x));
+- return select(res, (float4)(0x1.fffffep+63), convert_int4(x >=
0xfffffffffffffffeUL));
++ return select(res, (float4)(0x1.fffffep+63f), convert_int4(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39255,7 +39255,7 @@ float8 convert_float8_rtz(ulong8 x)
+ ulong8 abs_x = abs(x);
+ ulong8 abs_y = abs(y);
+ float8 res = select(r, nextafter(r, sign(r) * (float8)-INFINITY), convert_int8(abs_y
> abs_x));
+- return select(res, (float8)(0x1.fffffep+63), convert_int8(x >=
0xfffffffffffffffeUL));
++ return select(res, (float8)(0x1.fffffep+63f), convert_int8(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39285,7 +39285,7 @@ float8 convert_float8_rtn(ulong8 x)
+ float8 r = convert_float8(x);
+ ulong8 y = convert_ulong8_sat(r);
+ float8 res = select(r, nextafter(r, (float8)-INFINITY), convert_int8(y > x));
+- return select(res, (float8)(0x1.fffffep+63), convert_int8(x >=
0xfffffffffffffffeUL));
++ return select(res, (float8)(0x1.fffffep+63f), convert_int8(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39298,7 +39298,7 @@ float16 convert_float16_rtz(ulong16 x)
+ ulong16 abs_x = abs(x);
+ ulong16 abs_y = abs(y);
+ float16 res = select(r, nextafter(r, sign(r) * (float16)-INFINITY),
convert_int16(abs_y > abs_x));
+- return select(res, (float16)(0x1.fffffep+63), convert_int16(x >=
0xfffffffffffffffeUL));
++ return select(res, (float16)(0x1.fffffep+63f), convert_int16(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+@@ -39328,7 +39328,7 @@ float16 convert_float16_rtn(ulong16 x)
+ float16 r = convert_float16(x);
+ ulong16 y = convert_ulong16_sat(r);
+ float16 res = select(r, nextafter(r, (float16)-INFINITY), convert_int16(y > x));
+- return select(res, (float16)(0x1.fffffep+63), convert_int16(x >=
0xfffffffffffffffeUL));
++ return select(res, (float16)(0x1.fffffep+63f), convert_int16(x >=
0xfffffffffffffffeUL));
+ }
+ #endif
+
+--
+2.15.1
+
diff --git a/0014-Fix-a-data-race-in-pocl_runtime_config.c.patch
b/0014-Fix-a-data-race-in-pocl_runtime_config.c.patch
new file mode 100644
index 0000000..259637f
--- /dev/null
+++ b/0014-Fix-a-data-race-in-pocl_runtime_config.c.patch
@@ -0,0 +1,27 @@
+From da7d8cee0fffeebe5490d0a9770e760af0197909 Mon Sep 17 00:00:00 2001
+From: Michal Babej <michal.babej(a)tut.fi>
+Date: Thu, 11 Jan 2018 13:17:46 +0100
+Subject: [PATCH 14/14] Fix a data race in pocl_runtime_config.c
+
+LL_PREPEND(head, item) changes the head (env_cache) on every call,
+which conflicts with other threads calling find_env() with env_cache.
+---
+ lib/CL/pocl_runtime_config.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/CL/pocl_runtime_config.c b/lib/CL/pocl_runtime_config.c
+index d84ea263..c7000068 100644
+--- a/lib/CL/pocl_runtime_config.c
++++ b/lib/CL/pocl_runtime_config.c
+@@ -62,7 +62,7 @@ static env_data* find_env (env_data* cache, const char* key)
+ ed->env = strdup (key);
+ ed->value = strdup (value);
+ ed->next = NULL;
+- LL_PREPEND(env_cache, ed);
++ LL_APPEND(env_cache, ed);
+ POCL_UNLOCK(lock);
+ return ed;
+ }
+--
+2.15.1
+
diff --git a/pocl.spec b/pocl.spec
index 8f54fc1..98744eb 100644
--- a/pocl.spec
+++ b/pocl.spec
@@ -3,7 +3,7 @@
Summary: Portable Computing Language - an OpenCL implementation
Name: pocl
Version: 1.0
-Release: 1%{?dist}
+Release: 2%{?dist}
# The whole code is under MIT
# except include/utlist.h which is under BSD (and unbundled) and
@@ -12,16 +12,29 @@ License: MIT and BSD and (GPLv3+ or LGPLv3+)
URL:
http://pocl.sourceforge.net
Source0:
http://portablecl.org/downloads/%{name}-%{version}.tar.gz
-Patch1: 0001-wrap-more-stuff-for-64-bit-atomics.patch
-#https://github.com/pocl/pocl/issues/544
-Patch3: 0001-Revert-lib-kernel-printf.c-fix-nan-on-output.patch
+#
https://github.com/pocl/pocl/pull/601
+Patch0001: 0001-Fix-issue-597-for-32bit-ARM.patch
+Patch0002: 0002-Try-to-fix-596-provide-additional-pocl-build-informa.patch
+Patch0003: 0003-Remove-CL_DISABLE_LONG.patch
+Patch0004: 0004-Fix-an-incorrect-env-var-check.patch
+Patch0005: 0005-Add-asserts-to-pthread-API-calls.patch
+Patch0006: 0006-Do-not-call-clFinish-on-CmdQueues-with-refcount-0.patch
+Patch0007: 0007-Fix-a-potential-data-race-in-pocl_memalign_alloc_glo.patch
+Patch0008: 0008-Fix-a-potential-data-race-in-pocl_create_event_sync.patch
+Patch0009: 0009-Fix-potential-race-in-clGetEventInfo.patch
+Patch0010: 0010-Add-fsanitize-recover-address-to-ASAN-flags.patch
+Patch0011: 0011-Fix-a-few-incorrect-missing-ifdef-cl_khr_fp64.patch
+Patch0012: 0012-Mark-test_clSetEventCallback-as-WILL_FAIL-when-TSan-.patch
+Patch0013: 0013-Fix-a-compilation-warning.patch
+Patch0014: 0014-Fix-a-data-race-in-pocl_runtime_config.c.patch
+# FIXME: link
+Patch1001: 0001-wrap-more-stuff-for-64-bit-atomics.patch
# aarch64 seems to have a build system problem that makes it pass -march=(unknown).
-# armv7hl fails to build due to
https://github.com/pocl/pocl/issues/597.
# ppc64 builds fine, but: 41% tests passed, 64 tests failed out of 108.
# ppc64le fails with compilation errors.
# s390(x) clang build still seems to be suffering from bug 1309055.
-ExcludeArch: aarch64 %{arm} ppc64 ppc64le s390 s390x
+ExcludeArch: aarch64 ppc64 ppc64le s390 s390x
BuildRequires: cmake
BuildRequires: clang clang-devel
@@ -86,9 +99,8 @@ pushd %{_target_platform}
%ifarch %{ix86} x86_64
-DKERNELLIB_HOST_CPU_VARIANTS=distro \
%endif
-%ifarch %{arm}
+%ifarch aarch64 %{arm}
-DLLC_HOST_CPU="generic" \
- -DCL_DISABLE_LONG=true \
%endif
-DPOCL_ICD_ABSOLUTE_PATH=OFF \
%{nil}
@@ -106,8 +118,14 @@ popd
%check
pushd %{_target_platform}
- #
https://github.com/pocl/pocl/issues/318
- ctest -VV --output-on-failure || :
+#
https://github.com/pocl/pocl/issues/602
+#
https://github.com/pocl/pocl/issues/603
+ ctest -VV \
+ %ifarch %{ix86} %{arm}
+ || :
+ %else
+ ;
+ %endif
popd
%post -p /sbin/ldconfig
@@ -129,6 +147,9 @@ popd
%{_includedir}/%{name}u.h
%changelog
+* Fri Jan 12 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 1.0-2
+- Re-enable arm
+
* Mon Jan 01 2018 Igor Gnatenko <ignatenkobrain(a)fedoraproject.org> - 1.0-1
- Update to 1.0