[PATCH] RISC-V: Fix the merged orders of Z* extension for linker.
Nelson Chu
nelson.chu@sifive.com
Mon Jan 4 03:19:22 GMT 2021
Committed, thanks.
Nelson
On Mon, Jan 4, 2021 at 11:12 AM Nelson Chu <nelson.chu@sifive.com> wrote:
>
> Similar to the commit 6729e2c2af2bd94408430734316597843718a484,
> we have to check the first char of the Z* extensions, to make
> sure that they follow the order of the standard extensions.
>
> bfd/
> * elfxx-riscv.c (riscv_compare_subsets): Removed static.
> * elfxx-riscv.h: Add declaration.
> * elfnn-riscv.c (riscv_merge_multi_letter_ext): Use
> riscv_compare_subsets to check the orders.
> (riscv_skip_prefix): Removed.
> (riscv_prefix_cmp): Removed.
> ---
> bfd/elfnn-riscv.c | 35 +----------------------------------
> bfd/elfxx-riscv.c | 2 +-
> bfd/elfxx-riscv.h | 3 +++
> 3 files changed, 5 insertions(+), 35 deletions(-)
>
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index dff0d4d..047f31b 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -3410,39 +3410,6 @@ riscv_merge_std_ext (bfd *ibfd,
> return TRUE;
> }
>
> -/* If C is a prefix class, then return the EXT string without the prefix.
> - Otherwise return the entire EXT string. */
> -
> -static const char *
> -riscv_skip_prefix (const char *ext, riscv_isa_ext_class_t c)
> -{
> - switch (c)
> - {
> - case RV_ISA_CLASS_X: return &ext[1];
> - case RV_ISA_CLASS_S: return &ext[1];
> - case RV_ISA_CLASS_Z: return &ext[1];
> - default: return ext;
> - }
> -}
> -
> -/* Compare prefixed extension names canonically. */
> -
> -static int
> -riscv_prefix_cmp (const char *a, const char *b)
> -{
> - riscv_isa_ext_class_t ca = riscv_get_prefix_class (a);
> - riscv_isa_ext_class_t cb = riscv_get_prefix_class (b);
> -
> - /* Extension name without prefix */
> - const char *anp = riscv_skip_prefix (a, ca);
> - const char *bnp = riscv_skip_prefix (b, cb);
> -
> - if (ca == cb)
> - return strcasecmp (anp, bnp);
> -
> - return (int)ca - (int)cb;
> -}
> -
> /* Merge multi letter extensions. PIN is a pointer to the head of the input
> object subset list. Likewise for POUT and the output object. Return TRUE
> on success and FALSE when a conflict is found. */
> @@ -3460,7 +3427,7 @@ riscv_merge_multi_letter_ext (bfd *ibfd,
>
> while (in && out)
> {
> - cmp = riscv_prefix_cmp (in->name, out->name);
> + cmp = riscv_compare_subsets (in->name, out->name);
>
> if (cmp < 0)
> {
> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index 101e27f..d3b6472 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -1037,7 +1037,7 @@ static int riscv_ext_order[26] = {0};
> or greater than zero if `subset2` is found, respectively, to be less
> than, to match, or be greater than `subset1`. */
>
> -static int
> +int
> riscv_compare_subsets (const char *subset1, const char *subset2)
> {
> int order1 = riscv_ext_order[(*subset1 - 'a')];
> diff --git a/bfd/elfxx-riscv.h b/bfd/elfxx-riscv.h
> index 3a7c7b7..4d7a6dc 100644
> --- a/bfd/elfxx-riscv.h
> +++ b/bfd/elfxx-riscv.h
> @@ -116,3 +116,6 @@ riscv_get_priv_spec_class_from_numbers (unsigned int,
>
> extern const char *
> riscv_get_priv_spec_name (enum riscv_priv_spec_class);
> +
> +extern int
> +riscv_compare_subsets (const char *, const char *);
> --
> 2.7.4
>
More information about the Binutils
mailing list