RISC-V: Implement Ztso extension

This patch support ZTSO extension. It will turn on the tso flag for elf_flags
once we have enabled Ztso extension.  This is intended to implement v0.1 of
the proposed specification which can be found in Chapter 25 of,
https://github.com/riscv/riscv-isa-manual/releases/download/draft-20220723-10eea63/riscv-spec.pdf.

bfd\ChangeLog:

        * elfnn-riscv.c (_bfd_riscv_elf_merge_private_bfd_data): Set TSO flag.
        * elfxx-riscv.c: Add Ztso's arch.

binutils\ChangeLog:

        * readelf.c (get_machine_flags): Set TSO flag.

gas\ChangeLog:

        * config/tc-riscv.c (riscv_set_tso): Ditto.
        (riscv_set_arch): Ditto.
        * testsuite/gas/riscv/ztso.d: New test.

include\ChangeLog:

        * elf/riscv.h (EF_RISCV_TSO): Ditto.
This commit is contained in:
Shihua
2022-09-20 17:45:04 +08:00
committed by Nelson Chu
parent 70f35d72ef
commit 96462b0129
6 changed files with 29 additions and 0 deletions

View File

@ -3872,6 +3872,9 @@ _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
/* Allow linking RVC and non-RVC, and keep the RVC flag. */ /* Allow linking RVC and non-RVC, and keep the RVC flag. */
elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC; elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_RVC;
/* Allow linking TSO and non-TSO, and keep the TSO flag. */
elf_elfheader (obfd)->e_flags |= new_flags & EF_RISCV_TSO;
return true; return true;
fail: fail:

View File

@ -1204,6 +1204,7 @@ static struct riscv_supported_ext riscv_supported_std_z_ext[] =
{"zvl16384b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zvl16384b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"zvl32768b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zvl32768b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"zvl65536b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 }, {"zvl65536b", ISA_SPEC_CLASS_DRAFT, 1, 0, 0 },
{"ztso", ISA_SPEC_CLASS_DRAFT, 0, 1, 0 },
{NULL, 0, 0, 0, 0} {NULL, 0, 0, 0, 0}
}; };

View File

@ -4079,6 +4079,9 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
if (e_flags & EF_RISCV_RVE) if (e_flags & EF_RISCV_RVE)
strcat (buf, ", RVE"); strcat (buf, ", RVE");
if (e_flags & EF_RISCV_TSO)
strcat (buf, ", TSO");
switch (e_flags & EF_RISCV_FLOAT_ABI) switch (e_flags & EF_RISCV_FLOAT_ABI)
{ {
case EF_RISCV_FLOAT_ABI_SOFT: case EF_RISCV_FLOAT_ABI_SOFT:

View File

@ -257,6 +257,14 @@ riscv_set_rvc (bool rvc_value)
riscv_opts.rvc = rvc_value; riscv_opts.rvc = rvc_value;
} }
/* Turn on the tso flag for elf_flags once we have enabled ztso extension. */
static void
riscv_set_tso ()
{
elf_flags |= EF_RISCV_TSO;
}
/* This linked list records all enabled extensions, which are parsed from /* This linked list records all enabled extensions, which are parsed from
the architecture string. The architecture string can be set by the the architecture string. The architecture string can be set by the
-march option, the elf architecture attributes, and the --with-arch -march option, the elf architecture attributes, and the --with-arch
@ -307,6 +315,9 @@ riscv_set_arch (const char *s)
riscv_set_rvc (false); riscv_set_rvc (false);
if (riscv_subset_supports (&riscv_rps_as, "c")) if (riscv_subset_supports (&riscv_rps_as, "c"))
riscv_set_rvc (true); riscv_set_rvc (true);
if (riscv_subset_supports (&riscv_rps_as, "ztso"))
riscv_set_tso ();
} }
/* Indicate -mabi option is explictly set. */ /* Indicate -mabi option is explictly set. */

View File

@ -0,0 +1,8 @@
#as: -march=rv64i_ztso
#readelf: -h
#source: empty.s
ELF Header:
#...
[ ]+Flags:[ ]+0x10, TSO.*
#...

View File

@ -121,6 +121,9 @@ END_RELOC_NUMBERS (R_RISCV_max)
/* RISC-V specific values for st_other. */ /* RISC-V specific values for st_other. */
#define STO_RISCV_VARIANT_CC 0x80 #define STO_RISCV_VARIANT_CC 0x80
/* File uses the TSO model. */
#define EF_RISCV_TSO 0x0010
/* Additional section types. */ /* Additional section types. */
#define SHT_RISCV_ATTRIBUTES 0x70000003 /* Section holds attributes. */ #define SHT_RISCV_ATTRIBUTES 0x70000003 /* Section holds attributes. */