Re: [PATCH] BUILD_BUG_ON: make it handle more cases
From: Rusty Russell <hidden>
Date: 2009-11-05 06:28:34
Also in:
linux-next, lkml
On Thu, 5 Nov 2009 10:50:20 am Stephen Rothwell wrote:
Hi Rusty, On Tue, 20 Oct 2009 14:15:33 +1030 Rusty Russell [off-list ref] wrote:quoted
+#ifndef __OPTIMIZE__ +#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) +#else +extern int __build_bug_on_failed; +#define BUILD_BUG_ON(condition) \ + do { \ + ((void)sizeof(char[1 - 2*!!(condition)])); \ + if (condition) __build_bug_on_failed = 1; \ + } while(0) +#endif +#define MAYBE_BUILD_BUG_ON(condition) BUILD_BUG_ON(condition) +I decided to try this in linux-next, but an x86_64 allmodconfig build gave this (gcc 4.4.0): ERROR: "__build_bug_on_failed" [drivers/net/virtio_net.ko] undefined! ERROR: "__build_bug_on_failed" [drivers/block/virtio_blk.ko] undefined! I assume that this is caused by the "MAYBE_BUILD_BUG_ON(fbit >= 32)" in virtio_has_feature() (in include/linux/virtio_config.h) which is called all over the place. Unfortunately, virtio_has_feature() gets uninlined in those two files ...
Huh? virtio_has_feature does: if (__builtin_constant_p(fbit)) BUILD_BUG_ON(fbit >= 32); else BUG_ON(fbit >= 32); So, if it's not a constant, gcc should throw away that first branch. If it is, it should optimize it away (and no, these are not real bugs AFAICT). I did a 4.3.3 allmodconfig with this patch on 64-bit a few days back and all was fine. Will try 4.4.0 now. Thanks, Rusty.