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