macros.h revision 8a1362ad
1af69d88dSmrg/*
2af69d88dSmrg * Copyright © 2014 Intel Corporation
3af69d88dSmrg *
4af69d88dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
5af69d88dSmrg * copy of this software and associated documentation files (the "Software"),
6af69d88dSmrg * to deal in the Software without restriction, including without limitation
7af69d88dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8af69d88dSmrg * and/or sell copies of the Software, and to permit persons to whom the
9af69d88dSmrg * Software is furnished to do so, subject to the following conditions:
10af69d88dSmrg *
11af69d88dSmrg * The above copyright notice and this permission notice (including the next
12af69d88dSmrg * paragraph) shall be included in all copies or substantial portions of the
13af69d88dSmrg * Software.
14af69d88dSmrg *
15af69d88dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16af69d88dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17af69d88dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18af69d88dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19af69d88dSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20af69d88dSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21af69d88dSmrg * IN THE SOFTWARE.
22af69d88dSmrg */
23af69d88dSmrg
24af69d88dSmrg#ifndef UTIL_MACROS_H
25af69d88dSmrg#define UTIL_MACROS_H
26af69d88dSmrg
2701e04c3fSmrg#include <assert.h>
2801e04c3fSmrg
2901e04c3fSmrg#include "c99_compat.h"
3001e04c3fSmrg
31af69d88dSmrg/* Compute the size of an array */
32af69d88dSmrg#ifndef ARRAY_SIZE
3301e04c3fSmrg#  define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
34af69d88dSmrg#endif
35af69d88dSmrg
3601e04c3fSmrg/* For compatibility with Clang's __has_builtin() */
3701e04c3fSmrg#ifndef __has_builtin
3801e04c3fSmrg#  define __has_builtin(x) 0
3901e04c3fSmrg#endif
40af69d88dSmrg
41af69d88dSmrg/**
42af69d88dSmrg * __builtin_expect macros
43af69d88dSmrg */
4401e04c3fSmrg#if !defined(HAVE___BUILTIN_EXPECT)
45af69d88dSmrg#  define __builtin_expect(x, y) (x)
46af69d88dSmrg#endif
47af69d88dSmrg
48af69d88dSmrg#ifndef likely
4901e04c3fSmrg#  ifdef HAVE___BUILTIN_EXPECT
50af69d88dSmrg#    define likely(x)   __builtin_expect(!!(x), 1)
51af69d88dSmrg#    define unlikely(x) __builtin_expect(!!(x), 0)
52af69d88dSmrg#  else
53af69d88dSmrg#    define likely(x)   (x)
54af69d88dSmrg#    define unlikely(x) (x)
55af69d88dSmrg#  endif
56af69d88dSmrg#endif
57af69d88dSmrg
58af69d88dSmrg
59af69d88dSmrg/**
60af69d88dSmrg * Static (compile-time) assertion.
61af69d88dSmrg * Basically, use COND to dimension an array.  If COND is false/zero the
62af69d88dSmrg * array size will be -1 and we'll get a compilation error.
63af69d88dSmrg */
64af69d88dSmrg#define STATIC_ASSERT(COND) \
65af69d88dSmrg   do { \
66af69d88dSmrg      (void) sizeof(char [1 - 2*!(COND)]); \
67af69d88dSmrg   } while (0)
68af69d88dSmrg
69af69d88dSmrg
70af69d88dSmrg/**
71af69d88dSmrg * Unreachable macro. Useful for suppressing "control reaches end of non-void
72af69d88dSmrg * function" warnings.
73af69d88dSmrg */
7401e04c3fSmrg#ifdef HAVE___BUILTIN_UNREACHABLE
75af69d88dSmrg#define unreachable(str)    \
76af69d88dSmrgdo {                        \
77af69d88dSmrg   assert(!str);            \
78af69d88dSmrg   __builtin_unreachable(); \
79af69d88dSmrg} while (0)
8001e04c3fSmrg#elif defined (_MSC_VER)
8101e04c3fSmrg#define unreachable(str)    \
82af69d88dSmrgdo {                        \
83af69d88dSmrg   assert(!str);            \
8401e04c3fSmrg   __assume(0);             \
8501e04c3fSmrg} while (0)
8601e04c3fSmrg#else
8701e04c3fSmrg#define unreachable(str) assert(!str)
8801e04c3fSmrg#endif
8901e04c3fSmrg
9001e04c3fSmrg/**
9101e04c3fSmrg * Assume macro. Useful for expressing our assumptions to the compiler,
9201e04c3fSmrg * typically for purposes of silencing warnings.
9301e04c3fSmrg */
9401e04c3fSmrg#if __has_builtin(__builtin_assume)
9501e04c3fSmrg#define assume(expr)       \
9601e04c3fSmrgdo {                       \
9701e04c3fSmrg   assert(expr);           \
9801e04c3fSmrg   __builtin_assume(expr); \
99af69d88dSmrg} while (0)
10001e04c3fSmrg#elif defined HAVE___BUILTIN_UNREACHABLE
10101e04c3fSmrg#define assume(expr) ((expr) ? ((void) 0) \
10201e04c3fSmrg                             : (assert(!"assumption failed"), \
10301e04c3fSmrg                                __builtin_unreachable()))
10401e04c3fSmrg#elif defined (_MSC_VER)
10501e04c3fSmrg#define assume(expr) __assume(expr)
10601e04c3fSmrg#else
10701e04c3fSmrg#define assume(expr) assert(expr)
108af69d88dSmrg#endif
109af69d88dSmrg
11001e04c3fSmrg/* Attribute const is used for functions that have no effects other than their
11101e04c3fSmrg * return value, and only rely on the argument values to compute the return
11201e04c3fSmrg * value.  As a result, calls to it can be CSEed.  Note that using memory
11301e04c3fSmrg * pointed to by the arguments is not allowed for const functions.
11401e04c3fSmrg */
11501e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_CONST
11601e04c3fSmrg#define ATTRIBUTE_CONST __attribute__((__const__))
11701e04c3fSmrg#else
11801e04c3fSmrg#define ATTRIBUTE_CONST
119af69d88dSmrg#endif
120af69d88dSmrg
12101e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_FLATTEN
12201e04c3fSmrg#define FLATTEN __attribute__((__flatten__))
12301e04c3fSmrg#else
12401e04c3fSmrg#define FLATTEN
12501e04c3fSmrg#endif
126af69d88dSmrg
12701e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_FORMAT
128af69d88dSmrg#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
129af69d88dSmrg#else
130af69d88dSmrg#define PRINTFLIKE(f, a)
131af69d88dSmrg#endif
132af69d88dSmrg
13301e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_MALLOC
13401e04c3fSmrg#define MALLOCLIKE __attribute__((__malloc__))
13501e04c3fSmrg#else
13601e04c3fSmrg#define MALLOCLIKE
13701e04c3fSmrg#endif
13801e04c3fSmrg
13901e04c3fSmrg/* Forced function inlining */
14001e04c3fSmrg/* Note: Clang also sets __GNUC__ (see other cases below) */
14101e04c3fSmrg#ifndef ALWAYS_INLINE
14201e04c3fSmrg#  if defined(__GNUC__)
14301e04c3fSmrg#    define ALWAYS_INLINE inline __attribute__((always_inline))
14401e04c3fSmrg#  elif defined(_MSC_VER)
14501e04c3fSmrg#    define ALWAYS_INLINE __forceinline
14601e04c3fSmrg#  else
14701e04c3fSmrg#    define ALWAYS_INLINE inline
14801e04c3fSmrg#  endif
14901e04c3fSmrg#endif
150af69d88dSmrg
151af69d88dSmrg/* Used to optionally mark structures with misaligned elements or size as
152af69d88dSmrg * packed, to trade off performance for space.
153af69d88dSmrg */
15401e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_PACKED
155af69d88dSmrg#define PACKED __attribute__((__packed__))
156af69d88dSmrg#else
157af69d88dSmrg#define PACKED
158af69d88dSmrg#endif
159af69d88dSmrg
16001e04c3fSmrg/* Attribute pure is used for functions that have no effects other than their
16101e04c3fSmrg * return value.  As a result, calls to it can be dead code eliminated.
16201e04c3fSmrg */
16301e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_PURE
16401e04c3fSmrg#define ATTRIBUTE_PURE __attribute__((__pure__))
16501e04c3fSmrg#else
16601e04c3fSmrg#define ATTRIBUTE_PURE
16701e04c3fSmrg#endif
16801e04c3fSmrg
16901e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL
17001e04c3fSmrg#define ATTRIBUTE_RETURNS_NONNULL __attribute__((__returns_nonnull__))
17101e04c3fSmrg#else
17201e04c3fSmrg#define ATTRIBUTE_RETURNS_NONNULL
17301e04c3fSmrg#endif
17401e04c3fSmrg
17501e04c3fSmrg#ifndef NORETURN
17601e04c3fSmrg#  ifdef _MSC_VER
17701e04c3fSmrg#    define NORETURN __declspec(noreturn)
17801e04c3fSmrg#  elif defined HAVE_FUNC_ATTRIBUTE_NORETURN
17901e04c3fSmrg#    define NORETURN __attribute__((__noreturn__))
18001e04c3fSmrg#  else
18101e04c3fSmrg#    define NORETURN
18201e04c3fSmrg#  endif
18301e04c3fSmrg#endif
184af69d88dSmrg
185af69d88dSmrg#ifdef __cplusplus
186af69d88dSmrg/**
187af69d88dSmrg * Macro function that evaluates to true if T is a trivially
188af69d88dSmrg * destructible type -- that is, if its (non-virtual) destructor
189af69d88dSmrg * performs no action and all member variables and base classes are
190af69d88dSmrg * trivially destructible themselves.
191af69d88dSmrg */
19201e04c3fSmrg#   if (defined(__clang__) && defined(__has_feature))
19301e04c3fSmrg#      if __has_feature(has_trivial_destructor)
194af69d88dSmrg#         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
195af69d88dSmrg#      endif
19601e04c3fSmrg#   elif defined(__GNUC__)
19701e04c3fSmrg#      if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))
198af69d88dSmrg#         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
199af69d88dSmrg#      endif
20001e04c3fSmrg#   elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
20101e04c3fSmrg#      define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
202af69d88dSmrg#   endif
203af69d88dSmrg#   ifndef HAS_TRIVIAL_DESTRUCTOR
204af69d88dSmrg       /* It's always safe (if inefficient) to assume that a
205af69d88dSmrg        * destructor is non-trivial.
206af69d88dSmrg        */
207af69d88dSmrg#      define HAS_TRIVIAL_DESTRUCTOR(T) (false)
208af69d88dSmrg#   endif
209af69d88dSmrg#endif
210af69d88dSmrg
21101e04c3fSmrg/**
21201e04c3fSmrg * PUBLIC/USED macros
21301e04c3fSmrg *
21401e04c3fSmrg * If we build the library with gcc's -fvisibility=hidden flag, we'll
21501e04c3fSmrg * use the PUBLIC macro to mark functions that are to be exported.
21601e04c3fSmrg *
21701e04c3fSmrg * We also need to define a USED attribute, so the optimizer doesn't
21801e04c3fSmrg * inline a static function that we later use in an alias. - ajax
21901e04c3fSmrg */
22001e04c3fSmrg#ifndef PUBLIC
22101e04c3fSmrg#  if defined(__GNUC__)
22201e04c3fSmrg#    define PUBLIC __attribute__((visibility("default")))
22301e04c3fSmrg#    define USED __attribute__((used))
22401e04c3fSmrg#  elif defined(_MSC_VER)
22501e04c3fSmrg#    define PUBLIC __declspec(dllexport)
22601e04c3fSmrg#    define USED
22701e04c3fSmrg#  else
22801e04c3fSmrg#    define PUBLIC
22901e04c3fSmrg#    define USED
23001e04c3fSmrg#  endif
23101e04c3fSmrg#endif
23201e04c3fSmrg
23301e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_UNUSED
23401e04c3fSmrg#define UNUSED __attribute__((unused))
23501e04c3fSmrg#else
23601e04c3fSmrg#define UNUSED
23701e04c3fSmrg#endif
23801e04c3fSmrg
23901e04c3fSmrg#define MAYBE_UNUSED UNUSED
24001e04c3fSmrg
24101e04c3fSmrg#ifdef HAVE_FUNC_ATTRIBUTE_WARN_UNUSED_RESULT
24201e04c3fSmrg#define MUST_CHECK __attribute__((warn_unused_result))
24301e04c3fSmrg#else
24401e04c3fSmrg#define MUST_CHECK
24501e04c3fSmrg#endif
24601e04c3fSmrg
24701e04c3fSmrg#if defined(__GNUC__)
24801e04c3fSmrg#define ATTRIBUTE_NOINLINE __attribute__((noinline))
24901e04c3fSmrg#else
25001e04c3fSmrg#define ATTRIBUTE_NOINLINE
25101e04c3fSmrg#endif
25201e04c3fSmrg
25301e04c3fSmrg
25401e04c3fSmrg/**
25501e04c3fSmrg * Check that STRUCT::FIELD can hold MAXVAL.  We use a lot of bitfields
25601e04c3fSmrg * in Mesa/gallium.  We have to be sure they're of sufficient size to
25701e04c3fSmrg * hold the largest expected value.
25801e04c3fSmrg * Note that with MSVC, enums are signed and enum bitfields need one extra
25901e04c3fSmrg * high bit (always zero) to ensure the max value is handled correctly.
26001e04c3fSmrg * This macro will detect that with MSVC, but not GCC.
26101e04c3fSmrg */
26201e04c3fSmrg#define ASSERT_BITFIELD_SIZE(STRUCT, FIELD, MAXVAL) \
26301e04c3fSmrg   do { \
26401e04c3fSmrg      MAYBE_UNUSED STRUCT s;                \
26501e04c3fSmrg      s.FIELD = (MAXVAL); \
26601e04c3fSmrg      assert((int) s.FIELD == (MAXVAL) && "Insufficient bitfield size!"); \
26701e04c3fSmrg   } while (0)
26801e04c3fSmrg
26901e04c3fSmrg
27001e04c3fSmrg/** Compute ceiling of integer quotient of A divided by B. */
27101e04c3fSmrg#define DIV_ROUND_UP( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
27201e04c3fSmrg
27301e04c3fSmrg/** Clamp X to [MIN,MAX].  Turn NaN into MIN, arbitrarily. */
27401e04c3fSmrg#define CLAMP( X, MIN, MAX )  ( (X)>(MIN) ? ((X)>(MAX) ? (MAX) : (X)) : (MIN) )
27501e04c3fSmrg
27601e04c3fSmrg/** Minimum of two values: */
27701e04c3fSmrg#define MIN2( A, B )   ( (A)<(B) ? (A) : (B) )
27801e04c3fSmrg
27901e04c3fSmrg/** Maximum of two values: */
28001e04c3fSmrg#define MAX2( A, B )   ( (A)>(B) ? (A) : (B) )
28101e04c3fSmrg
28201e04c3fSmrg/** Minimum and maximum of three values: */
28301e04c3fSmrg#define MIN3( A, B, C ) ((A) < (B) ? MIN2(A, C) : MIN2(B, C))
28401e04c3fSmrg#define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C))
28501e04c3fSmrg
28601e04c3fSmrg/** Align a value to a power of two */
28701e04c3fSmrg#define ALIGN_POT(x, pot_align) (((x) + (pot_align) - 1) & ~((pot_align) - 1))
28801e04c3fSmrg
28901e04c3fSmrg/**
29001e04c3fSmrg * Macro for declaring an explicit conversion operator.  Defaults to an
29101e04c3fSmrg * implicit conversion if C++11 is not supported.
29201e04c3fSmrg */
29301e04c3fSmrg#if __cplusplus >= 201103L
29401e04c3fSmrg#define EXPLICIT_CONVERSION explicit
29501e04c3fSmrg#elif defined(__cplusplus)
29601e04c3fSmrg#define EXPLICIT_CONVERSION
29701e04c3fSmrg#endif
29801e04c3fSmrg
2998a1362adSmaya/** Set a single bit */
3008a1362adSmaya#define BITFIELD_BIT(b)      (1u << (b))
3018a1362adSmaya/** Set all bits up to excluding bit b */
3028a1362adSmaya#define BITFIELD_MASK(b)      \
3038a1362adSmaya   ((b) == 32 ? (~0u) : BITFIELD_BIT((b) % 32) - 1)
3048a1362adSmaya/** Set count bits starting from bit b  */
3058a1362adSmaya#define BITFIELD_RANGE(b, count) \
3068a1362adSmaya   (BITFIELD_MASK((b) + (count)) & ~BITFIELD_MASK(b))
3078a1362adSmaya
3088a1362adSmaya/** Set a single bit */
3098a1362adSmaya#define BITFIELD64_BIT(b)      (1ull << (b))
3108a1362adSmaya/** Set all bits up to excluding bit b */
3118a1362adSmaya#define BITFIELD64_MASK(b)      \
3128a1362adSmaya   ((b) == 64 ? (~0ull) : BITFIELD64_BIT(b) - 1)
3138a1362adSmaya/** Set count bits starting from bit b  */
3148a1362adSmaya#define BITFIELD64_RANGE(b, count) \
3158a1362adSmaya   (BITFIELD64_MASK((b) + (count)) & ~BITFIELD64_MASK(b))
3168a1362adSmaya
317af69d88dSmrg#endif /* UTIL_MACROS_H */
318