From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Daney Subject: Re: [PATCH v3 0/2] Stop some of the abuse of BUG() where compile time checks should be used. Date: Wed, 23 Nov 2011 16:37:56 -0800 Message-ID: <4ECD91E4.5090504@gmail.com> References: <1322092017-21471-1-git-send-email-ddaney.cavm@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mail-yw0-f46.google.com ([209.85.213.46]:52354 "EHLO mail-yw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752987Ab1KXAh7 (ORCPT ); Wed, 23 Nov 2011 19:37:59 -0500 In-Reply-To: Sender: linux-arch-owner@vger.kernel.org List-ID: To: Linus Torvalds Cc: David Daney , Andrew Morton , "ralf@linux-mips.org" , "linux-kernel@vger.kernel.org" , "linux-arch@vger.kernel.org" , David Rientjes , DM , David Howells , David Daney , "Pinski, Andrew" On 11/23/2011 03:57 PM, Linus Torvalds wrote: > Btw, would it possibly make sense to make the string more useful? > > For example using __FILE__ and __LINE__, or possibly letting the user > of the BUILD_BUG() give a string ("Using HMASK without > CONFIG_HUGEPAGE"). We thought about doing that, but without doing some complex preprocessor fu, the GCC attribute ((error())) thing doesn't do what we want. It appears that if more than a single instance of the construct is used in a compilation unit, the string emitted by the compiler for any of the violations will be the last string encountered. So if you did something like: . . . Line 99: BUILD_BUG("You failed on line 99"); . . . . Line 666: BUILD_BUG("You failed on line 666"); . . . The message emitted for a failure at line 99 would be "You failed on line 666". Which is probably worse than no message at all. It may be possible to do something like: #define _LINENAME_CONCAT( _name_, _line_ ) _name_##_line_ #define _LINENAME(_name_, _line_) _LINENAME_CONCAT(_name_,_line_) #define _BUILD_BUG(MSG,FUBAR) \ do { \ extern void FUBAR (void) \ __linktime_error("BUILD_BUG failed: " MSG); \ FUBAR (); \ } while (0) #define BUILD_BUG(M,A) _BUILD_BUG(M, _LINENAME(__build_bug_failed,__LINE__)) But it didn't seem worth it. > > Whatever. It's bikeshedding - what would probably be more important > would be to get this into linux-next so that we find out whether there > are any compile issues with it on other platforms or compiler > versions. > > Linus >