123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * 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 */
|