Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright  2014 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 #ifndef UTIL_MACROS_H
     25 #define UTIL_MACROS_H
     26 
     27 #include <assert.h>
     28 
     29 #include "c99_compat.h"
     30 
     31 /* Compute the size of an array */
     32 #ifndef ARRAY_SIZE
     33 #  define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
     34 #endif
     35 
     36 /* For compatibility with Clang's __has_builtin() */
     37 #ifndef __has_builtin
     38 #  define __has_builtin(x) 0
     39 #endif
     40 
     41 /**
     42  * __builtin_expect macros
     43  */
     44 #if !defined(HAVE___BUILTIN_EXPECT)
     45 #  define __builtin_expect(x, y) (x)
     46 #endif
     47 
     48 #ifndef likely
     49 #  ifdef HAVE___BUILTIN_EXPECT
     50 #    define likely(x)   __builtin_expect(!!(x), 1)
     51 #    define unlikely(x) __builtin_expect(!!(x), 0)
     52 #  else
     53 #    define likely(x)   (x)
     54 #    define unlikely(x) (x)
     55 #  endif
     56 #endif
     57 
     58 
     59 /**
     60  * Static (compile-time) assertion.
     61  * Basically, use COND to dimension an array.  If COND is false/zero the
     62  * array size will be -1 and we'll get a compilation error.
     63  */
     64 #define STATIC_ASSERT(COND) \
     65    do { \
     66       (void) sizeof(char [1 - 2*!(COND)]); \
     67    } while (0)
     68 
     69 
     70 /**
     71  * Unreachable macro. Useful for suppressing "control reaches end of non-void
     72  * function" warnings.
     73  */
     74 #ifdef HAVE___BUILTIN_UNREACHABLE
     75 #define unreachable(str)    \
     76 do {                        \
     77    assert(!str);            \
     78    __builtin_unreachable(); \
     79 } while (0)
     80 #elif defined (_MSC_VER)
     81 #define unreachable(str)    \
     82 do {                        \
     83    assert(!str);            \
     84    __assume(0);             \
     85 } while (0)
     86 #else
     87 #define unreachable(str) assert(!str)
     88 #endif
     89 
     90 /**
     91  * Assume macro. Useful for expressing our assumptions to the compiler,
     92  * typically for purposes of silencing warnings.
     93  */
     94 #if __has_builtin(__builtin_assume)
     95 #define assume(expr)       \
     96 do {                       \
     97    assert(expr);           \
     98    __builtin_assume(expr); \
     99 } while (0)
    100 #elif defined HAVE___BUILTIN_UNREACHABLE
    101 #define assume(expr) ((expr) ? ((void) 0) \
    102                              : (assert(!"assumption failed"), \
    103                                 __builtin_unreachable()))
    104 #elif defined (_MSC_VER)
    105 #define assume(expr) __assume(expr)
    106 #else
    107 #define assume(expr) assert(expr)
    108 #endif
    109 
    110 /* Attribute const is used for functions that have no effects other than their
    111  * return value, and only rely on the argument values to compute the return
    112  * value.  As a result, calls to it can be CSEed.  Note that using memory
    113  * pointed to by the arguments is not allowed for const functions.
    114  */
    115 #ifdef HAVE_FUNC_ATTRIBUTE_CONST
    116 #define ATTRIBUTE_CONST __attribute__((__const__))
    117 #else
    118 #define ATTRIBUTE_CONST
    119 #endif
    120 
    121 #ifdef HAVE_FUNC_ATTRIBUTE_FLATTEN
    122 #define FLATTEN __attribute__((__flatten__))
    123 #else
    124 #define FLATTEN
    125 #endif
    126 
    127 #ifdef HAVE_FUNC_ATTRIBUTE_FORMAT
    128 #define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
    129 #else
    130 #define PRINTFLIKE(f, a)
    131 #endif
    132 
    133 #ifdef HAVE_FUNC_ATTRIBUTE_MALLOC
    134 #define MALLOCLIKE __attribute__((__malloc__))
    135 #else
    136 #define MALLOCLIKE
    137 #endif
    138 
    139 /* Used to optionally mark structures with misaligned elements or size as
    140  * packed, to trade off performance for space.
    141  */
    142 #ifdef HAVE_FUNC_ATTRIBUTE_PACKED
    143 #define PACKED __attribute__((__packed__))
    144 #else
    145 #define PACKED
    146 #endif
    147 
    148 /* Attribute pure is used for functions that have no effects other than their
    149  * return value.  As a result, calls to it can be dead code eliminated.
    150  */
    151 #ifdef HAVE_FUNC_ATTRIBUTE_PURE
    152 #define ATTRIBUTE_PURE __attribute__((__pure__))
    153 #else
    154 #define ATTRIBUTE_PURE
    155 #endif
    156 
    157 #ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL
    158 #define ATTRIBUTE_RETURNS_NONNULL __attribute__((__returns_nonnull__))
    159 #else
    160 #define ATTRIBUTE_RETURNS_NONNULL
    161 #endif
    162 
    163 #ifdef __cplusplus
    164 /**
    165  * Macro function that evaluates to true if T is a trivially
    166  * destructible type -- that is, if its (non-virtual) destructor
    167  * performs no action and all member variables and base classes are
    168  * trivially destructible themselves.
    169  */
    170 #   if (defined(__clang__) && defined(__has_feature))
    171 #      if __has_feature(has_trivial_destructor)
    172 #         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
    173 #      endif
    174 #   elif defined(__GNUC__)
    175 #      if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))
    176 #         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
    177 #      endif
    178 #   elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
    179 #      if _MSC_VER >= 1800
    180 #         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
    181 #      endif
    182 #   endif
    183 #   ifndef HAS_TRIVIAL_DESTRUCTOR
    184        /* It's always safe (if inefficient) to assume that a
    185         * destructor is non-trivial.
    186         */
    187 #      define HAS_TRIVIAL_DESTRUCTOR(T) (false)
    188 #   endif
    189 #endif
    190 
    191 /**
    192  * PUBLIC/USED macros
    193  *
    194  * If we build the library with gcc's -fvisibility=hidden flag, we'll
    195  * use the PUBLIC macro to mark functions that are to be exported.
    196  *
    197  * We also need to define a USED attribute, so the optimizer doesn't
    198  * inline a static function that we later use in an alias. - ajax
    199  */
    200 #ifndef PUBLIC
    201 #  if defined(__GNUC__)
    202 #    define PUBLIC __attribute__((visibility("default")))
    203 #    define USED __attribute__((used))
    204 #  elif defined(_MSC_VER)
    205 #    define PUBLIC __declspec(dllexport)
    206 #    define USED
    207 #  else
    208 #    define PUBLIC
    209 #    define USED
    210 #  endif
    211 #endif
    212 
    213 #ifdef HAVE_FUNC_ATTRIBUTE_UNUSED
    214 #define UNUSED __attribute__((unused))
    215 #else
    216 #define UNUSED
    217 #endif
    218 
    219 #define MAYBE_UNUSED UNUSED
    220 
    221 #ifdef HAVE_FUNC_ATTRIBUTE_WARN_UNUSED_RESULT
    222 #define MUST_CHECK __attribute__((warn_unused_result))
    223 #else
    224 #define MUST_CHECK
    225 #endif
    226 
    227 #if defined(__GNUC__)
    228 #define ATTRIBUTE_NOINLINE __attribute__((noinline))
    229 #else
    230 #define ATTRIBUTE_NOINLINE
    231 #endif
    232 
    233 /** Compute ceiling of integer quotient of A divided by B. */
    234 #define DIV_ROUND_UP( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
    235 
    236 /** Clamp X to [MIN,MAX] */
    237 #define CLAMP( X, MIN, MAX )  ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) )
    238 
    239 /** Minimum of two values: */
    240 #define MIN2( A, B )   ( (A)<(B) ? (A) : (B) )
    241 
    242 /** Maximum of two values: */
    243 #define MAX2( A, B )   ( (A)>(B) ? (A) : (B) )
    244 
    245 /** Minimum and maximum of three values: */
    246 #define MIN3( A, B, C ) ((A) < (B) ? MIN2(A, C) : MIN2(B, C))
    247 #define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C))
    248 
    249 #endif /* UTIL_MACROS_H */
    250