On 21/8/26 12:49, Philippe Mathieu-Daudé wrote:
From: Philippe Mathieu-Daudé <[email protected]>

Use _Generic() controlling-expression to add the const-qualified
variants of cpu_env(), env_cpu() and env_archcpu(). This allows to
safely access CPU architecture state when it should not be modified.

Alias env_cpu_const() which is still used.

Suggested-by: Richard Henderson <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
Reviewed-by: Richard Henderson <[email protected]>
---
Following checkpatch.pl errors ignored:

   ERROR: spaces required around that ':' (ctx:VxE)
   #46: FILE: include/exec/cpu-common.h:89:
   +            CPUArchState: \
                            ^
   ERROR: spaces required around that ':' (ctx:VxE)
   #62: FILE: include/exec/cpu-common.h:101:
   +            CPUArchState: \
                            ^
   ERROR: spaces required around that ':' (ctx:VxE)
   #90: FILE: include/hw/core/cpu.h:605:
   +        CPUState: \
                    ^
   total: 3 errors, 0 warnings, 64 lines checked
---
  include/exec/cpu-common.h | 30 +++++++++++-------------------
  include/hw/core/cpu.h     | 17 ++++++++++++-----
  2 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
index 6594f7fa1be..bffef677607 100644
--- a/include/exec/cpu-common.h
+++ b/include/exec/cpu-common.h
@@ -85,21 +85,11 @@ static inline bool cpu_loop_exit_requested(const CPUState 
*cpu)
   *
   * Return the ArchCPU associated with the environment.
   */
-static inline ArchCPU *env_archcpu(CPUArchState *env)
-{
-    return (void *)env - sizeof(CPUState);
-}
-
-/**
- * env_cpu_const(env)
- * @env: The architecture environment
- *
- * Return the CPUState associated with the environment.
- */
-static inline const CPUState *env_cpu_const(const CPUArchState *env)
-{
-    return (void *)env - sizeof(CPUState);
-}
+#define env_archcpu(env) _Generic(*(env), \
+            CPUArchState: \
+                (ArchCPU *)((void *)env - sizeof(CPUState)), \
+            const CPUArchState: \
+                (const ArchCPU *)((const void *)env - sizeof(CPUState)))
I was testing with a C17-ready compiler. Apparently C11 is ambiguous in
how it treats qualifiers inside _Generic:

../../target/arm/internals.h:1777:25: warning: due to lvalue conversion of the controlling expression, association of type 'const CPUArchState' (aka 'const struct CPUArchState') will never be selected because it is qualified [-Wunreachable-code-generic-assoc]
 1777 |     const ARMCPU *cpu = env_archcpu(env);
      |                         ^
include/exec/cpu-common.h:91:19: note: expanded from macro 'env_archcpu'
   91 |             const CPUArchState: \
      |                   ^

Using typeof() makes it happier:

-- >8 --
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
index d67d008236f..e3a5e40899f 100644
--- a/include/exec/cpu-common.h
+++ b/include/exec/cpu-common.h
@@ -87,6 +87,6 @@ static inline bool cpu_loop_exit_requested(const CPUState *cpu)
  */
-#define env_archcpu(env) _Generic(*(env), \
-            CPUArchState: \
+#define env_archcpu(env) _Generic(typeof(*env), \
+            typeof(CPUArchState): \
                 (ArchCPU *)((void *)env - sizeof(CPUState)), \
-            const CPUArchState: \
+            typeof(const CPUArchState): \
                 (const ArchCPU *)((const void *)env - sizeof(CPUState)))
@@ -99,6 +99,6 @@ static inline bool cpu_loop_exit_requested(const CPUState *cpu)
  */
-#define env_cpu(env) _Generic(*(env), \
-            CPUArchState: \
+#define env_cpu(env) _Generic(typeof(*env), \
+            typeof(CPUArchState): \
                 (CPUState *)((void *)env - sizeof(CPUState)), \
-            const CPUArchState: \
+            typeof(const CPUArchState): \
                 (const CPUState *)((const void *)env - sizeof(CPUState)))
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 372485a2e54..ee522e1e705 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -602,7 +602,7 @@ QEMU_BUILD_BUG_ON(offsetof(CPUState, neg) !=
  */
-#define cpu_env(cpu) _Generic(*(cpu), \
+#define cpu_env(cpu) _Generic(typeof(*cpu), \
/* We validate that CPUArchState follows CPUState in cpu-target.c */ \
-        CPUState: \
+        typeof(CPUState): \
             (CPUArchState *)(cpu + 1), \
-        const CPUState: \
+        typeof(const CPUState): \
             (const CPUArchState *)(cpu + 1))
---

Reply via email to