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