aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNelson Chu <nelson.chu@sifive.com>2021-01-04 10:12:45 +0800
committerNelson Chu <nelson.chu@sifive.com>2021-01-04 11:17:33 +0800
commit4c0e540e47e8ea26e20246c33c744306944b4cb8 (patch)
treeb0c211f9ec492e90888cad664152051df6fe1cf1 /bfd
parente9cf3691bfa140469d52815a2307b00eecf7917c (diff)
downloadbinutils-4c0e540e47e8ea26e20246c33c744306944b4cb8.zip
binutils-4c0e540e47e8ea26e20246c33c744306944b4cb8.tar.gz
binutils-4c0e540e47e8ea26e20246c33c744306944b4cb8.tar.bz2
RISC-V: Fix the merged orders of Z* extension for linker.
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/elfnn-riscv.c35
-rw-r--r--bfd/elfxx-riscv.c2
-rw-r--r--bfd/elfxx-riscv.h3
4 files changed, 14 insertions, 35 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a72e811..a7cc3c8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2021-01-04 Nelson Chu <nelson.chu@sifive.com>
+
+ * 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.
+
2021-01-04 Alan Modra <amodra@gmail.com>
PR 26741
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 *);