Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753827AbdHXQpX (ORCPT ); Thu, 24 Aug 2017 12:45:23 -0400 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:60037 "EHLO relay5-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753470AbdHXQpW (ORCPT ); Thu, 24 Aug 2017 12:45:22 -0400 X-Originating-IP: 208.91.1.34 From: Joe Stringer To: linux-kernel@vger.kernel.org Cc: Ian Abbott , Arnd Bergmann , Michal Nazarewicz , Kees Cook Subject: [PATCH net-next] compiler: Document behavior compiling with -O0 Date: Thu, 24 Aug 2017 09:45:06 -0700 Message-Id: <20170824164506.9108-1-joe@ovn.org> X-Mailer: git-send-email 2.14.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2359 Lines: 51 Recent changes[0] to make use of __compiletime_assert() from container_of() increased the scope of this macro, resulting in a wider set of situations where developers cannot compile their code using "-O0". I noticed this when making use of the macro in my own development, and spent more time than I'd like to admit tracking the problem down. This patch documents the behavior in lieu of a compile-time assertion implementation that does not rely on optimizations. Example compilation failure: ./include/linux/compiler.h:547:38: error: call to ‘__compiletime_assert_94’ declared with attribute error: pointer type mismatch in container_of() _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^ ./include/linux/compiler.h:530:4: note: in definition of macro ‘__compiletime_assert’ prefix ## suffix(); \ ^~~~~~ ./include/linux/compiler.h:547:2: note: in expansion of macro ‘_compiletime_assert’ _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) ^~~~~~~~~~~~~~~~~~~ ./include/linux/build_bug.h:46:37: note: in expansion of macro ‘compiletime_assert’ #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^~~~~~~~~~~~~~~~~~ ./include/linux/kernel.h:860:2: note: in expansion of macro ‘BUILD_BUG_ON_MSG’ BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^~~~~~~~~~~~~~~~ [0] http://lkml.kernel.org/r/20170525120316.24473-7-abbotti@mev.co.uk Signed-off-by: Joe Stringer --- include/linux/compiler.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/linux/compiler.h b/include/linux/compiler.h index eca8ad75e28b..bb640167fdac 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -517,6 +517,11 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s # define __compiletime_error_fallback(condition) do { } while (0) #endif +/* + * __compiletime_assert() relies on compiler optimizations to remove the check + * against '__cond' if 'condition' is false. As a result, compiling with -O0 + * will cause compilation errors here regardless of the value of 'condition'. + */ #define __compiletime_assert(condition, msg, prefix, suffix) \ do { \ bool __cond = !(condition); \ -- 2.14.1