On 1/8/26 9:53 PM, Philippe Mathieu-Daudé wrote:
On 8/1/26 19:57, Pierrick Bouvier wrote:
On 1/8/26 8:36 AM, Philippe Mathieu-Daudé wrote:
Get the base arch_mask from the current SysEmuTarget,
making qemu_arch_available() target-agnostic.

We don't need the per-target QEMU_ARCH definition anymore,
remove it.

Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
v3: Return directly within switch
v2: Prefer switch over array (pbo)
---
   meson.build        |  2 --
   system/arch_init.c | 30 -----------------------
   target-info.c      | 60 ++++++++++++++++++++++++++++++++++++++++++++++
   system/meson.build |  1 -
   4 files changed, 60 insertions(+), 33 deletions(-)
   delete mode 100644 system/arch_init.c

diff --git a/meson.build b/meson.build
index 734c801cc77..435dc6e3c8e 100644
--- a/meson.build
+++ b/meson.build
@@ -3419,8 +3419,6 @@ foreach target : target_dirs
         config_target_data.set(k, v)
       endif
     endforeach
-  config_target_data.set('QEMU_ARCH',
-                         'QEMU_ARCH_' +
config_target['TARGET_BASE_ARCH'].to_upper())
     config_target_h += {target: configure_file(output: target + '-
config-target.h',
                                                  configuration:
config_target_data)}
diff --git a/system/arch_init.c b/system/arch_init.c
deleted file mode 100644
index e85736884c9..00000000000
--- a/system/arch_init.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * QEMU System Emulator
- *
- * Copyright (c) 2003-2008 Fabrice Bellard
- *
- * Permission is hereby granted, free of charge, to any person
obtaining a copy
- * of this software and associated documentation files (the
"Software"), to deal
- * in the Software without restriction, including without limitation
the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/
or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN
- * THE SOFTWARE.
- */
-#include "qemu/osdep.h"
-#include "system/arch_init.h"
-
-bool qemu_arch_available(unsigned qemu_arch_mask)
-{
-    return qemu_arch_mask & QEMU_ARCH;
-}
diff --git a/target-info.c b/target-info.c
index 24696ff4111..774fdcd2c46 100644
--- a/target-info.c
+++ b/target-info.c
@@ -11,6 +11,7 @@
   #include "qemu/target-info-qapi.h"
   #include "qemu/target-info-impl.h"
   #include "qapi/error.h"
+#include "system/arch_init.h"
   const char *target_name(void)
   {
@@ -33,6 +34,65 @@ SysEmuTarget target_arch(void)
       return arch;
   }
+bool qemu_arch_available(unsigned qemu_arch_mask)
+{
+    switch (target_arch()) {
+    case SYS_EMU_TARGET_ALPHA:
+        return qemu_arch_mask & QEMU_ARCH_ALPHA;
+    case SYS_EMU_TARGET_ARM:
+    case SYS_EMU_TARGET_AARCH64:
+        return qemu_arch_mask & QEMU_ARCH_ARM;
+    case SYS_EMU_TARGET_I386:
+    case SYS_EMU_TARGET_X86_64:
+        return qemu_arch_mask & QEMU_ARCH_I386;
+    case SYS_EMU_TARGET_M68K:
+        return qemu_arch_mask & QEMU_ARCH_M68K;
+    case SYS_EMU_TARGET_MICROBLAZE:
+    case SYS_EMU_TARGET_MICROBLAZEEL:
+        return qemu_arch_mask & QEMU_ARCH_MICROBLAZE;
+    case SYS_EMU_TARGET_MIPS:
+    case SYS_EMU_TARGET_MIPSEL:
+    case SYS_EMU_TARGET_MIPS64:
+    case SYS_EMU_TARGET_MIPS64EL:
+        return qemu_arch_mask & QEMU_ARCH_MIPS;
+    case SYS_EMU_TARGET_PPC:
+    case SYS_EMU_TARGET_PPC64:
+        return qemu_arch_mask & QEMU_ARCH_PPC;
+    case SYS_EMU_TARGET_S390X:
+        return qemu_arch_mask & QEMU_ARCH_S390X;
+    case SYS_EMU_TARGET_SH4:
+    case SYS_EMU_TARGET_SH4EB:
+        return qemu_arch_mask & QEMU_ARCH_SH4;
+    case SYS_EMU_TARGET_SPARC:
+    case SYS_EMU_TARGET_SPARC64:
+        return qemu_arch_mask & QEMU_ARCH_SPARC;
+    case SYS_EMU_TARGET_XTENSA:
+    case SYS_EMU_TARGET_XTENSAEB:
+        return qemu_arch_mask & QEMU_ARCH_XTENSA;
+    case SYS_EMU_TARGET_OR1K:
+        return qemu_arch_mask & QEMU_ARCH_OPENRISC;
+    case SYS_EMU_TARGET_TRICORE:
+        return qemu_arch_mask & QEMU_ARCH_TRICORE;
+    case SYS_EMU_TARGET_HPPA:
+        return qemu_arch_mask & QEMU_ARCH_HPPA;
+    case SYS_EMU_TARGET_RISCV32:
+    case SYS_EMU_TARGET_RISCV64:
+        return qemu_arch_mask & QEMU_ARCH_RISCV;
+    case SYS_EMU_TARGET_RX:
+        return qemu_arch_mask & QEMU_ARCH_RX;
+    case SYS_EMU_TARGET_AVR:
+        return qemu_arch_mask & QEMU_ARCH_AVR;
+    /*
+    case SYS_EMU_TARGET_HEXAGON:
+        return qemu_arch_mask & QEMU_ARCH_HEXAGON;
+    */
+    case SYS_EMU_TARGET_LOONGARCH64:
+        return qemu_arch_mask & QEMU_ARCH_LOONGARCH;
+    default:
+        g_assert_not_reached();

Per explaination on previous version, would be more interesting to have
SYS_EMU_TARGET__MAX instead of default here, so compilation will be
blocked when enum is extended.

How compilation can be blocked without using -Wswitch?


See my previous answer on v1, -Wswitch is used:

Reading the thread above, the only mention I find is the 3rd commit that
precisely change definition because -Wswitch is enabled with clang.
And it's not only a clang thing, gcc has it in Wall also [1].

I don't mind the array approach, but maybe just add a *static* assert
making sure (SYS_EMU_TARGET__MAX-1 == SYS_EMU_TARGET_XTENSAEB) so this
file will break as soon as there is a new target added. It's simple and
the next developer who won't have to debug this will thank you.

[1] https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Warning-Options.html

Reviewed-by: Pierrick Bouvier <[email protected]>

+    };
+}
+
   const char *target_cpu_type(void)
   {
       return target_info()->cpu_type;
diff --git a/system/meson.build b/system/meson.build
index 4b69ef0f5fb..66e16db55ce 100644
--- a/system/meson.build
+++ b/system/meson.build
@@ -1,5 +1,4 @@
   specific_ss.add(when: 'CONFIG_SYSTEM_ONLY', if_true: [files(
-  'arch_init.c',
     'globals-target.c',
   )])




Reply via email to