Fix compilation error for clang:
In function `_odp_atomic_u128_xchg_mm':
undefined reference to `__atomic_exchange'
Clang less than 3.6 has issue with defined _SIZEOF_INT128_ and
 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16  but not supported
__atomic_exchange().  This patch adds additional check for clang
version.

Signed-off-by: Maxim Uvarov <[email protected]>
---
 v2: add check for clang version

 platform/linux-generic/include/odp_atomic_internal.h | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/platform/linux-generic/include/odp_atomic_internal.h 
b/platform/linux-generic/include/odp_atomic_internal.h
index 3c5606c..67e8f82 100644
--- a/platform/linux-generic/include/odp_atomic_internal.h
+++ b/platform/linux-generic/include/odp_atomic_internal.h
@@ -589,12 +589,21 @@ static inline void 
_odp_atomic_flag_clear(_odp_atomic_flag_t *flag)
 
 /* Check if target and compiler supports 128-bit scalars and corresponding
  * exchange and CAS operations */
-/* GCC on x86-64 needs -mcx16 compiler option */
+/* GCC/clang on x86-64 needs -mcx16 compiler option */
 #if defined __SIZEOF_INT128__ && defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
 
-/** Preprocessor symbol that indicates support for 128-bit atomics */
+#if defined(__clang__)
+
+#if ((__clang_major__ * 100 +  __clang_minor__) >= 306)
+#define ODP_ATOMIC_U128
+#endif
+
+#else /* gcc */
 #define ODP_ATOMIC_U128
+#endif
+#endif
 
+#ifdef ODP_ATOMIC_U128
 /** An unsigned 128-bit (16-byte) scalar type */
 typedef __int128 _uint128_t;
 
-- 
2.7.1.250.gff4ea60

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to