On Thu, Jun 29, 2023 at 07:04:28PM -0300, Daniel Henrique Barboza wrote:
> Drew,
> 
> On 6/29/23 05:59, Andrew Jones wrote:
> > On Wed, Jun 28, 2023 at 06:30:24PM -0300, Daniel Henrique Barboza wrote:
> > > Next patch will add KVM specific user properties for both MISA and
> > > multi-letter extensions. For MISA extensions we want to make use of what
> > > is already available in misa_ext_cfgs[] to avoid code repetition.
> > > 
> > > misa_ext_info_arr[] array will hold name and description for each MISA
> > > extension that misa_ext_cfgs[] is declaring. We'll then use this new
> > > array in KVM code to avoid duplicating strings.
> > > 
> > > There's nothing holding us back from doing the same with multi-letter
> > > extensions. For now doing just with MISA extensions is enough.
> > > 
> > > Suggested-by: Andrew Jones <ajo...@ventanamicro.com>
> > > Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com>
> > > ---
> > >   target/riscv/cpu.c | 83 ++++++++++++++++++++++++++++++----------------
> > >   target/riscv/cpu.h |  7 +++-
> > >   2 files changed, 61 insertions(+), 29 deletions(-)
> > > 
> > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> > > index 2485e820f8..90dd2078ae 100644
> > > --- a/target/riscv/cpu.c
> > > +++ b/target/riscv/cpu.c
> > > @@ -1558,33 +1558,57 @@ static void cpu_get_misa_ext_cfg(Object *obj, 
> > > Visitor *v, const char *name,
> > >       visit_type_bool(v, name, &value, errp);
> > >   }
> > > -static const RISCVCPUMisaExtConfig misa_ext_cfgs[] = {
> > > -    {.name = "a", .description = "Atomic instructions",
> > > -     .misa_bit = RVA, .enabled = true},
> > > -    {.name = "c", .description = "Compressed instructions",
> > > -     .misa_bit = RVC, .enabled = true},
> > > -    {.name = "d", .description = "Double-precision float point",
> > > -     .misa_bit = RVD, .enabled = true},
> > > -    {.name = "f", .description = "Single-precision float point",
> > > -     .misa_bit = RVF, .enabled = true},
> > > -    {.name = "i", .description = "Base integer instruction set",
> > > -     .misa_bit = RVI, .enabled = true},
> > > -    {.name = "e", .description = "Base integer instruction set 
> > > (embedded)",
> > > -     .misa_bit = RVE, .enabled = false},
> > > -    {.name = "m", .description = "Integer multiplication and division",
> > > -     .misa_bit = RVM, .enabled = true},
> > > -    {.name = "s", .description = "Supervisor-level instructions",
> > > -     .misa_bit = RVS, .enabled = true},
> > > -    {.name = "u", .description = "User-level instructions",
> > > -     .misa_bit = RVU, .enabled = true},
> > > -    {.name = "h", .description = "Hypervisor",
> > > -     .misa_bit = RVH, .enabled = true},
> > > -    {.name = "x-j", .description = "Dynamic translated languages",
> > > -     .misa_bit = RVJ, .enabled = false},
> > > -    {.name = "v", .description = "Vector operations",
> > > -     .misa_bit = RVV, .enabled = false},
> > > -    {.name = "g", .description = "General purpose 
> > > (IMAFD_Zicsr_Zifencei)",
> > > -     .misa_bit = RVG, .enabled = false},
> > > +typedef struct misa_ext_info {
> > > +    const char *name;
> > > +    const char *description;
> > > +} MISAExtInfo;
> > > +
> > > +#define MISA_EXT_INFO(_idx, _propname, _descr) \
> > > +    [(_idx - 'A')] = {.name = _propname, .description = _descr}
> > 
> > We don't have to give up on passing RV* to this macro. Directly
> > using __builtin_ctz() with a constant should work, i.e.
> > 
> >   #define MISA_EXT_INFO(_bit, _propname, _descr) \
> >       [__builtin_ctz(_bit)] = {.name = _propname, .description = _descr}
> > 
> > and then
> > 
> >   MISA_EXT_INFO(RVA, "a", "Atomic instructions"),
> >   MISA_EXT_INFO(RVD, "d", "Double-precision float point"),
> >   ...
> > 
> > (We don't need the ctz32() wrapper since we know we'll never input zero to
> > __builtin_ctz().)
> 
> I run the series through gitlab because I got worried about this change in 
> different
> compilers and so on. And in fact I fear that we break 'clang-user' with it:
> 
> https://gitlab.com/danielhb/qemu/-/jobs/4569265199
> 
> u.c.o -c ../target/riscv/cpu.c
> ../target/riscv/cpu.c:1624:5: error: initializer element is not a 
> compile-time constant
>     MISA_CFG(RVA, true),
>     ^~~~~~~~~~~~~~~~~~~
> ../target/riscv/cpu.c:1619:53: note: expanded from macro 'MISA_CFG'
>     {.name = misa_ext_info_arr[MISA_INFO_IDX(_bit)].name, \
>              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
> 1 error generated.
> [1503/2619] Compiling C object 
> libqemu-ppc64le-linux-user.fa.p/linux-user_syscall.c.o
> 
> 
> Which is a shame because gcc and everyone else is okay with it, but 
> 'clang-user' and
> 'tsan-build' runners are complaining about it.
> 
> Unless there's a directive to make clang accept this code (I didn't find any) 
> we'll
> need to keep updating name and description during runtime, and we'll have to 
> keep
> removing 'const' from misa_ext_cfgs[].
>

Yeah, that's a pity, and odd that any compiler wouldn't be able to
identify that a constant input to a builtin linear function produces
another constant...

Oh well, we can only be as good as the tools we use...

Thanks,
drew

Reply via email to