xref: /aosp_15_r20/external/bpftool/include/linux/compiler.h (revision 858ea5e570667251cdc31d3fe7b846b591105938)
1*858ea5e5SAndroid Build Coastguard Worker /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2*858ea5e5SAndroid Build Coastguard Worker 
3*858ea5e5SAndroid Build Coastguard Worker #ifndef _LINUX_COMPILER_H_
4*858ea5e5SAndroid Build Coastguard Worker #define _LINUX_COMPILER_H_
5*858ea5e5SAndroid Build Coastguard Worker 
6*858ea5e5SAndroid Build Coastguard Worker #include <linux/compiler_types.h>
7*858ea5e5SAndroid Build Coastguard Worker 
8*858ea5e5SAndroid Build Coastguard Worker #if defined(__OPTIMIZE__) && __has_attribute(__error__)
9*858ea5e5SAndroid Build Coastguard Worker # define __compiletime_assert(condition, msg, prefix, suffix)		\
10*858ea5e5SAndroid Build Coastguard Worker 	do {								\
11*858ea5e5SAndroid Build Coastguard Worker 		extern void prefix ## suffix(void) __compiletime_error(msg); \
12*858ea5e5SAndroid Build Coastguard Worker 		if (!(condition))					\
13*858ea5e5SAndroid Build Coastguard Worker 			prefix ## suffix();				\
14*858ea5e5SAndroid Build Coastguard Worker 	} while (0)
15*858ea5e5SAndroid Build Coastguard Worker #else
16*858ea5e5SAndroid Build Coastguard Worker # define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)
17*858ea5e5SAndroid Build Coastguard Worker #endif
18*858ea5e5SAndroid Build Coastguard Worker 
19*858ea5e5SAndroid Build Coastguard Worker #define _compiletime_assert(condition, msg, prefix, suffix) \
20*858ea5e5SAndroid Build Coastguard Worker 	__compiletime_assert(condition, msg, prefix, suffix)
21*858ea5e5SAndroid Build Coastguard Worker 
22*858ea5e5SAndroid Build Coastguard Worker /**
23*858ea5e5SAndroid Build Coastguard Worker  * compiletime_assert - break build and emit msg if condition is false
24*858ea5e5SAndroid Build Coastguard Worker  * @condition: a compile-time constant condition to check
25*858ea5e5SAndroid Build Coastguard Worker  * @msg:       a message to emit if condition is false
26*858ea5e5SAndroid Build Coastguard Worker  *
27*858ea5e5SAndroid Build Coastguard Worker  * In tradition of POSIX assert, this macro will break the build if the
28*858ea5e5SAndroid Build Coastguard Worker  * supplied condition is *false*, emitting the supplied error message if the
29*858ea5e5SAndroid Build Coastguard Worker  * compiler has support to do so.
30*858ea5e5SAndroid Build Coastguard Worker  */
31*858ea5e5SAndroid Build Coastguard Worker #define compiletime_assert(condition, msg) \
32*858ea5e5SAndroid Build Coastguard Worker 	_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
33*858ea5e5SAndroid Build Coastguard Worker 
34*858ea5e5SAndroid Build Coastguard Worker /* Are two types/vars the same type (ignoring qualifiers)? */
35*858ea5e5SAndroid Build Coastguard Worker #ifndef __same_type
36*858ea5e5SAndroid Build Coastguard Worker # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
37*858ea5e5SAndroid Build Coastguard Worker #endif
38*858ea5e5SAndroid Build Coastguard Worker 
39*858ea5e5SAndroid Build Coastguard Worker #ifndef __maybe_unused
40*858ea5e5SAndroid Build Coastguard Worker # define __maybe_unused		__attribute__((unused))
41*858ea5e5SAndroid Build Coastguard Worker #endif
42*858ea5e5SAndroid Build Coastguard Worker 
43*858ea5e5SAndroid Build Coastguard Worker #ifndef __weak
44*858ea5e5SAndroid Build Coastguard Worker # define __weak			__attribute__((weak))
45*858ea5e5SAndroid Build Coastguard Worker #endif
46*858ea5e5SAndroid Build Coastguard Worker 
47*858ea5e5SAndroid Build Coastguard Worker #endif
48