Messages in this thread Patch in this message | | | From | Roland Dreier <> | Subject | [PATCH] Add BUILD_BUG_ON_NOT_POWER_OF_2() | Date | Wed, 06 Jan 2010 15:02:40 -0800 |
| |
When code relies on a constant being a power of 2:
#define FOO 512 /* must be a power of 2 */
it would be nice to be able to do:
BUILD_BUG_ON(!is_power_of_2(FOO));
However applying an inline function does not result in a compile-time constant that can be used with BUILD_BUG_ON(), so trying that gives results in:
error: bit-field '<anonymous>' width not an integer constant
As suggested by akpm, rather than monkeying around with is_power_of_2() and risking gcc warts about constant expressions, just create a macro BUILD_BUG_ON_NOT_POWER_OF_2() to encapsulate this common requirement.
Signed-off-by: Roland Dreier <rolandd@cisco.com> --- > mm.. I think _something_ is worth it. The requirement that a constant > be a power of two is a very common one in the kernel.
Fair enough... here's your suggestion of BUILD_BUG_ON_NOT_POWER_OF_2(). <linux/kernel.h> does seem to be going the way of a gazillion very specific helper macros, so I guess this fits right in.
include/linux/kernel.h | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 3fc9f5a..a1b6652 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -734,6 +734,10 @@ struct sysinfo { /* Force a compilation error if condition is constant and true */ #define MAYBE_BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)])) +/* Force a compilation error if expression is not a power of 2 */ +#define BUILD_BUG_ON_NOT_POWER_OF_2(n) \ + BUILD_BUG_ON(((n) != 0 && (((n) & ((n) - 1)) == 0))) + /* Force a compilation error if condition is true, but also produce a result (of value 0 and type size_t), so the expression can be used e.g. in a structure initializer (or where-ever else comma expressions
| |