RISC-V: Output mapping symbols with ISA string.
authorNelson Chu <nelson@rivosinc.com>
Thu, 29 Sep 2022 11:07:46 +0000 (19:07 +0800)
committerNelson Chu <nelson@rivosinc.com>
Fri, 28 Oct 2022 03:11:23 +0000 (11:11 +0800)
commit40f1a1a4564b2e5822cf19a43a8c15154aa4c488
tree35f083a2767845714fce545b2789d0b903fa41b5
parent58b2ba6d888019278887286e3896ff7ffd12cb2f
RISC-V: Output mapping symbols with ISA string.

RISC-V Psabi pr196,
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/196

bfd/
    * elfxx-riscv.c (riscv_release_subset_list): Free arch_str if needed.
    (riscv_copy_subset_list): Copy arch_str as well.
    * elfxx-riscv.h (riscv_subset_list_t): Store arch_str for each subset list.
gas/
    * config/tc-riscv.c (riscv_reset_subsets_list_arch_str): Update the
    architecture string in the subset_list.
    (riscv_set_arch): Call riscv_reset_subsets_list_arch_str after parsing new
    architecture string.
    (s_riscv_option): Likewise.
    (need_arch_map_symbol): New boolean, used to indicate if .option
    directives do affect instructions.
    (make_mapping_symbol): New boolean parameter reset_seg_arch_str.  Need to
    generate $x+arch for MAP_INSN, and then store it into tc_segment_info_data
    if reset_seg_arch_str is true.
    (riscv_mapping_state): Decide if we need to add $x+arch for MAP_INSN.  For
    now, only add $x+arch if the architecture strings in subset list and segment
    are different.  Besides, always add $x+arch at the start of section, and do
    not add $x+arch for code alignment, since rvc for alignment can be judged
    from addend of R_RISCV_ALIGN.
    (riscv_remove_mapping_symbol): If current and previous mapping symbol have
    same value, then remove the current $x only if the previous is $x+arch;
    Otherwise, always remove previous.
    (riscv_add_odd_padding_symbol): Updated.
    (riscv_check_mapping_symbols): Don't need to add any $x+arch if
    need_arch_map_symbol is false, so changed them to $x.
    (riscv_frag_align_code): Updated since riscv_mapping_state is changed.
    (riscv_init_frag): Likewise.
    (s_riscv_insn): Likewise.
    (riscv_elf_final_processing): Call riscv_release_subset_list to release
    subset_list of riscv_rps_as, rather than only release arch_str in the
    riscv_write_out_attrs.
    (riscv_write_out_attrs): No need to call riscv_arch_str, just get arch_str
    from subset_list of riscv_rps_as.
    * config/tc-riscv.h (riscv_segment_info_type): Record current $x+arch mapping
    symbol of each segment.
    * testsuite/gas/riscv/mapping-0*: Merged and replaced by mapping.s.
    * testsuite/gas/riscv/mapping.s: New testcase, to test most of the cases in
    one file.
    * testsuite/gas/riscv/mapping-symbols.d: Likewise.
    * testsuite/gas/riscv/mapping-dis.d: Likewise.
    * testsuite/gas/riscv/mapping-non-arch.s: New testcase for the case that
    does need any $x+arch.
    * testsuite/gas/riscv/mapping-non-arch.d: Likewise.
    * testsuite/gas/riscv/option-arch-01a.d: Updated.
opcodes/
    * riscv-dis.c (riscv_disassemble_insn): Set riscv_fpr_names back to
    riscv_fpr_names_abi or riscv_fpr_names_numeric when zfinx is disabled
    for some specfic code region.
    (riscv_get_map_state): Recognized mapping symbols $x+arch, and then reset
    the architecture string once the ISA is different.
27 files changed:
bfd/elfxx-riscv.c
bfd/elfxx-riscv.h
gas/config/tc-riscv.c
gas/config/tc-riscv.h
gas/testsuite/gas/riscv/mapping-01.s [deleted file]
gas/testsuite/gas/riscv/mapping-01a.d [deleted file]
gas/testsuite/gas/riscv/mapping-01b.d [deleted file]
gas/testsuite/gas/riscv/mapping-02.s [deleted file]
gas/testsuite/gas/riscv/mapping-02a.d [deleted file]
gas/testsuite/gas/riscv/mapping-02b.d [deleted file]
gas/testsuite/gas/riscv/mapping-03.s [deleted file]
gas/testsuite/gas/riscv/mapping-03a.d [deleted file]
gas/testsuite/gas/riscv/mapping-03b.d [deleted file]
gas/testsuite/gas/riscv/mapping-04.s [deleted file]
gas/testsuite/gas/riscv/mapping-04a.d [deleted file]
gas/testsuite/gas/riscv/mapping-04b.d [deleted file]
gas/testsuite/gas/riscv/mapping-dis.d [new file with mode: 0644]
gas/testsuite/gas/riscv/mapping-non-arch.d [new file with mode: 0644]
gas/testsuite/gas/riscv/mapping-non-arch.s [new file with mode: 0644]
gas/testsuite/gas/riscv/mapping-norelax-03a.d [deleted file]
gas/testsuite/gas/riscv/mapping-norelax-03b.d [deleted file]
gas/testsuite/gas/riscv/mapping-norelax-04a.d [deleted file]
gas/testsuite/gas/riscv/mapping-norelax-04b.d [deleted file]
gas/testsuite/gas/riscv/mapping-symbols.d [new file with mode: 0644]
gas/testsuite/gas/riscv/mapping.s [new file with mode: 0644]
gas/testsuite/gas/riscv/option-arch-01a.d
opcodes/riscv-dis.c