selftests/rseq: Use rseq_unqual_scalar_typeof in macros
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 27 Jun 2023 15:29:23 +0000 (11:29 -0400)
committerShuah Khan <skhan@linuxfoundation.org>
Tue, 8 Aug 2023 20:42:12 +0000 (14:42 -0600)
Use rseq_unqual_scalar_typeof() rather than typeof() in macros to remove
the volatile qualifier (if there is one in the input argument), thus
generating better assembly code in those scenarios.

Also add extra brackets around the "p" parameter in RSEQ_READ_ONCE(),
RSEQ_WRITE_ONCE(), and rseq_unqual_scalar_typeof() across architectures
to preserve expectations of operator priority. Here is an example that
shows how operator priority may be an issue with missing parentheses:

    #define m(p) \
    do { \
            __typeof__(*p) v = 0; \
    } while (0)

    void fct(unsigned long long *p1)
    {
            m(p1 + 1);      /* works */
            m(1 + p1);      /* broken */
    }

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/testing/selftests/rseq/rseq-arm.h
tools/testing/selftests/rseq/rseq-mips.h
tools/testing/selftests/rseq/rseq-ppc.h
tools/testing/selftests/rseq/rseq-riscv.h
tools/testing/selftests/rseq/rseq-s390.h
tools/testing/selftests/rseq/rseq-x86.h

index 8414fc3eac1526d5d4c33a93d2d988eb5c59e77b..d887b3bbe257edf394341561e7af48b3f197877f 100644 (file)
@@ -66,7 +66,7 @@
 
 #define rseq_smp_load_acquire(p)                                       \
 __extension__ ({                                                       \
-       __typeof(*p) ____p1 = RSEQ_READ_ONCE(*p);                       \
+       rseq_unqual_scalar_typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));  \
        rseq_smp_mb();                                                  \
        ____p1;                                                         \
 })
@@ -76,7 +76,7 @@ __extension__ ({                                                      \
 #define rseq_smp_store_release(p, v)                                   \
 do {                                                                   \
        rseq_smp_mb();                                                  \
-       RSEQ_WRITE_ONCE(*p, v);                                         \
+       RSEQ_WRITE_ONCE(*(p), v);                                       \
 } while (0)
 
 #define __RSEQ_ASM_DEFINE_TABLE(label, version, flags, start_ip,       \
index 50b950cf95855e893c053a828c39c4dd3a15a243..42ef8e946693f139ba9c8f8a7f86eb30412759f6 100644 (file)
@@ -45,7 +45,7 @@
 
 #define rseq_smp_load_acquire(p)                                       \
 __extension__ ({                                                       \
-       __typeof(*p) ____p1 = RSEQ_READ_ONCE(*p);                       \
+       rseq_unqual_scalar_typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));  \
        rseq_smp_mb();                                                  \
        ____p1;                                                         \
 })
@@ -55,7 +55,7 @@ __extension__ ({                                                      \
 #define rseq_smp_store_release(p, v)                                   \
 do {                                                                   \
        rseq_smp_mb();                                                  \
-       RSEQ_WRITE_ONCE(*p, v);                                         \
+       RSEQ_WRITE_ONCE(*(p), v);                                       \
 } while (0)
 
 #if _MIPS_SZLONG == 64
index dc9190facee99268daa5ef6afa3364a25fe3754e..57b16059718997f2a8888e6ceb20aad037e4eb9f 100644 (file)
@@ -23,7 +23,7 @@
 
 #define rseq_smp_load_acquire(p)                                       \
 __extension__ ({                                                       \
-       __typeof(*p) ____p1 = RSEQ_READ_ONCE(*p);                       \
+       rseq_unqual_scalar_typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));  \
        rseq_smp_lwsync();                                              \
        ____p1;                                                         \
 })
@@ -33,7 +33,7 @@ __extension__ ({                                                      \
 #define rseq_smp_store_release(p, v)                                   \
 do {                                                                   \
        rseq_smp_lwsync();                                              \
-       RSEQ_WRITE_ONCE(*p, v);                                         \
+       RSEQ_WRITE_ONCE(*(p), v);                                       \
 } while (0)
 
 /*
index 17932a79e066eb0d55f3e1c9bc903a1f5aba54ef..37e598d0a365e2701249ceff2b742ed3408161e1 100644 (file)
@@ -36,8 +36,8 @@
 
 #define rseq_smp_load_acquire(p)                                       \
 __extension__ ({                                                       \
-       __typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));                   \
-       RISCV_FENCE(r, rw)                                              \
+       rseq_unqual_scalar_typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));  \
+       RISCV_FENCE(r, rw);                                             \
        ____p1;                                                         \
 })
 
@@ -46,7 +46,7 @@ __extension__ ({                                                      \
 #define rseq_smp_store_release(p, v)                                   \
 do {                                                                   \
        RISCV_FENCE(rw, w);                                             \
-       RSEQ_WRITE_ONCE(*(p), v);                                               \
+       RSEQ_WRITE_ONCE(*(p), v);                                       \
 } while (0)
 
 #define __RSEQ_ASM_DEFINE_TABLE(label, version, flags, start_ip,       \
index 46c92598acc7c007f6cb3c857409b76299e19e08..33baaa9f99979fb66555fcee147d194209e229ce 100644 (file)
@@ -15,7 +15,7 @@
 
 #define rseq_smp_load_acquire(p)                                       \
 __extension__ ({                                                       \
-       __typeof(*p) ____p1 = RSEQ_READ_ONCE(*p);                       \
+       rseq_unqual_scalar_typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));  \
        rseq_barrier();                                                 \
        ____p1;                                                         \
 })
@@ -25,7 +25,7 @@ __extension__ ({                                                      \
 #define rseq_smp_store_release(p, v)                                   \
 do {                                                                   \
        rseq_barrier();                                                 \
-       RSEQ_WRITE_ONCE(*p, v);                                         \
+       RSEQ_WRITE_ONCE(*(p), v);                                       \
 } while (0)
 
 #ifdef __s390x__
index fb65ef54b0fbc977fc1cc5371aa94083d0a5f081..a2aa428ba151b8eec5b4444278c0c6e32e1e7f9b 100644 (file)
@@ -42,7 +42,7 @@
 
 #define rseq_smp_load_acquire(p)                                       \
 __extension__ ({                                                       \
-       __typeof(*p) ____p1 = RSEQ_READ_ONCE(*p);                       \
+       rseq_unqual_scalar_typeof(*(p)) ____p1 = RSEQ_READ_ONCE(*(p));  \
        rseq_barrier();                                                 \
        ____p1;                                                         \
 })
@@ -52,7 +52,7 @@ __extension__ ({                                                      \
 #define rseq_smp_store_release(p, v)                                   \
 do {                                                                   \
        rseq_barrier();                                                 \
-       RSEQ_WRITE_ONCE(*p, v);                                         \
+       RSEQ_WRITE_ONCE(*(p), v);                                       \
 } while (0)
 
 #define __RSEQ_ASM_DEFINE_TABLE(label, version, flags,                 \