diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-24 19:58:39 +1000 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-24 19:58:39 +1000 | 
| commit | d315777b32a4696feb86f2a0c9e9f39c94683649 (patch) | |
| tree | f21c24d85cde6ad453c4d9485f5de49357336f81 /include/linux | |
| parent | 5a05a6d7a51bcc47c5c6f0ed68e433f9a01afd89 (diff) | |
| parent | 1765e3a4933ea0870fabd755feffc5473c4363ce (diff) | |
Merge branch 'BUG_ON' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus
* 'BUG_ON' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus:
  Remove MAYBE_BUILD_BUG_ON
  BUILD_BUG_ON: make it handle more cases
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/gfp.h | 2 | ||||
| -rw-r--r-- | include/linux/kernel.h | 32 | ||||
| -rw-r--r-- | include/linux/kmemcheck.h | 2 | ||||
| -rw-r--r-- | include/linux/virtio_config.h | 5 | 
4 files changed, 32 insertions, 9 deletions
| diff --git a/include/linux/gfp.h b/include/linux/gfp.h index a3b148a91874..0b84c61607e8 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -249,7 +249,7 @@ static inline enum zone_type gfp_zone(gfp_t flags)  					 ((1 << ZONES_SHIFT) - 1);  	if (__builtin_constant_p(bit)) -		MAYBE_BUILD_BUG_ON((GFP_ZONE_BAD >> bit) & 1); +		BUILD_BUG_ON((GFP_ZONE_BAD >> bit) & 1);  	else {  #ifdef CONFIG_DEBUG_VM  		BUG_ON((GFP_ZONE_BAD >> bit) & 1); diff --git a/include/linux/kernel.h b/include/linux/kernel.h index d07d8057e440..e2f4d6af2125 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -575,12 +575,6 @@ struct sysinfo {  	char _f[20-2*sizeof(long)-sizeof(int)];	/* Padding: libc5 uses this.. */  }; -/* Force a compilation error if condition is true */ -#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition)) - -/* 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 a constant 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)) @@ -592,6 +586,32 @@ struct sysinfo {  #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))  #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); })) +/** + * BUILD_BUG_ON - break compile if a condition is true. + * @cond: the condition which the compiler should know is false. + * + * If you have some code which relies on certain constants being equal, or + * other compile-time-evaluated condition, you should use BUILD_BUG_ON to + * detect if someone changes it. + * + * The implementation uses gcc's reluctance to create a negative array, but + * gcc (as of 4.4) only emits that error for obvious cases (eg. not arguments + * to inline functions).  So as a fallback we use the optimizer; if it can't + * prove the condition is false, it will cause a link error on the undefined + * "__build_bug_on_failed".  This error message can be harder to track down + * though, hence the two different methods. + */ +#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 +  /* Trap pasters of __FUNCTION__ at compile-time */  #define __FUNCTION__ (__func__) diff --git a/include/linux/kmemcheck.h b/include/linux/kmemcheck.h index 08d7dc4ddf40..39f8453239f7 100644 --- a/include/linux/kmemcheck.h +++ b/include/linux/kmemcheck.h @@ -76,7 +76,7 @@ bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size);  									\  		_n = (long) &((ptr)->name##_end)			\  			- (long) &((ptr)->name##_begin);		\ -		MAYBE_BUILD_BUG_ON(_n < 0);				\ +		BUILD_BUG_ON(_n < 0);					\  									\  		kmemcheck_mark_initialized(&((ptr)->name##_begin), _n);	\  	} while (0) diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index 0093dd7c1d6f..800617b4ddd5 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -109,7 +109,10 @@ static inline bool virtio_has_feature(const struct virtio_device *vdev,  				      unsigned int fbit)  {  	/* Did you forget to fix assumptions on max features? */ -	MAYBE_BUILD_BUG_ON(fbit >= 32); +	if (__builtin_constant_p(fbit)) +		BUILD_BUG_ON(fbit >= 32); +	else +		BUG_ON(fbit >= 32);  	if (fbit < VIRTIO_TRANSPORT_F_START)  		virtio_check_driver_offered_feature(vdev, fbit); | 
