| /* GPLv2 or OpenIB.org BSD (MIT) See COPYING file */ | |
| #ifndef UTIL_COMPILER_H | |
| #define UTIL_COMPILER_H | |
| /* Use to tag a variable that causes compiler warnings. Use as: | |
| int uninitialized_var(sz) | |
| This is only enabled for old compilers. gcc 6.x and beyond have excellent | |
| static flow analysis. If code solicits a warning from 6.x it is almost | |
| certainly too complex for a human to understand. For some reason powerpc | |
| uses a different scheme than gcc for flow analysis. | |
| gcc 12 seems to have regressed badly here and now acts like PPC gcc does. | |
| */ | |
| #if (__GNUC__ >= 6 && __GNUC__ < 12 && !defined(__powerpc__)) || defined(__clang__) | |
| #define uninitialized_var(x) x | |
| #else | |
| #define uninitialized_var(x) x = x | |
| #endif | |
| #ifndef likely | |
| #ifdef __GNUC__ | |
| #define likely(x) __builtin_expect(!!(x), 1) | |
| #else | |
| #define likely(x) (x) | |
| #endif | |
| #endif | |
| #ifndef unlikely | |
| #ifdef __GNUC__ | |
| #define unlikely(x) __builtin_expect(!!(x), 0) | |
| #else | |
| #define unlikely(x) (x) | |
| #endif | |
| #endif | |
| #ifdef HAVE_FUNC_ATTRIBUTE_ALWAYS_INLINE | |
| #define ALWAYS_INLINE __attribute__((always_inline)) | |
| #else | |
| #define ALWAYS_INLINE | |
| #endif | |
| /* Use to mark fall through on switch statements as desired. */ | |
| #if __GNUC__ >= 7 | |
| #define SWITCH_FALLTHROUGH __attribute__ ((fallthrough)) | |
| #else | |
| #define SWITCH_FALLTHROUGH | |
| #endif | |
| #ifdef __CHECKER__ | |
| # define __force __attribute__((force)) | |
| #else | |
| # define __force | |
| #endif | |
| #endif |