[PATCH v2] RISC-V: Fixed the broken .option norvc and .option arch, -c

Nelson Chu nelson@rivosinc.com
Fri Jul 4 09:02:34 GMT 2025


On Fri, Jul 4, 2025 at 3:33 PM Jan Beulich <jbeulich@suse.com> wrote:

> On 04.07.2025 09:19, Nelson Chu wrote:
> > --- a/bfd/elfxx-riscv.c
> > +++ b/bfd/elfxx-riscv.c
> > @@ -2707,7 +2707,15 @@ riscv_update_subset1 (riscv_parse_subset_t *rps,
> >       }
> >
> >        if (removed)
> > -     riscv_remove_subset (rps->subset_list, subset);
> > +     {
> > +       riscv_remove_subset (rps->subset_list, subset);
> > +
> > +       /* FIXME: This is a workaround that only make the c removal
> works,
> > +          but should find a way to correct others.  */
> > +       if (strcmp (subset, "c") == 0)
> > +         riscv_update_subset (rps,
> "-zca,-zcd,-zcf,-zcb,-zce,-zcmp,-zcmt,"
> > +                                   "-zcmop,-zclsd");
> > +     }
>
> On the assumption that this is the complete (current) set of Zc*
> extensions,
> this looks good to me


Thanks for the review ;)


> fwiw. What I keep forgetting is why the handling of C
> isn't done using the normal dependency chains between extensions.


Well... It was probably just an implementation mistake when dividing c into
zca + zcf and zcd...  In fact we can,

1. For riscv_implicit_subsets, ...

+static bool
+check_implicit_for_c_zcf (riscv_parse_subset_t *rps,
+  riscv_subset_t *subset ATTRIBUTE_UNUSED)
+{
+  return (rps != NULL
+  && rps->xlen != NULL
+  && *rps->xlen == 32
+  && riscv_subset_supports (rps, "f"));
+}
+
+static bool
+check_implicit_for_c_zcd (riscv_parse_subset_t *rps,
+  riscv_subset_t *subset ATTRIBUTE_UNUSED)
+{
+  return (rps != NULL
+  && riscv_subset_supports (rps, "d"));
+ }
+
 static struct riscv_implicit_subset riscv_implicit_subsets[] =
 {
...
+  /* c = zca + zcf (if f) + zcd (if d).  */
+  {"c", "+zcf", check_implicit_for_c_zcf},
+  {"c", "+zcd", check_implicit_for_c_zcd},
+  {"c", "+zca", check_implicit_always},
...
}

2. For opcode table,
Changed INSN_CLASS_C to INSN_CLASS_ZCA
Changed INSN_CLASS_F_AND_C to INSN_CLASS_ZCF
Changed INSN_CLASS_D_AND_C to INSN_CLASS_ZCD

So ".option arch, -zca" should work since the base c instructions (without
f and d) are all controlled by zca rather than c, even though the c is
still in the arch string.  And the ".option arch, -zcf" and ".option arch,
-zcd" also work as expected.  But the ".option arch, -c" seems to be
".option arch, -zca,-zcf,-zcd", and .option norvc should be ".option arch,
-zca,-zcd,-zcf,-zcb,-zce,-zcmp,-zcmt,-zcmt,-zcmop,-zclsd".  I am thinking
that we probably should only let .option norvc works for now, before we
clarify the whole behavior of ".option arch, -ext"?

Thanks
Nelson
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/binutils/attachments/20250704/e16b51e9/attachment.htm>


More information about the Binutils mailing list