I prefer not to handle the extension implication rules, as it's easy for them to get out of sync, and this should be the linux kernel's responsibility rather than libgcc's.
> +struct { > + unsigned vendorID; This field is gone since it moved to __riscv_cpu_model > + unsigned length; > + unsigned long long features[RISCV_VENDOR_FEATURE_BITS_LENGTH]; > +} __riscv_vendor_feature_bits __attribute__ ((visibility ("hidden"), > nocommon)); > + > +struct { > + unsigned mvendorid; > + unsigned long long marchid; > + unsigned long long mimpid; although it mismatch with what riscv-c-api-doc defined but you are right, it's MXLEN, rather than 32 bits only, also MXLEN may larger than UXLEN which is legal, so unsigned long long is the right > +} __riscv_cpu_model __attribute__ ((visibility ("hidden"), nocommon)); > +