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