On 2/4/26 05:41, Pierrick Bouvier wrote:
target_arch() function will reparse target_name() every time if it was
not set to a proper SYS_EMU_TARGET_* value (when using
target-info-stub.c), which is not efficient.
Since we want to preserve the constness of TargetInfo but C doesn't give
us flexible compile time expressions, we simply set target_arch using a
static constructor once instead.
A static constructor isn't static initialization.
That said, we can do better with some extra help from meson; see attached.
I'm mildly annoyed with openrisc vs or1k. We really ought to fix that, but I haven't
looked into what API breakage we get from selecting one or the other.
r~
diff --git a/target-info-stub.c b/target-info-stub.c
index 8392d81e8f..65220cc782 100644
--- a/target-info-stub.c
+++ b/target-info-stub.c
@@ -18,7 +18,7 @@ QEMU_BUILD_BUG_ON(offsetof(ArchCPU, env) != sizeof(CPUState));
static const TargetInfo target_info_stub = {
.target_name = TARGET_NAME,
- .target_arch = SYS_EMU_TARGET__MAX,
+ .target_arch = glue(SYS_EMU_TARGET_, TARGET_ARCH),
.long_bits = TARGET_LONG_BITS,
.cpu_type = CPU_RESOLVING_TYPE,
.machine_typename = TYPE_MACHINE,
diff --git a/target-info.c b/target-info.c
index 5a6d728252..a26532f660 100644
--- a/target-info.c
+++ b/target-info.c
@@ -24,13 +24,7 @@ unsigned target_long_bits(void)
SysEmuTarget target_arch(void)
{
- SysEmuTarget arch = target_info()->target_arch;
-
- if (arch == SYS_EMU_TARGET__MAX) {
- arch = qapi_enum_parse(&SysEmuTarget_lookup, target_name(), -1,
- &error_abort);
- }
- return arch;
+ return target_info()->target_arch;
}
const char *target_cpu_type(void)
diff --git a/meson.build b/meson.build
index 8c6c0a9a32..35772e1578 100644
--- a/meson.build
+++ b/meson.build
@@ -3263,7 +3263,7 @@ host_kconfig = \
(hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
(have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
-ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
+ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR' ]
default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
actual_target_dirs = []
@@ -3353,6 +3353,13 @@ foreach target : target_dirs
# do nothing
elif ignored.contains(k)
# do nothing
+ elif k == 'TARGET_ARCH'
+ # FIXME: standardize on either or1k or openrisc everywhere
+ # This usage is concerned with pasting into SYS_EMU_TARGET_*.
+ if v == 'openrisc'
+ v = 'or1k'
+ endif
+ config_target_data.set(k, v.to_upper())
elif k == 'TARGET_BASE_ARCH'
# Note that TARGET_BASE_ARCH ends up in config-target.h but it is
# not used to select files from sourcesets.
diff --git a/qapi/machine.json b/qapi/machine.json
index 907cb25f75..ef8575b6eb 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -28,6 +28,8 @@
#
# @loongarch64: since 7.1
#
+# @hexagon: since 11.0
+#
# .. note:: The resulting QMP strings can be appended to the
# "qemu-system-" prefix to produce the corresponding QEMU
# executable name. This is true even for "qemu-system-x86_64".
@@ -35,7 +37,7 @@
# Since: 3.0
##
{ 'enum' : 'SysEmuTarget',
- 'data' : [ 'aarch64', 'alpha', 'arm', 'avr', 'hppa', 'i386',
+ 'data' : [ 'aarch64', 'alpha', 'arm', 'avr', 'hexagon', 'hppa', 'i386',
'loongarch64', 'm68k', 'microblaze', 'microblazeel', 'mips', 'mips64',
'mips64el', 'mipsel', 'or1k', 'ppc',
'ppc64', 'riscv32', 'riscv64', 'rx', 's390x', 'sh4',