diff options
Diffstat (limited to 'thirdparty/zstd/common/compiler.h')
| -rw-r--r-- | thirdparty/zstd/common/compiler.h | 132 | 
1 files changed, 89 insertions, 43 deletions
diff --git a/thirdparty/zstd/common/compiler.h b/thirdparty/zstd/common/compiler.h index a951d0adea..516930c01e 100644 --- a/thirdparty/zstd/common/compiler.h +++ b/thirdparty/zstd/common/compiler.h @@ -11,6 +11,8 @@  #ifndef ZSTD_COMPILER_H  #define ZSTD_COMPILER_H +#include "portability_macros.h" +  /*-*******************************************************  *  Compiler specifics  *********************************************************/ @@ -40,7 +42,7 @@  /**    On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC). -  This explictly marks such functions as __cdecl so that the code will still compile +  This explicitly marks such functions as __cdecl so that the code will still compile    if a CC other than __cdecl has been made the default.  */  #if  defined(_MSC_VER) @@ -92,29 +94,17 @@  /* target attribute */ -#ifndef __has_attribute -  #define __has_attribute(x) 0  /* Compatibility with non-clang compilers. */ -#endif  #if defined(__GNUC__) || defined(__ICCARM__)  #  define TARGET_ATTRIBUTE(target) __attribute__((__target__(target)))  #else  #  define TARGET_ATTRIBUTE(target)  #endif -/* Enable runtime BMI2 dispatch based on the CPU. - * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. +/* Target attribute for BMI2 dynamic dispatch. + * Enable lzcnt, bmi, and bmi2. + * We test for bmi1 & bmi2. lzcnt is included in bmi1.   */ -#ifndef DYNAMIC_BMI2 -  #if ((defined(__clang__) && __has_attribute(__target__)) \ -      || (defined(__GNUC__) \ -          && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ -      && (defined(__x86_64__) || defined(_M_X86)) \ -      && !defined(__BMI2__) -  #  define DYNAMIC_BMI2 1 -  #else -  #  define DYNAMIC_BMI2 0 -  #endif -#endif +#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2")  /* prefetch   * can be disabled, by declaring NO_PREFETCH build macro */ @@ -150,8 +140,9 @@  }  /* vectorization - * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax */ -#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) + * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax, + * and some compilers, like Intel ICC and MCST LCC, do not support it at all. */ +#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__)  #  if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5)  #    define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize")))  #  else @@ -197,25 +188,91 @@      #define STATIC_BMI2 0  #endif -/* compat. with non-clang compilers */ -#ifndef __has_builtin -#  define __has_builtin(x) 0 +/* compile time determination of SIMD support */ +#if !defined(ZSTD_NO_INTRINSICS) +#  if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) +#    define ZSTD_ARCH_X86_SSE2 +#  endif +#  if defined(__ARM_NEON) || defined(_M_ARM64) +#    define ZSTD_ARCH_ARM_NEON +#  endif +# +#  if defined(ZSTD_ARCH_X86_SSE2) +#    include <emmintrin.h> +#  elif defined(ZSTD_ARCH_ARM_NEON) +#    include <arm_neon.h> +#  endif  #endif -/* compat. with non-clang compilers */ -#ifndef __has_feature -#  define __has_feature(x) 0 +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define ZSTD_HAS_C_ATTRIBUTE(x) 0  #endif -/* detects whether we are being compiled under msan */ -#ifndef ZSTD_MEMORY_SANITIZER -#  if __has_feature(memory_sanitizer) -#    define ZSTD_MEMORY_SANITIZER 1 -#  else -#    define ZSTD_MEMORY_SANITIZER 0 -#  endif +/* Only use C++ attributes in C++. Some compilers report support for C++ + * attributes when compiling with C. + */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0  #endif +/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute. + * - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough + * - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * - Else: __attribute__((__fallthrough__)) + */ +#ifndef ZSTD_FALLTHROUGH +# if ZSTD_HAS_C_ATTRIBUTE(fallthrough) +#  define ZSTD_FALLTHROUGH [[fallthrough]] +# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough) +#  define ZSTD_FALLTHROUGH [[fallthrough]] +# elif __has_attribute(__fallthrough__) +/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon + * gcc complains about: a label can only be part of a statement and a declaration is not a statement. + */ +#  define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__)) +# else +#  define ZSTD_FALLTHROUGH +# endif +#endif + +/*-************************************************************** +*  Alignment check +*****************************************************************/ + +/* this test was initially positioned in mem.h, + * but this file is removed (or replaced) for linux kernel + * so it's now hosted in compiler.h, + * which remains valid for both user & kernel spaces. + */ + +#ifndef ZSTD_ALIGNOF +# if defined(__GNUC__) || defined(_MSC_VER) +/* covers gcc, clang & MSVC */ +/* note : this section must come first, before C11, + * due to a limitation in the kernel source generator */ +#  define ZSTD_ALIGNOF(T) __alignof(T) + +# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +/* C11 support */ +#  include <stdalign.h> +#  define ZSTD_ALIGNOF(T) alignof(T) + +# else +/* No known support for alignof() - imperfect backup */ +#  define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T)) + +# endif +#endif /* ZSTD_ALIGNOF */ + +/*-************************************************************** +*  Sanitizer +*****************************************************************/ +  #if ZSTD_MEMORY_SANITIZER  /* Not all platforms that support msan provide sanitizers/msan_interface.h.   * We therefore declare the functions we need ourselves, rather than trying to @@ -237,17 +294,6 @@ void __msan_poison(const volatile void *a, size_t size);  intptr_t __msan_test_shadow(const volatile void *x, size_t size);  #endif -/* detects whether we are being compiled under asan */ -#ifndef ZSTD_ADDRESS_SANITIZER -#  if __has_feature(address_sanitizer) -#    define ZSTD_ADDRESS_SANITIZER 1 -#  elif defined(__SANITIZE_ADDRESS__) -#    define ZSTD_ADDRESS_SANITIZER 1 -#  else -#    define ZSTD_ADDRESS_SANITIZER 0 -#  endif -#endif -  #if ZSTD_ADDRESS_SANITIZER  /* Not all platforms that support asan provide sanitizers/asan_interface.h.   * We therefore declare the functions we need ourselves, rather than trying to  |