Re: 2.4.x: i386/x86_64 bitops clobberings

From: Jan Kiszka
Date: Mon Oct 09 2006 - 02:29:14 EST


Willy Tarreau wrote:
> I've done it too, but unfortunately, I discovered that it does not build
> with gcc-2.95 anymore, while 3.3 is fine :
>
> cyclades.c: In function `cyy_interrupt':
> /usr/src/git/linux-2.4/include/asm/bitops.h:130: inconsistent operand constraints in an `asm'
> cyclades.c: In function `cyz_handle_rx':
> /usr/src/git/linux-2.4/include/asm/bitops.h:130: inconsistent operand constraints in an `asm'
>
> 127 __asm__ __volatile__( LOCK_PREFIX
> 128 "btsl %2,%1\n\tsbbl %0,%0"
> 129 :"=r" (oldbit),"+m" (ADDR)
> 130 :"Ir" (nr) : "memory");
>
>
> I don't know what the right solution should be. I'm not fond of #ifdefs,
> and I'm embarrassed to know that gcc can do all sorts of nasty things due
> to a wrong clobbering :-/
>
> If you have any idea on the subject, I'm willing to try.

What about

#if __GNUC__ < 3
#define ADDR_DEPS "=m"
#else
#define ADDR_DEPS "+m"
#endif

__asm__ __volatile__( LOCK_PREFIX
"btsl %2,%1\n\tsbbl %0,%0"
:"=r" (oldbit),ADDR_DEPS (ADDR)
:"Ir" (nr) : "memory");

or something similar? Would keep the number of #ifs low.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature