Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kernel.h: add BUILD_BUG() macro

We can place this in definitions that we expect the compiler to remove by
dead code elimination. If this assertion fails, we get a nice error
message at build time.

The GCC function attribute error("message") was added in version 4.3, so
we define a new macro __linktime_error(message) to expand to this for
GCC-4.3 and later. This will give us an error diagnostic from the
compiler on the line that fails. For other compilers
__linktime_error(message) expands to nothing, and we have to be content
with a link time error, but at least we will still get a build error.

BUILD_BUG() expands to the undefined function __build_bug_failed() and
will fail at link time if the compiler ever emits code for it. On GCC-4.3
and later, attribute((error())) is used so that the failure will be noted
at compile time instead.

Signed-off-by: David Daney <david.daney@cavium.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: DM <dm.n9107@gmail.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Acked-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

David Daney and committed by
Linus Torvalds
1399ff86 1e16a539

+20 -1
+1
include/linux/compiler-gcc4.h
··· 29 29 the kernel context */ 30 30 #define __cold __attribute__((__cold__)) 31 31 32 + #define __linktime_error(message) __attribute__((__error__(message))) 32 33 33 34 #if __GNUC_MINOR__ >= 5 34 35 /*
+3 -1
include/linux/compiler.h
··· 293 293 #ifndef __compiletime_error 294 294 # define __compiletime_error(message) 295 295 #endif 296 - 296 + #ifndef __linktime_error 297 + # define __linktime_error(message) 298 + #endif 297 299 /* 298 300 * Prevent the compiler from merging or refetching accesses. The compiler 299 301 * is also forbidden from reordering successive instances of ACCESS_ONCE(),
+16
include/linux/kernel.h
··· 665 665 #define BUILD_BUG_ON_ZERO(e) (0) 666 666 #define BUILD_BUG_ON_NULL(e) ((void*)0) 667 667 #define BUILD_BUG_ON(condition) 668 + #define BUILD_BUG() (0) 668 669 #else /* __CHECKER__ */ 669 670 670 671 /* Force a compilation error if a constant expression is not a power of 2 */ ··· 704 703 if (condition) __build_bug_on_failed = 1; \ 705 704 } while(0) 706 705 #endif 706 + 707 + /** 708 + * BUILD_BUG - break compile if used. 709 + * 710 + * If you have some code that you expect the compiler to eliminate at 711 + * build time, you should use BUILD_BUG to detect if it is 712 + * unexpectedly used. 713 + */ 714 + #define BUILD_BUG() \ 715 + do { \ 716 + extern void __build_bug_failed(void) \ 717 + __linktime_error("BUILD_BUG failed"); \ 718 + __build_bug_failed(); \ 719 + } while (0) 720 + 707 721 #endif /* __CHECKER__ */ 708 722 709 723 /* Trap pasters of __FUNCTION__ at compile-time */