Skip to content

Commit

Permalink
kernel.h: add BUILD_BUG() macro
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: David Rientjes <[email protected]>
Cc: DM <[email protected]>
Cc: Ralf Baechle <[email protected]>
Acked-by: David Howells <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
daviddaney authored and torvalds committed Jan 11, 2012
1 parent 1e16a53 commit 1399ff8
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/linux/compiler-gcc4.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
the kernel context */
#define __cold __attribute__((__cold__))

#define __linktime_error(message) __attribute__((__error__(message)))

#if __GNUC_MINOR__ >= 5
/*
Expand Down
4 changes: 3 additions & 1 deletion include/linux/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,9 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
#ifndef __compiletime_error
# define __compiletime_error(message)
#endif

#ifndef __linktime_error
# define __linktime_error(message)
#endif
/*
* Prevent the compiler from merging or refetching accesses. The compiler
* is also forbidden from reordering successive instances of ACCESS_ONCE(),
Expand Down
16 changes: 16 additions & 0 deletions include/linux/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,7 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
#define BUILD_BUG_ON_ZERO(e) (0)
#define BUILD_BUG_ON_NULL(e) ((void*)0)
#define BUILD_BUG_ON(condition)
#define BUILD_BUG() (0)
#else /* __CHECKER__ */

/* Force a compilation error if a constant expression is not a power of 2 */
Expand Down Expand Up @@ -703,6 +704,21 @@ extern int __build_bug_on_failed;
if (condition) __build_bug_on_failed = 1; \
} while(0)
#endif

/**
* BUILD_BUG - break compile if used.
*
* If you have some code that you expect the compiler to eliminate at
* build time, you should use BUILD_BUG to detect if it is
* unexpectedly used.
*/
#define BUILD_BUG() \
do { \
extern void __build_bug_failed(void) \
__linktime_error("BUILD_BUG failed"); \
__build_bug_failed(); \
} while (0)

#endif /* __CHECKER__ */

/* Trap pasters of __FUNCTION__ at compile-time */
Expand Down

0 comments on commit 1399ff8

Please sign in to comment.