public inbox for linuxppc-dev@ozlabs.org 
 help / color / mirror / Atom feed
From: Michael Ellerman <michael@ellerman•id.au>
To: Paul Mackerras <paulus@samba•org>, <linuxppc-dev@ozlabs•org>
Subject: [RFC/PATCH] powerpc: Make BUG_ON & WARN_ON play nice with compile-time optimisations
Date: Tue, 21 Mar 2006 16:51:29 +1100	[thread overview]
Message-ID: <20060321055203.EF12167A39@ozlabs.org> (raw)
In-Reply-To: <200603211445.32454.michael@ellerman.id.au>

Although we could do this. It relys on firmware_has_feature() being a macro,
but perhaps that's ok. This isn't exactly ideal, as it encourages us to use
macros where we could otherwise use static inlines, but perhaps it's ok.

Given this:

void test(void)
{
       constant_false();
       BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES));

       constant_true();
       BUG_ON(!firmware_has_feature(FW_FEATURE_ISERIES));

       non_constant();
       BUG_ON(firmware_has_feature(FW_FEATURE_SPLPAR));

       constant_false();
       WARN_ON(firmware_has_feature(FW_FEATURE_ISERIES));

       constant_true();
       WARN_ON(!firmware_has_feature(FW_FEATURE_ISERIES));

       non_constant();
       WARN_ON(firmware_has_feature(FW_FEATURE_SPLPAR));
}

I get assembly like so, which looks good to me:

        bl .constant_false
        bl .constant_true
        1:      twi 31,0,0
.section __bug_table,"a"
        .llong  1b,400,.LC12,__func__.21353
.previous
        bl .non_constant
        ld 9,.LC13@toc(2)
        ld 0,0(9)
        rldicl 0,0,44,63
        1:      tdnei   0,0
.section __bug_table,"a"
        .llong  1b,403,.LC12,__func__.21353
.previous
        bl .constant_false
        bl .constant_true
        1:      twi 31,0,0
.section __bug_table,"a"
        .llong  1b,16777625,.LC12,__func__.21353
.previous
        bl .non_constant
        ld 9,.LC13@toc(2)
        ld 0,0(9)
        rldicl 0,0,44,63
        1:      tdnei   0,0
.section __bug_table,"a"
        .llong  1b,16777628,.LC12,__func__.21353
.previous



 include/asm-powerpc/bug.h      |   24 ++++++++++++++++++++++--
 include/asm-powerpc/firmware.h |    8 +++-----
 2 files changed, 25 insertions(+), 7 deletions(-)

Index: to-merge/include/asm-powerpc/bug.h
===================================================================
--- to-merge.orig/include/asm-powerpc/bug.h
+++ to-merge/include/asm-powerpc/bug.h
@@ -40,17 +40,36 @@ struct bug_entry *find_bug(unsigned long
 } while (0)
 
 #define BUG_ON(x) do {						\
-	__asm__ __volatile__(					\
+	if (__builtin_constant_p(x)) {				\
+		if (x)						\
+			BUG();					\
+	} else {						\
+		__asm__ __volatile__(				\
 		"1:	"PPC_TLNEI"	%0,0\n"			\
 		".section __bug_table,\"a\"\n"			\
 		"\t"PPC_LONG"	1b,%1,%2,%3\n"		\
 		".previous"					\
 		: : "r" ((long)(x)), "i" (__LINE__),		\
 		    "i" (__FILE__), "i" (__FUNCTION__));	\
+	}							\
 } while (0)
 
-#define WARN_ON(x) do {						\
+#define WARN() do {						\
 	__asm__ __volatile__(					\
+		"1:	twi 31,0,0\n"				\
+		".section __bug_table,\"a\"\n"			\
+		"\t"PPC_LONG"	1b,%0,%1,%2\n"			\
+		".previous"					\
+		: : "i" (__LINE__ + BUG_WARNING_TRAP),		\
+		    "i" (__FILE__), "i" (__FUNCTION__));	\
+} while (0)
+
+#define WARN_ON(x) do {						\
+	if (__builtin_constant_p(x)) {				\
+		if (x)						\
+			WARN();					\
+	} else {						\
+		__asm__ __volatile__(				\
 		"1:	"PPC_TLNEI"	%0,0\n"			\
 		".section __bug_table,\"a\"\n"			\
 		"\t"PPC_LONG"	1b,%1,%2,%3\n"		\
@@ -58,6 +77,7 @@ struct bug_entry *find_bug(unsigned long
 		: : "r" ((long)(x)),				\
 		    "i" (__LINE__ + BUG_WARNING_TRAP),		\
 		    "i" (__FILE__), "i" (__FUNCTION__));	\
+	}							\
 } while (0)
 
 #define HAVE_ARCH_BUG
Index: to-merge/include/asm-powerpc/firmware.h
===================================================================
--- to-merge.orig/include/asm-powerpc/firmware.h
+++ to-merge/include/asm-powerpc/firmware.h
@@ -83,11 +83,9 @@ enum {
  */
 extern unsigned long	ppc64_firmware_features;
 
-static inline unsigned long firmware_has_feature(unsigned long feature)
-{
-	return (FW_FEATURE_ALWAYS & feature) ||
-		(FW_FEATURE_POSSIBLE & ppc64_firmware_features & feature);
-}
+#define firmware_has_feature(feature)					\
+	((FW_FEATURE_ALWAYS & (feature)) ||				\
+		(FW_FEATURE_POSSIBLE & ppc64_firmware_features & (feature)))
 
 extern void system_reset_fwnmi(void);
 extern void machine_check_fwnmi(void);

  reply	other threads:[~2006-03-21  5:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20060207052220.917C668A92@ozlabs.org>
2006-03-21  3:45 ` [PATCH] powerpc: Make BUG_ON & WARN_ON play nice with compile-time optimisations Michael Ellerman
2006-03-21  5:51   ` Michael Ellerman [this message]
2006-03-22  0:16     ` [RFC/PATCH] " Stephen Rothwell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060321055203.EF12167A39@ozlabs.org \
    --to=michael@ellerman$(echo .)id.au \
    --cc=linuxppc-dev@ozlabs$(echo .)org \
    --cc=paulus@samba$(echo .)org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox