Re: [PATCH] Adjust arch/powerpc inline asms for recent gcc change
From: Jakub Jelinek <hidden>
Date: 2010-07-30 07:16:54
On Fri, Jul 30, 2010 at 05:04:46PM +1000, Benjamin Herrenschmidt wrote:
On Thu, 2010-07-08 at 16:08 +1000, Benjamin Herrenschmidt wrote:quoted
On Fri, 2010-06-25 at 11:56 +0200, Jakub Jelinek wrote:quoted
static inline void sync(void)diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h index b8f152e..288d8b2 100644 --- a/arch/powerpc/include/asm/atomic.h +++ b/arch/powerpc/include/asm/atomic.h@@ -19,14 +19,14 @@ static __inline__ int atomic_read(const atomic_t *v) { int t; - __asm__ __volatile__("lwz%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter)); + __asm__ __volatile__("lwz%U1%X1 %0,%1" : "=r"(t) : "m<>"(v->counter)); return t; }This gives me: /home/benh/linux-powerpc-test/arch/powerpc/kernel/time.c: In function ‘timer_interrupt’: /home/benh/linux-powerpc-test/arch/powerpc/include/asm/atomic.h:22: error: ‘asm’ operand has impossible constraints make[2]: *** [arch/powerpc/kernel/time.o] Error 1 $ gcc --version gcc (Debian 4.4.4-1) 4.4.4Ping :-) Do that mean that 4.4.4 doesn't understand your new constraints or are we doing something incorrect ?
The constraints weren't new, so in theory everything would work fine. Except because < and > were so rarely used on many targets before, there were backend bugs on PowerPC and SPARC at least related to that. See http://gcc.gnu.org/PR44707 http://gcc.gnu.org/PR44701 http://gcc.gnu.org/PR44492 So, in short, I'm afraid "m<>" needs to be used only for GCC 4.6+ (and, vendors which backported the inline-asm handling changes to their older gcc would need to adjust for their gccs too). When "m<>" isn't used, it just leads to potential code pessimization in inline-asms that are prepared for handling side-effects. Jakub