#ifndef CDSLIB_COMPILER_CLANG_DEFS_H
#define CDSLIB_COMPILER_CLANG_DEFS_H
-/*
- Known issues:
- Error compiling 64bit boost.atomic on clang 3.4 - 3.5, see https://svn.boost.org/trac/boost/ticket/9610
- Solution: use boost 1.56 +
-*/
-
// Compiler version
#define CDS_COMPILER_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
#define CDS_COMPILER__NAME ("clang " __clang_version__)
#define CDS_COMPILER__NICK "clang"
-#if CDS_COMPILER_VERSION < 30300
-# error "Compiler version error. Clang version 3.3.0 and above is supported"
+#if CDS_COMPILER_VERSION < 30600
+# error "Compiler version error. Clang version 3.6.0 and above is supported"
#endif
#if defined(_LIBCPP_VERSION) && !defined(CDS_USE_BOOST_ATOMIC) && CDS_COMPILER_VERSION < 30700
# define CDS_DEPRECATED( reason ) __attribute__((deprecated( reason )))
#endif
+#define CDS_NORETURN __attribute__((__noreturn__))
+
// *************************************************
// Features
#if defined(__has_feature) && __has_feature(thread_sanitizer)
-# define CDS_THREAD_SANITIZER_ENABLED
+# ifndef CDS_THREAD_SANITIZER_ENABLED
+# define CDS_THREAD_SANITIZER_ENABLED
+# endif
#endif
+#if defined(__has_feature) && __has_feature(address_sanitizer)
+# ifndef CDS_ADDRESS_SANITIZER_ENABLED
+# define CDS_ADDRESS_SANITIZER_ENABLED
+# endif
+#endif
+
+
// *************************************************
// Alignment macro
#define cds_likely( expr ) __builtin_expect( !!( expr ), 1 )
#define cds_unlikely( expr ) __builtin_expect( !!( expr ), 0 )
+// Exceptions
+
+#if defined( __EXCEPTIONS ) && __EXCEPTIONS == 1
+# define CDS_EXCEPTION_ENABLED
+#endif
+
+
// double-width CAS support - only for libc++
+// You can manually suppress wide-atomic support by defining in compiler command line:
+// for 64bit platform: -DCDS_DISABLE_128BIT_ATOMIC
+// for 32bit platform: -DCDS_DISABLE_64BIT_ATOMIC
#ifdef _LIBCPP_VERSION
# if CDS_BUILD_BITS == 64
-# ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+# if !defined( CDS_DISABLE_128BIT_ATOMIC ) && defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 )
# define CDS_DCAS_SUPPORT
# endif
# else
-# ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
+# if !defined( CDS_DISABLE_64BIT_ATOMIC ) && defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 )
# define CDS_DCAS_SUPPORT
# endif
# endif