| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | /* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). * You may select, at your option, one of the above-listed licenses. */#ifndef ZSTD_PORTABILITY_MACROS_H#define ZSTD_PORTABILITY_MACROS_H/** * This header file contains macro definitions to support portability. * This header is shared between C and ASM code, so it MUST only * contain macro definitions. It MUST not contain any C code. * * This header ONLY defines macros to detect platforms/feature support. * *//* compat. with non-clang compilers */#ifndef __has_attribute  #define __has_attribute(x) 0#endif/* compat. with non-clang compilers */#ifndef __has_builtin#  define __has_builtin(x) 0#endif/* compat. with non-clang compilers */#ifndef __has_feature#  define __has_feature(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#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/* detects whether we are being compiled under dfsan */#ifndef ZSTD_DATAFLOW_SANITIZER# if __has_feature(dataflow_sanitizer)#  define ZSTD_DATAFLOW_SANITIZER 1# else#  define ZSTD_DATAFLOW_SANITIZER 0# endif#endif/* Mark the internal assembly functions as hidden  */#ifdef __ELF__# define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func#else# define ZSTD_HIDE_ASM_FUNCTION(func)#endif/* Enable runtime BMI2 dispatch based on the CPU. * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. */#ifndef DYNAMIC_BMI2  #if ((defined(__clang__) && __has_attribute(__target__)) \      || (defined(__GNUC__) \          && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \      && (defined(__x86_64__) || defined(_M_X64)) \      && !defined(__BMI2__)  #  define DYNAMIC_BMI2 1  #else  #  define DYNAMIC_BMI2 0  #endif#endif/** * Only enable assembly for GNUC compatible compilers, * because other platforms may not support GAS assembly syntax. * * Only enable assembly for Linux / MacOS, other platforms may * work, but they haven't been tested. This could likely be * extended to BSD systems. * * Disable assembly when MSAN is enabled, because MSAN requires * 100% of code to be instrumented to work. */#if defined(__GNUC__)#  if defined(__linux__) || defined(__linux) || defined(__APPLE__)#    if ZSTD_MEMORY_SANITIZER#      define ZSTD_ASM_SUPPORTED 0#    elif ZSTD_DATAFLOW_SANITIZER#      define ZSTD_ASM_SUPPORTED 0#    else#      define ZSTD_ASM_SUPPORTED 1#    endif#  else#    define ZSTD_ASM_SUPPORTED 0#  endif#else#  define ZSTD_ASM_SUPPORTED 0#endif/** * Determines whether we should enable assembly for x86-64 * with BMI2. * * Enable if all of the following conditions hold: * - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM * - Assembly is supported * - We are compiling for x86-64 and either: *   - DYNAMIC_BMI2 is enabled *   - BMI2 is supported at compile time */#if !defined(ZSTD_DISABLE_ASM) &&                                 \    ZSTD_ASM_SUPPORTED &&                                         \    defined(__x86_64__) &&                                        \    (DYNAMIC_BMI2 || defined(__BMI2__))# define ZSTD_ENABLE_ASM_X86_64_BMI2 1#else# define ZSTD_ENABLE_ASM_X86_64_BMI2 0#endif/* * For x86 ELF targets, add .note.gnu.property section for Intel CET in * assembly sources when CET is enabled. * * Additionally, any function that may be called indirectly must begin * with ZSTD_CET_ENDBRANCH. */#if defined(__ELF__) && (defined(__x86_64__) || defined(__i386__)) \    && defined(__has_include)# if __has_include(<cet.h>)#  include <cet.h>#  define ZSTD_CET_ENDBRANCH _CET_ENDBR# endif#endif#ifndef ZSTD_CET_ENDBRANCH# define ZSTD_CET_ENDBRANCH#endif#endif /* ZSTD_PORTABILITY_MACROS_H */
 |