xref: /aosp_15_r20/external/gsc-utils/include/compile_time_macros.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
1*4f2df630SAndroid Build Coastguard Worker /* Copyright 2013 The ChromiumOS Authors
2*4f2df630SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*4f2df630SAndroid Build Coastguard Worker  * found in the LICENSE file.
4*4f2df630SAndroid Build Coastguard Worker  */
5*4f2df630SAndroid Build Coastguard Worker 
6*4f2df630SAndroid Build Coastguard Worker /* Handy clever tricks */
7*4f2df630SAndroid Build Coastguard Worker 
8*4f2df630SAndroid Build Coastguard Worker #ifndef __CROS_EC_COMPILE_TIME_MACROS_H
9*4f2df630SAndroid Build Coastguard Worker #define __CROS_EC_COMPILE_TIME_MACROS_H
10*4f2df630SAndroid Build Coastguard Worker 
11*4f2df630SAndroid Build Coastguard Worker /* Test an important condition at compile time, not run time */
12*4f2df630SAndroid Build Coastguard Worker #define _BA1_(cond, line)                                    \
13*4f2df630SAndroid Build Coastguard Worker 	extern int __build_assertion_##line[1 - 2 * !(cond)] \
14*4f2df630SAndroid Build Coastguard Worker 		__attribute__((unused))
15*4f2df630SAndroid Build Coastguard Worker #define _BA0_(c, x)	   _BA1_(c, x)
16*4f2df630SAndroid Build Coastguard Worker #define BUILD_ASSERT(cond) _BA0_(cond, __LINE__)
17*4f2df630SAndroid Build Coastguard Worker 
18*4f2df630SAndroid Build Coastguard Worker /*
19*4f2df630SAndroid Build Coastguard Worker  * Test an important condition inside code path at run time, taking advantage of
20*4f2df630SAndroid Build Coastguard Worker  * -Werror=div-by-zero.
21*4f2df630SAndroid Build Coastguard Worker  */
22*4f2df630SAndroid Build Coastguard Worker #define BUILD_CHECK_INLINE(value, cond_true) ((value) / (!!(cond_true)))
23*4f2df630SAndroid Build Coastguard Worker 
24*4f2df630SAndroid Build Coastguard Worker /* Number of elements in an array */
25*4f2df630SAndroid Build Coastguard Worker #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
26*4f2df630SAndroid Build Coastguard Worker 
27*4f2df630SAndroid Build Coastguard Worker /* Make for loops that iterate over pointers to array entries more readable */
28*4f2df630SAndroid Build Coastguard Worker #define ARRAY_BEGIN(array) (array)
29*4f2df630SAndroid Build Coastguard Worker #define ARRAY_END(array)   ((array) + ARRAY_SIZE(array))
30*4f2df630SAndroid Build Coastguard Worker 
31*4f2df630SAndroid Build Coastguard Worker /* Just in case - http://gcc.gnu.org/onlinedocs/gcc/Offsetof.html */
32*4f2df630SAndroid Build Coastguard Worker #ifndef offsetof
33*4f2df630SAndroid Build Coastguard Worker #define offsetof(type, member) __builtin_offsetof(type, member)
34*4f2df630SAndroid Build Coastguard Worker #endif
35*4f2df630SAndroid Build Coastguard Worker 
36*4f2df630SAndroid Build Coastguard Worker #define member_size(type, member) sizeof(((type *)0)->member)
37*4f2df630SAndroid Build Coastguard Worker 
38*4f2df630SAndroid Build Coastguard Worker /*
39*4f2df630SAndroid Build Coastguard Worker  * Bit operation macros.
40*4f2df630SAndroid Build Coastguard Worker  */
41*4f2df630SAndroid Build Coastguard Worker #define BIT(nr)	    (1U << (nr))
42*4f2df630SAndroid Build Coastguard Worker #define BIT_ULL(nr) (1ULL << (nr))
43*4f2df630SAndroid Build Coastguard Worker 
44*4f2df630SAndroid Build Coastguard Worker #endif /* __CROS_EC_COMPILE_TIME_MACROS_H */
45