90 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _LINUX_BUILD_BUG_H3#define _LINUX_BUILD_BUG_H4 5#include <linux/compiler.h>6 7#ifdef __CHECKER__8#define BUILD_BUG_ON_ZERO(e) (0)9#else /* __CHECKER__ */10/*11 * Force a compilation error if condition is true, but also produce a12 * result (of value 0 and type int), so the expression can be used13 * e.g. in a structure initializer (or where-ever else comma expressions14 * aren't permitted).15 */16#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))17#endif /* __CHECKER__ */18 19/* Force a compilation error if a constant expression is not a power of 2 */20#define __BUILD_BUG_ON_NOT_POWER_OF_2(n) \21 BUILD_BUG_ON(((n) & ((n) - 1)) != 0)22#define BUILD_BUG_ON_NOT_POWER_OF_2(n) \23 BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0))24 25/*26 * BUILD_BUG_ON_INVALID() permits the compiler to check the validity of the27 * expression but avoids the generation of any code, even if that expression28 * has side-effects.29 */30#define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e))))31 32/**33 * BUILD_BUG_ON_MSG - break compile if a condition is true & emit supplied34 * error message.35 * @condition: the condition which the compiler should know is false.36 *37 * See BUILD_BUG_ON for description.38 */39#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)40 41/**42 * BUILD_BUG_ON - break compile if a condition is true.43 * @condition: the condition which the compiler should know is false.44 *45 * If you have some code which relies on certain constants being equal, or46 * some other compile-time-evaluated condition, you should use BUILD_BUG_ON to47 * detect if someone changes it.48 */49#define BUILD_BUG_ON(condition) \50 BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)51 52/**53 * BUILD_BUG - break compile if used.54 *55 * If you have some code that you expect the compiler to eliminate at56 * build time, you should use BUILD_BUG to detect if it is57 * unexpectedly used.58 */59#define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")60 61/**62 * static_assert - check integer constant expression at build time63 *64 * static_assert() is a wrapper for the C11 _Static_assert, with a65 * little macro magic to make the message optional (defaulting to the66 * stringification of the tested expression).67 *68 * Contrary to BUILD_BUG_ON(), static_assert() can be used at global69 * scope, but requires the expression to be an integer constant70 * expression (i.e., it is not enough that __builtin_constant_p() is71 * true for expr).72 *73 * Also note that BUILD_BUG_ON() fails the build if the condition is74 * true, while static_assert() fails the build if the expression is75 * false.76 */77#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)78#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)79 80 81/*82 * Compile time check that field has an expected offset83 */84#define ASSERT_STRUCT_OFFSET(type, field, expected_offset) \85 BUILD_BUG_ON_MSG(offsetof(type, field) != (expected_offset), \86 "Offset of " #field " in " #type " has changed.")87 88 89#endif /* _LINUX_BUILD_BUG_H */90