On Mon, 21 Nov 2011 15:47:32 -0800 David Daney <ddaney.cavm@xxxxxxxxx> wrote: > Just to expand on this lovely topic... > > On 11/21/2011 02:43 PM, Linus Torvalds wrote: > > On Mon, Nov 21, 2011 at 2:23 PM, David Daney<ddaney.cavm@xxxxxxxxx> wrote: > >> > >> This whole comment strikes me as somewhat dishonest, as at the time David > >> Rientjes wrote it, he knew that there were dependencies on these symbols in > >> the linux-next tree. > >> > >> Now we can add these: > >> +#define HPAGE_SHIFT ({ BUG(); 0; }) > >> +#define HPAGE_SIZE ({ BUG(); 0; }) > >> +#define HPAGE_MASK ({ BUG(); 0; }) > > > > Hell no. > > > > We don't do run-time BUG() things. No way, no how. > > > > These symbols are on dead code paths, so they are eliminated by the > compiler's Dead Code Elimination (DCE) optimizations, and the BUG() code > never gets emitted to the final executable. > > I agree that it is not the best thing to do, but given the current state > of the art in build bug macros, it is the best we could have done. > > What I think we need instead, and for which I will send a patch soon, is > something like this: > > extern void you_are_screwed() __attribute__ ((error("BUILD_BUG_ON_USED > failed"))); > #define BUILD_BUG_ON_USED() you_are_screwed() > #define HPAGE_SHIFT ({ BUILD_BUG_ON_USED(); 0; }) > > This allows us to use the symbols in straight line C code without a ton > of ugly #ifdefery, but give us build time error checking. The way we usually handle that is to emit a call to a this_function_does_not_exist(), so it fails at link time. I guess we should do that to all those follow_hugetlb_page() and friends. gcc has had issues at times where it incorrectly emits references to this_function_does_not_exist(), but that hasn't happened in a couple of years as far as I know.