The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/zstd/lib/common/portability_macros.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) Facebook, Inc.
    3  * All rights reserved.
    4  *
    5  * This source code is licensed under both the BSD-style license (found in the
    6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
    7  * in the COPYING file in the root directory of this source tree).
    8  * You may select, at your option, one of the above-listed licenses.
    9  */
   10 
   11 #ifndef ZSTD_PORTABILITY_MACROS_H
   12 #define ZSTD_PORTABILITY_MACROS_H
   13 
   14 /**
   15  * This header file contains macro defintions to support portability.
   16  * This header is shared between C and ASM code, so it MUST only
   17  * contain macro definitions. It MUST not contain any C code.
   18  *
   19  * This header ONLY defines macros to detect platforms/feature support.
   20  *
   21  */
   22 
   23 
   24 /* compat. with non-clang compilers */
   25 #ifndef __has_attribute
   26   #define __has_attribute(x) 0
   27 #endif
   28 
   29 /* compat. with non-clang compilers */
   30 #ifndef __has_builtin
   31 #  define __has_builtin(x) 0
   32 #endif
   33 
   34 /* compat. with non-clang compilers */
   35 #ifndef __has_feature
   36 #  define __has_feature(x) 0
   37 #endif
   38 
   39 /* detects whether we are being compiled under msan */
   40 #ifndef ZSTD_MEMORY_SANITIZER
   41 #  if __has_feature(memory_sanitizer)
   42 #    define ZSTD_MEMORY_SANITIZER 1
   43 #  else
   44 #    define ZSTD_MEMORY_SANITIZER 0
   45 #  endif
   46 #endif
   47 
   48 /* detects whether we are being compiled under asan */
   49 #ifndef ZSTD_ADDRESS_SANITIZER
   50 #  if __has_feature(address_sanitizer)
   51 #    define ZSTD_ADDRESS_SANITIZER 1
   52 #  elif defined(__SANITIZE_ADDRESS__)
   53 #    define ZSTD_ADDRESS_SANITIZER 1
   54 #  else
   55 #    define ZSTD_ADDRESS_SANITIZER 0
   56 #  endif
   57 #endif
   58 
   59 /* detects whether we are being compiled under dfsan */
   60 #ifndef ZSTD_DATAFLOW_SANITIZER
   61 # if __has_feature(dataflow_sanitizer)
   62 #  define ZSTD_DATAFLOW_SANITIZER 1
   63 # else
   64 #  define ZSTD_DATAFLOW_SANITIZER 0
   65 # endif
   66 #endif
   67 
   68 /* Mark the internal assembly functions as hidden  */
   69 #ifdef __ELF__
   70 # define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func
   71 #else
   72 # define ZSTD_HIDE_ASM_FUNCTION(func)
   73 #endif
   74 
   75 /* Enable runtime BMI2 dispatch based on the CPU.
   76  * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default.
   77  */
   78 #ifndef DYNAMIC_BMI2
   79   #if ((defined(__clang__) && __has_attribute(__target__)) \
   80       || (defined(__GNUC__) \
   81           && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \
   82       && (defined(__x86_64__) || defined(_M_X64)) \
   83       && !defined(__BMI2__)
   84   #  define DYNAMIC_BMI2 1
   85   #else
   86   #  define DYNAMIC_BMI2 0
   87   #endif
   88 #endif
   89 
   90 /**
   91  * Only enable assembly for GNUC comptabile compilers,
   92  * because other platforms may not support GAS assembly syntax.
   93  *
   94  * Only enable assembly for Linux / MacOS, other platforms may
   95  * work, but they haven't been tested. This could likely be
   96  * extended to BSD systems.
   97  *
   98  * Disable assembly when MSAN is enabled, because MSAN requires
   99  * 100% of code to be instrumented to work.
  100  */
  101 #if defined(__GNUC__)
  102 #  if defined(__linux__) || defined(__linux) || defined(__APPLE__)
  103 #    if ZSTD_MEMORY_SANITIZER
  104 #      define ZSTD_ASM_SUPPORTED 0
  105 #    elif ZSTD_DATAFLOW_SANITIZER
  106 #      define ZSTD_ASM_SUPPORTED 0
  107 #    else
  108 #      define ZSTD_ASM_SUPPORTED 1
  109 #    endif
  110 #  else
  111 #    define ZSTD_ASM_SUPPORTED 0
  112 #  endif
  113 #else
  114 #  define ZSTD_ASM_SUPPORTED 0
  115 #endif
  116 
  117 /**
  118  * Determines whether we should enable assembly for x86-64
  119  * with BMI2.
  120  *
  121  * Enable if all of the following conditions hold:
  122  * - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM
  123  * - Assembly is supported
  124  * - We are compiling for x86-64 and either:
  125  *   - DYNAMIC_BMI2 is enabled
  126  *   - BMI2 is supported at compile time
  127  */
  128 #if !defined(ZSTD_DISABLE_ASM) &&                                 \
  129     ZSTD_ASM_SUPPORTED &&                                         \
  130     defined(__x86_64__) &&                                        \
  131     (DYNAMIC_BMI2 || defined(__BMI2__))
  132 # define ZSTD_ENABLE_ASM_X86_64_BMI2 1
  133 #else
  134 # define ZSTD_ENABLE_ASM_X86_64_BMI2 0
  135 #endif
  136 
  137 #endif /* ZSTD_PORTABILITY_MACROS_H */

Cache object: c1236b95bd47444ae3e9dee84f4dd109


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.