Re: linux-next: tree build failure
From: Hollis Blanchard <hidden>
Date: 2009-10-19 18:19:46
Also in:
linux-next, lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
On Thu, 2009-10-15 at 08:27 +0100, Jan Beulich wrote:
quoted
quoted
quoted
Hollis Blanchard [off-list ref] 15.10.09 00:57 >>>On Fri, 2009-10-09 at 12:14 -0700, Hollis Blanchard wrote:quoted
Rusty's version of BUILD_BUG_ON() does indeed fix the build break, and also exposes the bug in kvmppc_account_exit_stat(). So to recap: original: built but didn't work Jan's: doesn't build Rusty's: builds and works Where do you want to go from here?Jan, what are your thoughts? Your BUILD_BUG_ON patch has broken the build, and we still need to fix it.My perspective is that it just uncovered already existing brokenness. And honestly, I won't be able to get to look into this within the next days. (And btw., when I run into issues with other people's code changes, quite frequently I'm told to propose a patch, so I'm also having some philosophical problem understanding why I can't simply expect the same when people run into issues with changes I made, especially in cases like this where it wasn't me introducing the broken code.) So, if this can wait for a couple of days, I can try to find time to look into this. Otherwise, I'd rely on someone running into the actual issue to implement a solution.
Sorry, I thought it was clear, but to be more explicit: I propose the following patch, which replaces the current BUILD_BUG_ON implementation with Rusty's version.
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h@@ -677,18 +677,19 @@ 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 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 - aren't permitted). */ -#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) -#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); })) +#ifndef __OPTIMIZE__ +#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) +#else +/* If it's a constant, catch it at compile time, otherwise at link time. */ +extern int __build_bug_on_failed; +#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1) +#define BUILD_BUG_ON(condition) \ + do { \ + ((void)sizeof(char[1 - 2*!!(condition)])); \ + if (condition) __build_bug_on_failed = 1; \ + } while(0) +#define MAYBE_BUILD_BUG_ON(condition) BUILD_BUG_ON(condition) +#endif /* Trap pasters of __FUNCTION__ at compile-time */ #define __FUNCTION__ (__func__)
--
Hollis Blanchard
IBM Linux Technology Center