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