From: Mathieu Desnoyers Date: Tue, 15 Jun 2021 20:00:28 +0000 (-0400) Subject: Fix: x86 and s390: uatomic __hp() macro clang support X-Git-Tag: v0.12.3~5 X-Git-Url: http://git.lttng.org/?p=urcu.git;a=commitdiff_plain;h=839eaea560d6561f1cb947d959757786a54343cc Fix: x86 and s390: uatomic __hp() macro clang support The __hp macro should receive contant size arguments to support clang, which does not implement VLA support. Signed-off-by: Mathieu Desnoyers Change-Id: Ifa3d5b5b7921f54849e0f331bef8f07c059b998f --- diff --git a/include/urcu/uatomic/s390.h b/include/urcu/uatomic/s390.h index 47b97b1..d7d545a 100644 --- a/include/urcu/uatomic/s390.h +++ b/include/urcu/uatomic/s390.h @@ -62,10 +62,11 @@ extern "C" { #endif /* !COMPILER_HAVE_SHORT_MEM_OPERAND */ /* - * The __hp() macro casts the void pointer "x" to a pointer to a structure + * The __hp() macro casts the void pointer @x to a pointer to a structure * containing an array of char of the specified size. This allows passing the * @addr arguments of the following inline functions as "m" and "+m" operands - * to the assembly. + * to the assembly. The @size parameter should be a constant to support + * compilers such as clang which do not support VLA. */ #define __hp(size, x) ((struct { char v[size]; } *)(x)) @@ -83,8 +84,8 @@ unsigned long _uatomic_exchange(volatile void *addr, unsigned long val, int len) __asm__ __volatile__( "0: cs %0,%2," MEMOP_REF(%3) "\n" " brc 4,0b\n" - : "=&r" (old_val), MEMOP_OUT (__hp(len, addr)) - : "r" (val), MEMOP_IN (__hp(len, addr)) + : "=&r" (old_val), MEMOP_OUT (__hp(4, addr)) + : "r" (val), MEMOP_IN (__hp(4, addr)) : "memory", "cc"); return old_val; } @@ -96,8 +97,8 @@ unsigned long _uatomic_exchange(volatile void *addr, unsigned long val, int len) __asm__ __volatile__( "0: csg %0,%2," MEMOP_REF(%3) "\n" " brc 4,0b\n" - : "=&r" (old_val), MEMOP_OUT (__hp(len, addr)) - : "r" (val), MEMOP_IN (__hp(len, addr)) + : "=&r" (old_val), MEMOP_OUT (__hp(8, addr)) + : "r" (val), MEMOP_IN (__hp(8, addr)) : "memory", "cc"); return old_val; } @@ -127,8 +128,8 @@ unsigned long _uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( " cs %0,%2," MEMOP_REF(%3) "\n" - : "+r" (old_val), MEMOP_OUT (__hp(len, addr)) - : "r" (_new), MEMOP_IN (__hp(len, addr)) + : "+r" (old_val), MEMOP_OUT (__hp(4, addr)) + : "r" (_new), MEMOP_IN (__hp(4, addr)) : "memory", "cc"); return old_val; } @@ -137,8 +138,8 @@ unsigned long _uatomic_cmpxchg(void *addr, unsigned long old, { __asm__ __volatile__( " csg %0,%2," MEMOP_REF(%3) "\n" - : "+r" (old), MEMOP_OUT (__hp(len, addr)) - : "r" (_new), MEMOP_IN (__hp(len, addr)) + : "+r" (old), MEMOP_OUT (__hp(8, addr)) + : "r" (_new), MEMOP_IN (__hp(8, addr)) : "memory", "cc"); return old; } diff --git a/include/urcu/uatomic/x86.h b/include/urcu/uatomic/x86.h index 03a0b2f..cdb9aee 100644 --- a/include/urcu/uatomic/x86.h +++ b/include/urcu/uatomic/x86.h @@ -36,10 +36,11 @@ extern "C" { */ /* - * The __hp() macro casts the void pointer "x" to a pointer to a structure + * The __hp() macro casts the void pointer @x to a pointer to a structure * containing an array of char of the specified size. This allows passing the * @addr arguments of the following inline functions as "m" and "+m" operands - * to the assembly. + * to the assembly. The @size parameter should be a constant to support + * compilers such as clang which do not support VLA. */ #define __hp(size, x) ((struct { char v[size]; } *)(x)) @@ -59,7 +60,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgb %2, %1" - : "+a"(result), "+m"(*__hp(len, addr)) + : "+a"(result), "+m"(*__hp(1, addr)) : "q"((unsigned char)_new) : "memory"); return result; @@ -70,7 +71,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgw %2, %1" - : "+a"(result), "+m"(*__hp(len, addr)) + : "+a"(result), "+m"(*__hp(2, addr)) : "r"((unsigned short)_new) : "memory"); return result; @@ -81,7 +82,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgl %2, %1" - : "+a"(result), "+m"(*__hp(len, addr)) + : "+a"(result), "+m"(*__hp(4, addr)) : "r"((unsigned int)_new) : "memory"); return result; @@ -93,7 +94,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgq %2, %1" - : "+a"(result), "+m"(*__hp(len, addr)) + : "+a"(result), "+m"(*__hp(8, addr)) : "r"((unsigned long)_new) : "memory"); return result; @@ -126,7 +127,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned char result; __asm__ __volatile__( "xchgb %0, %1" - : "=q"(result), "+m"(*__hp(len, addr)) + : "=q"(result), "+m"(*__hp(1, addr)) : "0" ((unsigned char)val) : "memory"); return result; @@ -136,7 +137,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned short result; __asm__ __volatile__( "xchgw %0, %1" - : "=r"(result), "+m"(*__hp(len, addr)) + : "=r"(result), "+m"(*__hp(2, addr)) : "0" ((unsigned short)val) : "memory"); return result; @@ -146,7 +147,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned int result; __asm__ __volatile__( "xchgl %0, %1" - : "=r"(result), "+m"(*__hp(len, addr)) + : "=r"(result), "+m"(*__hp(4, addr)) : "0" ((unsigned int)val) : "memory"); return result; @@ -157,7 +158,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned long result; __asm__ __volatile__( "xchgq %0, %1" - : "=r"(result), "+m"(*__hp(len, addr)) + : "=r"(result), "+m"(*__hp(8, addr)) : "0" ((unsigned long)val) : "memory"); return result; @@ -190,7 +191,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddb %1, %0" - : "+m"(*__hp(len, addr)), "+q" (result) + : "+m"(*__hp(1, addr)), "+q" (result) : : "memory"); return result + (unsigned char)val; @@ -201,7 +202,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddw %1, %0" - : "+m"(*__hp(len, addr)), "+r" (result) + : "+m"(*__hp(2, addr)), "+r" (result) : : "memory"); return result + (unsigned short)val; @@ -212,7 +213,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddl %1, %0" - : "+m"(*__hp(len, addr)), "+r" (result) + : "+m"(*__hp(4, addr)), "+r" (result) : : "memory"); return result + (unsigned int)val; @@ -224,7 +225,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddq %1, %0" - : "+m"(*__hp(len, addr)), "+r" (result) + : "+m"(*__hp(8, addr)), "+r" (result) : : "memory"); return result + (unsigned long)val; @@ -254,7 +255,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andb %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(1, addr)) : "iq" ((unsigned char)val) : "memory"); return; @@ -263,7 +264,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andw %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(2, addr)) : "ir" ((unsigned short)val) : "memory"); return; @@ -272,7 +273,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andl %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(4, addr)) : "ir" ((unsigned int)val) : "memory"); return; @@ -282,7 +283,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andq %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(8, addr)) : "er" ((unsigned long)val) : "memory"); return; @@ -310,7 +311,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orb %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(1, addr)) : "iq" ((unsigned char)val) : "memory"); return; @@ -319,7 +320,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orw %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(2, addr)) : "ir" ((unsigned short)val) : "memory"); return; @@ -328,7 +329,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orl %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(4, addr)) : "ir" ((unsigned int)val) : "memory"); return; @@ -338,7 +339,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orq %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(8, addr)) : "er" ((unsigned long)val) : "memory"); return; @@ -366,7 +367,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addb %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(1, addr)) : "iq" ((unsigned char)val) : "memory"); return; @@ -375,7 +376,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addw %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(2, addr)) : "ir" ((unsigned short)val) : "memory"); return; @@ -384,7 +385,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addl %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(4, addr)) : "ir" ((unsigned int)val) : "memory"); return; @@ -394,7 +395,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addq %1, %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(8, addr)) : "er" ((unsigned long)val) : "memory"); return; @@ -423,7 +424,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incb %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(1, addr)) : : "memory"); return; @@ -432,7 +433,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incw %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(2, addr)) : : "memory"); return; @@ -441,7 +442,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incl %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(4, addr)) : : "memory"); return; @@ -451,7 +452,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incq %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(8, addr)) : : "memory"); return; @@ -476,7 +477,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decb %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(1, addr)) : : "memory"); return; @@ -485,7 +486,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decw %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(2, addr)) : : "memory"); return; @@ -494,7 +495,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decl %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(4, addr)) : : "memory"); return; @@ -504,7 +505,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decq %0" - : "=m"(*__hp(len, addr)) + : "=m"(*__hp(8, addr)) : : "memory"); return;