xref: /aosp_15_r20/external/mesa3d/src/util/macros.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2014 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef UTIL_MACROS_H
25*61046927SAndroid Build Coastguard Worker #define UTIL_MACROS_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include <assert.h>
28*61046927SAndroid Build Coastguard Worker #if defined(__HAIKU__)  && !defined(__cplusplus)
29*61046927SAndroid Build Coastguard Worker #define static_assert _Static_assert
30*61046927SAndroid Build Coastguard Worker #endif
31*61046927SAndroid Build Coastguard Worker #include <stddef.h>
32*61046927SAndroid Build Coastguard Worker #include <stdint.h>
33*61046927SAndroid Build Coastguard Worker #include <stdio.h>
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #ifdef _GAMING_XBOX
36*61046927SAndroid Build Coastguard Worker #define strdup _strdup
37*61046927SAndroid Build Coastguard Worker #define stricmp _stricmp
38*61046927SAndroid Build Coastguard Worker #define unlink _unlink
39*61046927SAndroid Build Coastguard Worker #define access(a, b) _access(a, b)
40*61046927SAndroid Build Coastguard Worker #endif
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker /* Compute the size of an array */
43*61046927SAndroid Build Coastguard Worker #ifndef ARRAY_SIZE
44*61046927SAndroid Build Coastguard Worker #  define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
45*61046927SAndroid Build Coastguard Worker #endif
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker /* For compatibility with Clang's __has_builtin() */
48*61046927SAndroid Build Coastguard Worker #ifndef __has_builtin
49*61046927SAndroid Build Coastguard Worker #  define __has_builtin(x) 0
50*61046927SAndroid Build Coastguard Worker #endif
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker #ifndef __has_attribute
53*61046927SAndroid Build Coastguard Worker #  define __has_attribute(x) 0
54*61046927SAndroid Build Coastguard Worker #endif
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker /**
57*61046927SAndroid Build Coastguard Worker  * __builtin_expect macros
58*61046927SAndroid Build Coastguard Worker  */
59*61046927SAndroid Build Coastguard Worker #if !defined(HAVE___BUILTIN_EXPECT)
60*61046927SAndroid Build Coastguard Worker #  define __builtin_expect(x, y) (x)
61*61046927SAndroid Build Coastguard Worker #endif
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker #ifndef likely
64*61046927SAndroid Build Coastguard Worker #  ifdef HAVE___BUILTIN_EXPECT
65*61046927SAndroid Build Coastguard Worker #    define likely(x)   __builtin_expect(!!(x), 1)
66*61046927SAndroid Build Coastguard Worker #    define unlikely(x) __builtin_expect(!!(x), 0)
67*61046927SAndroid Build Coastguard Worker #  else
68*61046927SAndroid Build Coastguard Worker #    define likely(x)   (x)
69*61046927SAndroid Build Coastguard Worker #    define unlikely(x) (x)
70*61046927SAndroid Build Coastguard Worker #  endif
71*61046927SAndroid Build Coastguard Worker #endif
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker /**
74*61046927SAndroid Build Coastguard Worker  * __builtin_types_compatible_p compat
75*61046927SAndroid Build Coastguard Worker  */
76*61046927SAndroid Build Coastguard Worker #if defined(__cplusplus) || !defined(HAVE___BUILTIN_TYPES_COMPATIBLE_P)
77*61046927SAndroid Build Coastguard Worker #  define __builtin_types_compatible_p(type1, type2) (1)
78*61046927SAndroid Build Coastguard Worker #endif
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker /* This should match linux gcc cdecl semantics everywhere, so that we
81*61046927SAndroid Build Coastguard Worker  * just codegen one calling convention on all platforms.
82*61046927SAndroid Build Coastguard Worker  */
83*61046927SAndroid Build Coastguard Worker #ifdef _MSC_VER
84*61046927SAndroid Build Coastguard Worker #define UTIL_CDECL __cdecl
85*61046927SAndroid Build Coastguard Worker #else
86*61046927SAndroid Build Coastguard Worker #define UTIL_CDECL
87*61046927SAndroid Build Coastguard Worker #endif
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker /**
90*61046927SAndroid Build Coastguard Worker  * Static (compile-time) assertion.
91*61046927SAndroid Build Coastguard Worker  */
92*61046927SAndroid Build Coastguard Worker #define STATIC_ASSERT(cond) do { \
93*61046927SAndroid Build Coastguard Worker    static_assert(cond, #cond); \
94*61046927SAndroid Build Coastguard Worker } while (0)
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker /**
97*61046927SAndroid Build Coastguard Worker  * container_of - cast a member of a structure out to the containing structure
98*61046927SAndroid Build Coastguard Worker  * @ptr:        the pointer to the member.
99*61046927SAndroid Build Coastguard Worker  * @type:       the type of the container struct this is embedded in.
100*61046927SAndroid Build Coastguard Worker  * @member:     the name of the member within the struct.
101*61046927SAndroid Build Coastguard Worker  */
102*61046927SAndroid Build Coastguard Worker #ifndef __GNUC__
103*61046927SAndroid Build Coastguard Worker    /* a grown-up compiler is required for the extra type checking: */
104*61046927SAndroid Build Coastguard Worker #  define container_of(ptr, type, member)                               \
105*61046927SAndroid Build Coastguard Worker       (type*)((uint8_t *)ptr - offsetof(type, member))
106*61046927SAndroid Build Coastguard Worker #else
107*61046927SAndroid Build Coastguard Worker #  define __same_type(a, b) \
108*61046927SAndroid Build Coastguard Worker       __builtin_types_compatible_p(__typeof__(a), __typeof__(b))
109*61046927SAndroid Build Coastguard Worker #  define container_of(ptr, type, member) ({                            \
110*61046927SAndroid Build Coastguard Worker          uint8_t *__mptr = (uint8_t *)(ptr);                            \
111*61046927SAndroid Build Coastguard Worker          static_assert(__same_type(*(ptr), ((type *)0)->member) ||      \
112*61046927SAndroid Build Coastguard Worker                        __same_type(*(ptr), void),                       \
113*61046927SAndroid Build Coastguard Worker                        "pointer type mismatch in container_of()");      \
114*61046927SAndroid Build Coastguard Worker          ((type *)(__mptr - offsetof(type, member)));                   \
115*61046927SAndroid Build Coastguard Worker       })
116*61046927SAndroid Build Coastguard Worker #endif
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker /**
119*61046927SAndroid Build Coastguard Worker  * Unreachable macro. Useful for suppressing "control reaches end of non-void
120*61046927SAndroid Build Coastguard Worker  * function" warnings.
121*61046927SAndroid Build Coastguard Worker  */
122*61046927SAndroid Build Coastguard Worker #if defined(HAVE___BUILTIN_UNREACHABLE) || __has_builtin(__builtin_unreachable)
123*61046927SAndroid Build Coastguard Worker #define unreachable(str)    \
124*61046927SAndroid Build Coastguard Worker do {                        \
125*61046927SAndroid Build Coastguard Worker    assert(!"" str);         \
126*61046927SAndroid Build Coastguard Worker    __builtin_unreachable(); \
127*61046927SAndroid Build Coastguard Worker } while (0)
128*61046927SAndroid Build Coastguard Worker #elif defined (_MSC_VER)
129*61046927SAndroid Build Coastguard Worker #define unreachable(str)    \
130*61046927SAndroid Build Coastguard Worker do {                        \
131*61046927SAndroid Build Coastguard Worker    assert(!"" str);         \
132*61046927SAndroid Build Coastguard Worker    __assume(0);             \
133*61046927SAndroid Build Coastguard Worker } while (0)
134*61046927SAndroid Build Coastguard Worker #else
135*61046927SAndroid Build Coastguard Worker #define unreachable(str) assert(!"" str)
136*61046927SAndroid Build Coastguard Worker #endif
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker /**
139*61046927SAndroid Build Coastguard Worker  * Assume macro. Useful for expressing our assumptions to the compiler,
140*61046927SAndroid Build Coastguard Worker  * typically for purposes of silencing warnings.
141*61046927SAndroid Build Coastguard Worker  */
142*61046927SAndroid Build Coastguard Worker #if __has_builtin(__builtin_assume)
143*61046927SAndroid Build Coastguard Worker #define assume(expr)       \
144*61046927SAndroid Build Coastguard Worker do {                       \
145*61046927SAndroid Build Coastguard Worker    assert(expr);           \
146*61046927SAndroid Build Coastguard Worker    __builtin_assume(expr); \
147*61046927SAndroid Build Coastguard Worker } while (0)
148*61046927SAndroid Build Coastguard Worker #elif defined HAVE___BUILTIN_UNREACHABLE
149*61046927SAndroid Build Coastguard Worker #define assume(expr) ((expr) ? ((void) 0) \
150*61046927SAndroid Build Coastguard Worker                              : (assert(!"assumption failed"), \
151*61046927SAndroid Build Coastguard Worker                                 __builtin_unreachable()))
152*61046927SAndroid Build Coastguard Worker #elif defined (_MSC_VER)
153*61046927SAndroid Build Coastguard Worker #define assume(expr) __assume(expr)
154*61046927SAndroid Build Coastguard Worker #else
155*61046927SAndroid Build Coastguard Worker #define assume(expr) assert(expr)
156*61046927SAndroid Build Coastguard Worker #endif
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker /* Attribute const is used for functions that have no effects other than their
159*61046927SAndroid Build Coastguard Worker  * return value, and only rely on the argument values to compute the return
160*61046927SAndroid Build Coastguard Worker  * value.  As a result, calls to it can be CSEed.  Note that using memory
161*61046927SAndroid Build Coastguard Worker  * pointed to by the arguments is not allowed for const functions.
162*61046927SAndroid Build Coastguard Worker  */
163*61046927SAndroid Build Coastguard Worker #if !defined(__clang__) && defined(HAVE_FUNC_ATTRIBUTE_CONST)
164*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_CONST __attribute__((__const__))
165*61046927SAndroid Build Coastguard Worker #else
166*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_CONST
167*61046927SAndroid Build Coastguard Worker #endif
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_FLATTEN
170*61046927SAndroid Build Coastguard Worker #define FLATTEN __attribute__((__flatten__))
171*61046927SAndroid Build Coastguard Worker #else
172*61046927SAndroid Build Coastguard Worker #define FLATTEN
173*61046927SAndroid Build Coastguard Worker #endif
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_FORMAT
176*61046927SAndroid Build Coastguard Worker #if defined (__MINGW_PRINTF_FORMAT)
177*61046927SAndroid Build Coastguard Worker # define PRINTFLIKE(f, a) __attribute__ ((format(__MINGW_PRINTF_FORMAT, f, a)))
178*61046927SAndroid Build Coastguard Worker #else
179*61046927SAndroid Build Coastguard Worker # define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
180*61046927SAndroid Build Coastguard Worker #endif
181*61046927SAndroid Build Coastguard Worker #else
182*61046927SAndroid Build Coastguard Worker #define PRINTFLIKE(f, a)
183*61046927SAndroid Build Coastguard Worker #endif
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_MALLOC
186*61046927SAndroid Build Coastguard Worker #define MALLOCLIKE __attribute__((__malloc__))
187*61046927SAndroid Build Coastguard Worker #else
188*61046927SAndroid Build Coastguard Worker #define MALLOCLIKE
189*61046927SAndroid Build Coastguard Worker #endif
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker /* Forced function inlining */
192*61046927SAndroid Build Coastguard Worker /* Note: Clang also sets __GNUC__ (see other cases below) */
193*61046927SAndroid Build Coastguard Worker #ifndef ALWAYS_INLINE
194*61046927SAndroid Build Coastguard Worker #  if defined(__GNUC__)
195*61046927SAndroid Build Coastguard Worker #    define ALWAYS_INLINE inline __attribute__((always_inline))
196*61046927SAndroid Build Coastguard Worker #  elif defined(_MSC_VER)
197*61046927SAndroid Build Coastguard Worker #    define ALWAYS_INLINE __forceinline
198*61046927SAndroid Build Coastguard Worker #  else
199*61046927SAndroid Build Coastguard Worker #    define ALWAYS_INLINE inline
200*61046927SAndroid Build Coastguard Worker #  endif
201*61046927SAndroid Build Coastguard Worker #endif
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker /* Used to optionally mark structures with misaligned elements or size as
204*61046927SAndroid Build Coastguard Worker  * packed, to trade off performance for space.
205*61046927SAndroid Build Coastguard Worker  */
206*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_PACKED
207*61046927SAndroid Build Coastguard Worker #  if defined(__MINGW32__) || defined(__MINGW64__)
208*61046927SAndroid Build Coastguard Worker #    define PACKED __attribute__((gcc_struct,__packed__))
209*61046927SAndroid Build Coastguard Worker #  else
210*61046927SAndroid Build Coastguard Worker #    define PACKED __attribute__((__packed__))
211*61046927SAndroid Build Coastguard Worker #  endif
212*61046927SAndroid Build Coastguard Worker #  define ENUM_PACKED __attribute__((packed))
213*61046927SAndroid Build Coastguard Worker #else
214*61046927SAndroid Build Coastguard Worker #define PACKED
215*61046927SAndroid Build Coastguard Worker #define ENUM_PACKED
216*61046927SAndroid Build Coastguard Worker #endif
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker /* Attribute pure is used for functions that have no effects other than their
219*61046927SAndroid Build Coastguard Worker  * return value.  As a result, calls to it can be dead code eliminated.
220*61046927SAndroid Build Coastguard Worker  */
221*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_PURE
222*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_PURE __attribute__((__pure__))
223*61046927SAndroid Build Coastguard Worker #else
224*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_PURE
225*61046927SAndroid Build Coastguard Worker #endif
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL
228*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_RETURNS_NONNULL __attribute__((__returns_nonnull__))
229*61046927SAndroid Build Coastguard Worker #else
230*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_RETURNS_NONNULL
231*61046927SAndroid Build Coastguard Worker #endif
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker #ifndef NORETURN
234*61046927SAndroid Build Coastguard Worker #  ifdef _MSC_VER
235*61046927SAndroid Build Coastguard Worker #    define NORETURN __declspec(noreturn)
236*61046927SAndroid Build Coastguard Worker #  elif defined HAVE_FUNC_ATTRIBUTE_NORETURN
237*61046927SAndroid Build Coastguard Worker #    define NORETURN __attribute__((__noreturn__))
238*61046927SAndroid Build Coastguard Worker #  else
239*61046927SAndroid Build Coastguard Worker #    define NORETURN
240*61046927SAndroid Build Coastguard Worker #  endif
241*61046927SAndroid Build Coastguard Worker #endif
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_OPTIMIZE
244*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_OPTIMIZE(flags) __attribute__((__optimize__((flags))))
245*61046927SAndroid Build Coastguard Worker #else
246*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_OPTIMIZE(flags)
247*61046927SAndroid Build Coastguard Worker #endif
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
250*61046927SAndroid Build Coastguard Worker /**
251*61046927SAndroid Build Coastguard Worker  * Macro function that evaluates to true if T is a trivially
252*61046927SAndroid Build Coastguard Worker  * destructible type -- that is, if its (non-virtual) destructor
253*61046927SAndroid Build Coastguard Worker  * performs no action and all member variables and base classes are
254*61046927SAndroid Build Coastguard Worker  * trivially destructible themselves.
255*61046927SAndroid Build Coastguard Worker  */
256*61046927SAndroid Build Coastguard Worker #   if defined(__clang__)
257*61046927SAndroid Build Coastguard Worker #      if __has_builtin(__is_trivially_destructible)
258*61046927SAndroid Build Coastguard Worker #         define HAS_TRIVIAL_DESTRUCTOR(T) __is_trivially_destructible(T)
259*61046927SAndroid Build Coastguard Worker #      elif (defined(__has_feature) && __has_feature(has_trivial_destructor))
260*61046927SAndroid Build Coastguard Worker #         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
261*61046927SAndroid Build Coastguard Worker #      endif
262*61046927SAndroid Build Coastguard Worker #   elif defined(__GNUC__)
263*61046927SAndroid Build Coastguard Worker #      if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))
264*61046927SAndroid Build Coastguard Worker #         define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
265*61046927SAndroid Build Coastguard Worker #      endif
266*61046927SAndroid Build Coastguard Worker #   elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
267*61046927SAndroid Build Coastguard Worker #      define HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
268*61046927SAndroid Build Coastguard Worker #   endif
269*61046927SAndroid Build Coastguard Worker #   ifndef HAS_TRIVIAL_DESTRUCTOR
270*61046927SAndroid Build Coastguard Worker        /* It's always safe (if inefficient) to assume that a
271*61046927SAndroid Build Coastguard Worker         * destructor is non-trivial.
272*61046927SAndroid Build Coastguard Worker         */
273*61046927SAndroid Build Coastguard Worker #      define HAS_TRIVIAL_DESTRUCTOR(T) (false)
274*61046927SAndroid Build Coastguard Worker #   endif
275*61046927SAndroid Build Coastguard Worker #endif
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker /**
278*61046927SAndroid Build Coastguard Worker  * PUBLIC/USED macros
279*61046927SAndroid Build Coastguard Worker  *
280*61046927SAndroid Build Coastguard Worker  * If we build the library with gcc's -fvisibility=hidden flag, we'll
281*61046927SAndroid Build Coastguard Worker  * use the PUBLIC macro to mark functions that are to be exported.
282*61046927SAndroid Build Coastguard Worker  *
283*61046927SAndroid Build Coastguard Worker  * We also need to define a USED attribute, so the optimizer doesn't
284*61046927SAndroid Build Coastguard Worker  * inline a static function that we later use in an alias. - ajax
285*61046927SAndroid Build Coastguard Worker  */
286*61046927SAndroid Build Coastguard Worker #ifndef PUBLIC
287*61046927SAndroid Build Coastguard Worker #  if defined(_WIN32)
288*61046927SAndroid Build Coastguard Worker #    define PUBLIC __declspec(dllexport)
289*61046927SAndroid Build Coastguard Worker #    define USED
290*61046927SAndroid Build Coastguard Worker #  elif defined(__GNUC__)
291*61046927SAndroid Build Coastguard Worker #    define PUBLIC __attribute__((visibility("default")))
292*61046927SAndroid Build Coastguard Worker #    define USED __attribute__((used))
293*61046927SAndroid Build Coastguard Worker #  else
294*61046927SAndroid Build Coastguard Worker #    define PUBLIC
295*61046927SAndroid Build Coastguard Worker #    define USED
296*61046927SAndroid Build Coastguard Worker #  endif
297*61046927SAndroid Build Coastguard Worker #endif
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker /**
300*61046927SAndroid Build Coastguard Worker  * UNUSED marks variables (or sometimes functions) that have to be defined,
301*61046927SAndroid Build Coastguard Worker  * but are sometimes (or always) unused beyond that. A common case is for
302*61046927SAndroid Build Coastguard Worker  * a function parameter to be used in some build configurations but not others.
303*61046927SAndroid Build Coastguard Worker  * Another case is fallback vfuncs that don't do anything with their params.
304*61046927SAndroid Build Coastguard Worker  *
305*61046927SAndroid Build Coastguard Worker  * Note that this should not be used for identifiers used in `assert()`;
306*61046927SAndroid Build Coastguard Worker  * see ASSERTED below.
307*61046927SAndroid Build Coastguard Worker  */
308*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_UNUSED
309*61046927SAndroid Build Coastguard Worker #define UNUSED __attribute__((unused))
310*61046927SAndroid Build Coastguard Worker #elif defined (_MSC_VER)
311*61046927SAndroid Build Coastguard Worker #define UNUSED __pragma(warning(suppress:4100 4101 4189))
312*61046927SAndroid Build Coastguard Worker #else
313*61046927SAndroid Build Coastguard Worker #define UNUSED
314*61046927SAndroid Build Coastguard Worker #endif
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker /**
317*61046927SAndroid Build Coastguard Worker  * Use ASSERTED to indicate that an identifier is unused outside of an `assert()`,
318*61046927SAndroid Build Coastguard Worker  * so that assert-free builds don't get "unused variable" warnings.
319*61046927SAndroid Build Coastguard Worker  */
320*61046927SAndroid Build Coastguard Worker #ifdef NDEBUG
321*61046927SAndroid Build Coastguard Worker #define ASSERTED UNUSED
322*61046927SAndroid Build Coastguard Worker #else
323*61046927SAndroid Build Coastguard Worker #define ASSERTED
324*61046927SAndroid Build Coastguard Worker #endif
325*61046927SAndroid Build Coastguard Worker 
326*61046927SAndroid Build Coastguard Worker #ifdef HAVE_FUNC_ATTRIBUTE_WARN_UNUSED_RESULT
327*61046927SAndroid Build Coastguard Worker #define MUST_CHECK __attribute__((warn_unused_result))
328*61046927SAndroid Build Coastguard Worker #else
329*61046927SAndroid Build Coastguard Worker #define MUST_CHECK
330*61046927SAndroid Build Coastguard Worker #endif
331*61046927SAndroid Build Coastguard Worker 
332*61046927SAndroid Build Coastguard Worker #if defined(__GNUC__)
333*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_NOINLINE __attribute__((noinline))
334*61046927SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
335*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_NOINLINE __declspec(noinline)
336*61046927SAndroid Build Coastguard Worker #else
337*61046927SAndroid Build Coastguard Worker #define ATTRIBUTE_NOINLINE
338*61046927SAndroid Build Coastguard Worker #endif
339*61046927SAndroid Build Coastguard Worker 
340*61046927SAndroid Build Coastguard Worker /**
341*61046927SAndroid Build Coastguard Worker  * Check that STRUCT::FIELD can hold MAXVAL.  We use a lot of bitfields
342*61046927SAndroid Build Coastguard Worker  * in Mesa/gallium.  We have to be sure they're of sufficient size to
343*61046927SAndroid Build Coastguard Worker  * hold the largest expected value.
344*61046927SAndroid Build Coastguard Worker  * Note that with MSVC, enums are signed and enum bitfields need one extra
345*61046927SAndroid Build Coastguard Worker  * high bit (always zero) to ensure the max value is handled correctly.
346*61046927SAndroid Build Coastguard Worker  * This macro will detect that with MSVC, but not GCC.
347*61046927SAndroid Build Coastguard Worker  */
348*61046927SAndroid Build Coastguard Worker #define ASSERT_BITFIELD_SIZE(STRUCT, FIELD, MAXVAL) \
349*61046927SAndroid Build Coastguard Worker    do { \
350*61046927SAndroid Build Coastguard Worker       ASSERTED STRUCT s; \
351*61046927SAndroid Build Coastguard Worker       s.FIELD = (MAXVAL); \
352*61046927SAndroid Build Coastguard Worker       assert((int) s.FIELD == (MAXVAL) && "Insufficient bitfield size!"); \
353*61046927SAndroid Build Coastguard Worker    } while (0)
354*61046927SAndroid Build Coastguard Worker 
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker /** Compute ceiling of integer quotient of A divided by B. */
357*61046927SAndroid Build Coastguard Worker #define DIV_ROUND_UP( A, B )  ( ((A) + (B) - 1) / (B) )
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker /**
360*61046927SAndroid Build Coastguard Worker  * Clamp X to [MIN, MAX].
361*61046927SAndroid Build Coastguard Worker  * This is a macro to allow float, int, unsigned, etc. types.
362*61046927SAndroid Build Coastguard Worker  * We arbitrarily turn NaN into MIN.
363*61046927SAndroid Build Coastguard Worker  */
364*61046927SAndroid Build Coastguard Worker #define CLAMP( X, MIN, MAX )  ( (X)>(MIN) ? ((X)>(MAX) ? (MAX) : (X)) : (MIN) )
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker /* Syntax sugar occuring frequently in graphics code */
367*61046927SAndroid Build Coastguard Worker #define SATURATE( X ) CLAMP(X, 0.0f, 1.0f)
368*61046927SAndroid Build Coastguard Worker 
369*61046927SAndroid Build Coastguard Worker /** Minimum of two values: */
370*61046927SAndroid Build Coastguard Worker #define MIN2( A, B )   ( (A)<(B) ? (A) : (B) )
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker /** Maximum of two values: */
373*61046927SAndroid Build Coastguard Worker #define MAX2( A, B )   ( (A)>(B) ? (A) : (B) )
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker /** Minimum of three values: */
376*61046927SAndroid Build Coastguard Worker #define MIN3( A, B, C ) ((A) < (B) ? MIN2(A, C) : MIN2(B, C))
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker /** Maximum of three values: */
379*61046927SAndroid Build Coastguard Worker #define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C))
380*61046927SAndroid Build Coastguard Worker 
381*61046927SAndroid Build Coastguard Worker /** Minimum of four values: */
382*61046927SAndroid Build Coastguard Worker #define MIN4( A, B, C, D ) ((A) < (B) ? MIN3(A, C, D) : MIN3(B, C, D))
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker /** Maximum of four values: */
385*61046927SAndroid Build Coastguard Worker #define MAX4( A, B, C, D ) ((A) > (B) ? MAX3(A, C, D) : MAX3(B, C, D))
386*61046927SAndroid Build Coastguard Worker 
387*61046927SAndroid Build Coastguard Worker /** Align a value to a power of two */
388*61046927SAndroid Build Coastguard Worker #define ALIGN_POT(x, pot_align) (((x) + (pot_align) - 1) & ~((pot_align) - 1))
389*61046927SAndroid Build Coastguard Worker 
390*61046927SAndroid Build Coastguard Worker /** Checks is a value is a power of two. Does not handle zero. */
391*61046927SAndroid Build Coastguard Worker #define IS_POT(v) (((v) & ((v) - 1)) == 0)
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker /** Checks is a value is a power of two. Zero handled. */
394*61046927SAndroid Build Coastguard Worker #define IS_POT_NONZERO(v) ((v) != 0 && IS_POT(v))
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker /** Set a single bit */
397*61046927SAndroid Build Coastguard Worker #define BITFIELD_BIT(b)      (1u << (b))
398*61046927SAndroid Build Coastguard Worker /** Set all bits up to excluding bit b */
399*61046927SAndroid Build Coastguard Worker #define BITFIELD_MASK(b)      \
400*61046927SAndroid Build Coastguard Worker    ((b) == 32 ? (~0u) : BITFIELD_BIT((b) & 31) - 1)
401*61046927SAndroid Build Coastguard Worker /** Set count bits starting from bit b  */
402*61046927SAndroid Build Coastguard Worker #define BITFIELD_RANGE(b, count) \
403*61046927SAndroid Build Coastguard Worker    (BITFIELD_MASK((b) + (count)) & ~BITFIELD_MASK(b))
404*61046927SAndroid Build Coastguard Worker 
405*61046927SAndroid Build Coastguard Worker /** Set a single bit */
406*61046927SAndroid Build Coastguard Worker #define BITFIELD64_BIT(b)      (1ull << (b))
407*61046927SAndroid Build Coastguard Worker /** Set all bits up to excluding bit b */
408*61046927SAndroid Build Coastguard Worker #define BITFIELD64_MASK(b)      \
409*61046927SAndroid Build Coastguard Worker    ((b) == 64 ? (~0ull) : BITFIELD64_BIT((b) & 63) - 1)
410*61046927SAndroid Build Coastguard Worker /** Set count bits starting from bit b  */
411*61046927SAndroid Build Coastguard Worker #define BITFIELD64_RANGE(b, count) \
412*61046927SAndroid Build Coastguard Worker    (BITFIELD64_MASK((b) + (count)) & ~BITFIELD64_MASK(b))
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker static inline int64_t
u_intN_max(unsigned bit_size)415*61046927SAndroid Build Coastguard Worker u_intN_max(unsigned bit_size)
416*61046927SAndroid Build Coastguard Worker {
417*61046927SAndroid Build Coastguard Worker    assert(bit_size <= 64 && bit_size > 0);
418*61046927SAndroid Build Coastguard Worker    return INT64_MAX >> (64 - bit_size);
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker static inline int64_t
u_intN_min(unsigned bit_size)422*61046927SAndroid Build Coastguard Worker u_intN_min(unsigned bit_size)
423*61046927SAndroid Build Coastguard Worker {
424*61046927SAndroid Build Coastguard Worker    /* On 2's compliment platforms, which is every platform Mesa is likely to
425*61046927SAndroid Build Coastguard Worker     * every worry about, stdint.h generally calculated INT##_MIN in this
426*61046927SAndroid Build Coastguard Worker     * manner.
427*61046927SAndroid Build Coastguard Worker     */
428*61046927SAndroid Build Coastguard Worker    return (-u_intN_max(bit_size)) - 1;
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker static inline uint64_t
u_uintN_max(unsigned bit_size)432*61046927SAndroid Build Coastguard Worker u_uintN_max(unsigned bit_size)
433*61046927SAndroid Build Coastguard Worker {
434*61046927SAndroid Build Coastguard Worker    assert(bit_size <= 64 && bit_size > 0);
435*61046927SAndroid Build Coastguard Worker    return UINT64_MAX >> (64 - bit_size);
436*61046927SAndroid Build Coastguard Worker }
437*61046927SAndroid Build Coastguard Worker 
438*61046927SAndroid Build Coastguard Worker /* alignas usage
439*61046927SAndroid Build Coastguard Worker  * For struct or union, use alignas(align_size) on any member
440*61046927SAndroid Build Coastguard Worker  * of it will make it aligned to align_size.
441*61046927SAndroid Build Coastguard Worker  * See https://en.cppreference.com/w/c/language/_Alignas for
442*61046927SAndroid Build Coastguard Worker  * details. We can use static_assert and alignof to check if
443*61046927SAndroid Build Coastguard Worker  * the alignment result of alignas(align_size) on struct or
444*61046927SAndroid Build Coastguard Worker  * union is valid.
445*61046927SAndroid Build Coastguard Worker  * For example:
446*61046927SAndroid Build Coastguard Worker  *   static_assert(alignof(struct tgsi_exec_machine) == 16, "")
447*61046927SAndroid Build Coastguard Worker  * Also, we can use special code to see the size of the aligned
448*61046927SAndroid Build Coastguard Worker  * struct or union at the compile time with GCC, Clang or MSVC.
449*61046927SAndroid Build Coastguard Worker  * So we can see if the size of union or struct are as expected
450*61046927SAndroid Build Coastguard Worker  * when using alignas(align_size) on its member.
451*61046927SAndroid Build Coastguard Worker  * For example:
452*61046927SAndroid Build Coastguard Worker  *   char (*__kaboom)[sizeof(struct tgsi_exec_machine)] = 1;
453*61046927SAndroid Build Coastguard Worker  * can show us the size of struct tgsi_exec_machine at compile
454*61046927SAndroid Build Coastguard Worker  * time.
455*61046927SAndroid Build Coastguard Worker  */
456*61046927SAndroid Build Coastguard Worker #ifndef __cplusplus
457*61046927SAndroid Build Coastguard Worker #ifdef _MSC_VER
458*61046927SAndroid Build Coastguard Worker #define alignof _Alignof
459*61046927SAndroid Build Coastguard Worker #define alignas _Alignas
460*61046927SAndroid Build Coastguard Worker #else
461*61046927SAndroid Build Coastguard Worker #include <stdalign.h>
462*61046927SAndroid Build Coastguard Worker #endif
463*61046927SAndroid Build Coastguard Worker #endif
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker /* Macros for static type-safety checking.
466*61046927SAndroid Build Coastguard Worker  *
467*61046927SAndroid Build Coastguard Worker  * https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
468*61046927SAndroid Build Coastguard Worker  */
469*61046927SAndroid Build Coastguard Worker 
470*61046927SAndroid Build Coastguard Worker #if __has_attribute(capability)
471*61046927SAndroid Build Coastguard Worker typedef int __attribute__((capability("mutex"))) lock_cap_t;
472*61046927SAndroid Build Coastguard Worker 
473*61046927SAndroid Build Coastguard Worker #define guarded_by(l) __attribute__((guarded_by(l)))
474*61046927SAndroid Build Coastguard Worker #define acquire_cap(l) __attribute((acquire_capability(l), no_thread_safety_analysis))
475*61046927SAndroid Build Coastguard Worker #define release_cap(l) __attribute((release_capability(l), no_thread_safety_analysis))
476*61046927SAndroid Build Coastguard Worker #define assert_cap(l) __attribute((assert_capability(l), no_thread_safety_analysis))
477*61046927SAndroid Build Coastguard Worker #define requires_cap(l) __attribute((requires_capability(l)))
478*61046927SAndroid Build Coastguard Worker #define disable_thread_safety_analysis __attribute((no_thread_safety_analysis))
479*61046927SAndroid Build Coastguard Worker 
480*61046927SAndroid Build Coastguard Worker #else
481*61046927SAndroid Build Coastguard Worker 
482*61046927SAndroid Build Coastguard Worker typedef int lock_cap_t;
483*61046927SAndroid Build Coastguard Worker 
484*61046927SAndroid Build Coastguard Worker #define guarded_by(l)
485*61046927SAndroid Build Coastguard Worker #define acquire_cap(l)
486*61046927SAndroid Build Coastguard Worker #define release_cap(l)
487*61046927SAndroid Build Coastguard Worker #define assert_cap(l)
488*61046927SAndroid Build Coastguard Worker #define requires_cap(l)
489*61046927SAndroid Build Coastguard Worker #define disable_thread_safety_analysis
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker #endif
492*61046927SAndroid Build Coastguard Worker 
493*61046927SAndroid Build Coastguard Worker #define DO_PRAGMA(X) _Pragma (#X)
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker #if defined(__clang__)
496*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_PUSH       _Pragma("clang diagnostic push")
497*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_POP        _Pragma("clang diagnostic pop")
498*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_ERROR(X)   DO_PRAGMA( clang diagnostic error #X )
499*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_WARNING(X) DO_PRAGMA( clang diagnostic warning #X )
500*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_IGNORED(X) DO_PRAGMA( clang diagnostic ignored #X )
501*61046927SAndroid Build Coastguard Worker #elif defined(__GNUC__)
502*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_PUSH       _Pragma("GCC diagnostic push")
503*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_POP        _Pragma("GCC diagnostic pop")
504*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_ERROR(X)   DO_PRAGMA( GCC diagnostic error #X )
505*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_WARNING(X) DO_PRAGMA( GCC diagnostic warning #X )
506*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_IGNORED(X) DO_PRAGMA( GCC diagnostic ignored #X )
507*61046927SAndroid Build Coastguard Worker #else
508*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_PUSH
509*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_POP
510*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_ERROR(X)
511*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_WARNING(X)
512*61046927SAndroid Build Coastguard Worker #define PRAGMA_DIAGNOSTIC_IGNORED(X)
513*61046927SAndroid Build Coastguard Worker #endif
514*61046927SAndroid Build Coastguard Worker 
515*61046927SAndroid Build Coastguard Worker #define PASTE2(a, b) a ## b
516*61046927SAndroid Build Coastguard Worker #define PASTE3(a, b, c) a ## b ## c
517*61046927SAndroid Build Coastguard Worker #define PASTE4(a, b, c, d) a ## b ## c ## d
518*61046927SAndroid Build Coastguard Worker 
519*61046927SAndroid Build Coastguard Worker #define CONCAT2(a, b) PASTE2(a, b)
520*61046927SAndroid Build Coastguard Worker #define CONCAT3(a, b, c) PASTE3(a, b, c)
521*61046927SAndroid Build Coastguard Worker #define CONCAT4(a, b, c, d) PASTE4(a, b, c, d)
522*61046927SAndroid Build Coastguard Worker 
523*61046927SAndroid Build Coastguard Worker #if defined(__GNUC__)
524*61046927SAndroid Build Coastguard Worker #define PRAGMA_POISON(X) DO_PRAGMA( GCC poison X )
525*61046927SAndroid Build Coastguard Worker #elif defined(__clang__)
526*61046927SAndroid Build Coastguard Worker #define PRAGMA_POISON(X) DO_PRAGMA( clang poison X )
527*61046927SAndroid Build Coastguard Worker #else
528*61046927SAndroid Build Coastguard Worker #define PRAGMA_POISON
529*61046927SAndroid Build Coastguard Worker #endif
530*61046927SAndroid Build Coastguard Worker 
531*61046927SAndroid Build Coastguard Worker #endif /* UTIL_MACROS_H */
532