Re: [PATCH v4 08/12] RISC-V/gas: .attribute vs .insn
Nelson Chu <[email protected]> Mon, 27 Jul 2026 11:40:07 +0800
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <CAHT-pJxrKFOuf7ynmf6kE=9tWP8fJ1y3y7stynofKVWnn73=OA@mail.gmail.com> |
On Fri, Jul 24, 2026 at 6:05 PM Jan Beulich <[email protected]> wrote: > > "... before any instruction", as the diagnostic from s_riscv_attribute() > says, presumably ought to include also insns resulting from .insn. Make a > small helper function. > > Reviewed-by: Jiawei <[email protected]> > --- > RFC: I can't quite figure why this constraint exists, so there may also be > the option of relaxing things (up to fully dropping start_assemble). > --- If I remember correctly, at that time we didn't support mapping symbols, so all architecture related stuff (header rvc flag, xlen, elf attribute...) should be set before starting assembly. Now we have, so probably can relax this limitation. If we relax this limitation, then we should make sure mappin symbols can also be generated for the corresponding elf arch attributes while assembling instructions like .option arch directives. However, elf attributes are file-level settings, while mapping symbols are function-level settings. File-level attributes can be changed after assembly begins, meaning that without any function-level .option directives, a section of code might not be based on the final file-level setting. In other words, maintaining the validity of file-level settings - unless overridden at the function level directives - simplifies things. I don't have a strong opinion on this, maybe we should ask psABI people to clarify the behaviors. Nelson > v2: Style correction. > > --- a/gas/config/tc-riscv.c > +++ b/gas/config/tc-riscv.c > @@ -4650,6 +4650,18 @@ riscv_ip_hardcode (char *str, > return NULL; > } > > +/* The architecture and privileged elf attributes should be set before > + assembling. */ > +static bool > +start_assembly (void) > +{ > + start_assemble = true; > + > + riscv_set_abi_by_arch (); > + > + return riscv_set_default_priv_spec (NULL); > +} > + > void > md_assemble (char *str) > { > @@ -4657,16 +4669,8 @@ md_assemble (char *str) > expressionS imm_expr; > bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED; > > - /* The architecture and privileged elf attributes should be set > - before assembling. */ > - if (!start_assemble) > - { > - start_assemble = true; > - > - riscv_set_abi_by_arch (); > - if (!riscv_set_default_priv_spec (NULL)) > - return; > - } > + if (!start_assemble && !start_assembly()) > + return; > > riscv_mapping_state (MAP_INSN, 0, false/* fr_align_code */); > > @@ -5875,6 +5879,9 @@ s_riscv_insn (int x ATTRIBUTE_UNUSED) > bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED; > char save_c; > > + if (!start_assemble && !start_assembly()) > + return; > + > while (!is_end_of_stmt (*input_line_pointer)) > ++input_line_pointer; > >