On 4/21/25 23:04, Markus Armbruster wrote:
Pierrick Bouvier <pierrick.bouv...@linaro.org> writes:

[...]

At this point, I would like to focus on having a first version of TargetInfo 
API, and not reviewing any other changes, as things may be modified, and they 
would need to be reviewed again. It's hard to follow the same abstraction done 
multiple times in multiple series.

Regarding your proposal for target_system_arch(), I understand that you tried 
to reuse the existing SysEmuTarget, which was a good intention.
However, I don't think we should use any string compare for this (which 
qemu_api_parse does). It has several flaws:

qemu_api_parse()?  Do you mean qapi_enum_parse()?


Yes, sorry for the typo.

- The most important one: it can fail (what if -1 is returned?). Enums can be 
guaranteed and exhaustive at compile time.
- It's slower than having the current arch directly known at compile time.
As well, since SysEmuTarget is a generated enum, it makes it much harder to 
follow code IMHO.
QAPI requires those things to be defined from a json file for external usage, 
but it's not a good reason for being forced to use it in all the codebase as 
the only possible abstraction.

To have something fast and infallible, we can adopt this solution:

In target_info.h:

/* Named TargetArch to not clash with poisoned TARGET_X */
typedef enum TargetArch {
     TARGET_ARCH_AARCH64,
     TARGET_ARCH_ALPHA,
     TARGET_ARCH_ARM,
     TARGET_ARCH_AVR,
     TARGET_ARCH_HPPA,
     TARGET_ARCH_I386,
     TARGET_ARCH_LOONGARCH64,
     TARGET_ARCH_M68K,
     TARGET_ARCH_MICROBLAZE,
     TARGET_ARCH_MICROBLAZEEL,
     TARGET_ARCH_MIPS,
     TARGET_ARCH_MIPS64,
     TARGET_ARCH_MIPS64EL,
     TARGET_ARCH_MIPSEL,
     TARGET_ARCH_OR1K,
     TARGET_ARCH_PPC,
     TARGET_ARCH_PPC64,
     TARGET_ARCH_RISCV32,
     TARGET_ARCH_RISCV64,
     TARGET_ARCH_RX,
     TARGET_ARCH_S390X,
     TARGET_ARCH_SH4,
     TARGET_ARCH_SH4EB,
     TARGET_ARCH_SPARC,
     TARGET_ARCH_SPARC64,
     TARGET_ARCH_TRICORE,
     TARGET_ARCH_X86_64,
     TARGET_ARCH_XTENSA,
     TARGET_ARCH_XTENSAEB,
} TargetArch;

Effectively duplicates generated enum SysEmuTarget.  Can you explain why
that's useful?


In terms of code, it doesn't change anything. we could reuse SysEmuTarget.
I just think it's more clear to have the enum defined next to the structure using it, compared to have this buried in generated code that can't be grepped easily. (git grep SYS_EMU returns nothing, so people have to remember it's converted from a Json, and that naming is different). IMHO, DRY principle should not always be followed blindly when it hurts code readability.

That said, my editor is able to find the generated definition as well, so I don't really mind reusing SysEmuTarget if we think the code readability is not worth the duplication.

However, I think it's a problem to compare strings to find this, when it can be set at compile time, in a file that will have to stay target specific anyway.


typedef struct TargetInfo {
...
        TargetArch target_arch;
...
}

static inline target_arch() {
        return target_info()->target_arch;
}

static inline target_aarch64() {
        return target_arch() == TARGET_ARCH_AARCH64;
}


In target_info-stub.c:

#ifdef TARGET_AARCH64
# define TARGET_ARCH TARGET_ARCH_AARCH64
#elif TARGET_ARCH_ALPHA
# define TARGET_ARCH TARGET_ARCH_ALPHA
...
#endif

static const TargetInfo target_info_stub = {
     ...
     .target_arch = TARGET_ARCH;
     ...
}



Reply via email to