X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fcompiler%2Fclang%2Fdefs.h;h=8144de3f02f055a2480bf37238b8f02a5bdfe343;hb=f9566e1049acc276958138c8c39ffdd9a2dd6cef;hp=5a92cf5be7db56b9d07359bb20b3ab033c08060d;hpb=d0eb9e0849eac0d1e7fba6b245a5e065ceb814bb;p=libcds.git diff --git a/cds/compiler/clang/defs.h b/cds/compiler/clang/defs.h index 5a92cf5b..8144de3f 100644 --- a/cds/compiler/clang/defs.h +++ b/cds/compiler/clang/defs.h @@ -1,14 +1,36 @@ -//$$CDS-header$$ +/* + This file is a part of libcds - Concurrent Data Structures library -#ifndef CDSLIB_COMPILER_CLANG_DEFS_H -#define CDSLIB_COMPILER_CLANG_DEFS_H + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 -/* - 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 + + Source code repo: http://github.com/khizmax/libcds/ + Download: http://sourceforge.net/projects/libcds/files/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifndef CDSLIB_COMPILER_CLANG_DEFS_H +#define CDSLIB_COMPILER_CLANG_DEFS_H + // Compiler version #define CDS_COMPILER_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) @@ -16,16 +38,30 @@ #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) +#if defined(_LIBCPP_VERSION) && !defined(CDS_USE_BOOST_ATOMIC) && CDS_COMPILER_VERSION < 30700 // Note: Clang libc++ atomic leads to program crash. // So, we use libcds atomic implementation # define CDS_USE_LIBCDS_ATOMIC #endif +// clang for Windows +#if defined( _MSC_VER ) +# define CDS_OS_INTERFACE CDS_OSI_WINDOWS +# if defined(_WIN64) +# define CDS_OS_TYPE CDS_OS_WIN64 +# define CDS_OS__NAME "Win64" +# define CDS_OS__NICK "Win64" +# elif defined(_WIN32) +# define CDS_OS_TYPE CDS_OS_WIN32 +# define CDS_OS__NAME "Win32" +# define CDS_OS__NICK "Win32" +# endif +#endif + #include #define alignof __alignof__ @@ -66,12 +102,23 @@ # 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 @@ -80,6 +127,34 @@ #define CDS_DATA_ALIGNMENT(n) __attribute__ ((aligned (n))) +// likely/unlikely + +#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 +# if !defined( CDS_DISABLE_128BIT_ATOMIC ) && defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 ) +# define CDS_DCAS_SUPPORT +# endif +# else +# if !defined( CDS_DISABLE_64BIT_ATOMIC ) && defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 ) +# define CDS_DCAS_SUPPORT +# endif +# endif +#endif + #include #endif // #ifndef CDSLIB_COMPILER_GCC_DEFS_H