From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48887) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bWhHT-0000q3-Mh for qemu-devel@nongnu.org; Mon, 08 Aug 2016 05:55:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bWhHO-0000tt-Jd for qemu-devel@nongnu.org; Mon, 08 Aug 2016 05:55:35 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:36852) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bWhHO-0000te-99 for qemu-devel@nongnu.org; Mon, 08 Aug 2016 05:55:30 -0400 Received: by mail-wm0-x242.google.com with SMTP id x83so14354539wma.3 for ; Mon, 08 Aug 2016 02:55:30 -0700 (PDT) Sender: Paolo Bonzini References: <20160807014121.18739-1-bobby.prani@gmail.com> <31b8d7c7-6a5c-910f-b799-25a8e00c8908@redhat.com> From: Paolo Bonzini Message-ID: <561336e2-41b3-d2a8-600e-e777747cac62@redhat.com> Date: Mon, 8 Aug 2016 11:55:26 +0200 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/1] seqlock: Fix warning reg. incompatible cast List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Pranith Kumar , Richard Henderson , "Emilio G. Cota" , =?UTF-8?Q?Alex_Benn=c3=a9e?= , Sergey Fedorov , Markus Armbruster , "open list:All patches CC here" On 08/08/2016 11:27, Paolo Bonzini wrote: > > > On 08/08/2016 11:05, Paolo Bonzini wrote: >>>> /home/pranith/devops/code/qemu/include/qemu/seqlock.h:62:21: warning: passing 'typeof (*&sl->sequence) *' (aka 'const unsigned int *') to parameter of type 'unsigned int *' discards qualifier >>>> s [-Wincompatible-pointer-types-discards-qualifiers] >>>> return unlikely(atomic_read(&sl->sequence) != start); >>>> ^~~~~~~~~~~~~~~~~~~~~~~~~~ >>>> /home/pranith/devops/code/qemu/include/qemu/atomic.h:58:25: note: expanded from macro 'atomic_read' >>>> __atomic_load(ptr, &_val, __ATOMIC_RELAXED); \ >>>> ^~~~~ >>>> /home/pranith/devops/code/qemu/include/qemu/compiler.h:62:43: note: expanded from macro 'unlikely' >>>> #define unlikely(x) __builtin_expect(!!(x), 0) >>>> >>>> Signed-off-by: Pranith Kumar >> This is a compiler bug, isn't it? Atomic loads of a const pointer >> should be allowed. > > Oh, this is &_val having a const type. That makes more sense indeed, > but it should be worked around in qemu/atomic.h. > > Can you check if this works? Better: diff --git a/include/qemu/atomic.h b/include/qemu/atomic.h index 7e13fca..81cd33d 100644 --- a/include/qemu/atomic.h +++ b/include/qemu/atomic.h @@ -18,6 +18,26 @@ /* Compiler barrier */ #define barrier() ({ asm volatile("" ::: "memory"); (void)0; }) +#define typeof_strip_const(expr) \ + typeof( \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(typeof(expr), const short) || \ + __builtin_types_compatible_p(typeof(expr), short), \ + (short)1, \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(typeof(expr), const unsigned short) || \ + __builtin_types_compatible_p(typeof(expr), unsigned short), \ + (unsigned short)1, \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(typeof(expr), const char) || \ + __builtin_types_compatible_p(typeof(expr), char), \ + (char)1, \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(typeof(expr), const unsigned char) || \ + __builtin_types_compatible_p(typeof(expr), unsigned char), \ + (unsigned char)1, \ + expr+0))))) + #ifdef __ATOMIC_RELAXED /* For C11 atomic ops */ @@ -54,7 +74,7 @@ #define atomic_read(ptr) \ ({ \ QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \ - typeof(*ptr) _val; \ + typeof_strip_const(*ptr) _val; \ __atomic_load(ptr, &_val, __ATOMIC_RELAXED); \ _val; \ }) @@ -80,7 +100,7 @@ #define atomic_rcu_read(ptr) \ ({ \ QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \ - typeof(*ptr) _val; \ + typeof_strip_const(*ptr) _val; \ atomic_rcu_read__nocheck(ptr, &_val); \ _val; \ }) @@ -103,7 +123,7 @@ #define atomic_mb_read(ptr) \ ({ \ QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \ - typeof(*ptr) _val; \ + typeof_strip_const(*ptr) _val; \ __atomic_load(ptr, &_val, __ATOMIC_RELAXED); \ smp_rmb(); \ _val; \ @@ -120,7 +140,7 @@ #define atomic_mb_read(ptr) \ ({ \ QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \ - typeof(*ptr) _val; \ + typeof_strip_const(*ptr) _val; \ __atomic_load(ptr, &_val, __ATOMIC_SEQ_CST); \ _val; \ }) @@ -137,7 +157,7 @@ #define atomic_xchg(ptr, i) ({ \ QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \ - typeof(*ptr) _new = (i), _old; \ + typeof_strip_const(*ptr) _new = (i), _old; \ __atomic_exchange(ptr, &_new, &_old, __ATOMIC_SEQ_CST); \ _old; \ }) @@ -146,7 +166,7 @@ #define atomic_cmpxchg(ptr, old, new) \ ({ \ QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \ - typeof(*ptr) _old = (old), _new = (new); \ + typeof_strip_const(*ptr) _old = (old), _new = (new); \ __atomic_compare_exchange(ptr, &_old, &_new, false, \ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ _old; \ Paolo