diff options
13 files changed, 36 insertions, 100 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 95fcc77bea1..8f9f0d8a86a 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -3371,52 +3371,27 @@ riscv_std_ext_p (const char *name) return (strlen (name) == 1) && (name[0] != 'x') && (name[0] != 's'); } -/* Check if the versions are compatible. */ +/* Update the output subset's version to match the input when the input + subset's version is newer. */ -static bool -riscv_version_mismatch (bfd *ibfd, - struct riscv_subset_t *in, - struct riscv_subset_t *out) +static void +riscv_update_subset_version (struct riscv_subset_t *in, + struct riscv_subset_t *out) { if (in == NULL || out == NULL) - return true; + return; - /* Since there are no version conflicts for now, we just report - warning when the versions are mis-matched. */ - if (in->major_version != out->major_version - || in->minor_version != out->minor_version) + /* Update the output ISA versions to the newest ones, but otherwise don't + provide any errors or warnings about mis-matched ISA versions as it's + generally too tricky to check for these at link time. */ + if ((in->major_version > out->major_version) + || (in->major_version == out->major_version + && in->minor_version > out->minor_version) + || (out->major_version == RISCV_UNKNOWN_VERSION)) { - if ((in->major_version == RISCV_UNKNOWN_VERSION - && in->minor_version == RISCV_UNKNOWN_VERSION) - || (out->major_version == RISCV_UNKNOWN_VERSION - && out->minor_version == RISCV_UNKNOWN_VERSION)) - { - /* Do not report the warning when the version of input - or output is RISCV_UNKNOWN_VERSION, since the extension - is added implicitly. */ - } - else - _bfd_error_handler - (_("warning: %pB: mis-matched ISA version %d.%d for '%s' " - "extension, the output version is %d.%d"), - ibfd, - in->major_version, - in->minor_version, - in->name, - out->major_version, - out->minor_version); - - /* Update the output ISA versions to the newest ones. */ - if ((in->major_version > out->major_version) - || (in->major_version == out->major_version - && in->minor_version > out->minor_version)) - { - out->major_version = in->major_version; - out->minor_version = in->minor_version; - } + out->major_version = in->major_version; + out->minor_version = in->minor_version; } - - return true; } /* Return true if subset is 'i' or 'e'. */ @@ -3477,11 +3452,10 @@ riscv_merge_std_ext (bfd *ibfd, ibfd, in->name, out->name); return false; } - else if (!riscv_version_mismatch (ibfd, in, out)) - return false; - else - riscv_add_subset (&merged_subsets, - out->name, out->major_version, out->minor_version); + + riscv_update_subset_version(in, out); + riscv_add_subset (&merged_subsets, + out->name, out->major_version, out->minor_version); in = in->next; out = out->next; @@ -3499,10 +3473,8 @@ riscv_merge_std_ext (bfd *ibfd, if (!find_in && !find_out) continue; - if (find_in - && find_out - && !riscv_version_mismatch (ibfd, ext_in, ext_out)) - return false; + if (find_in && find_out) + riscv_update_subset_version(ext_in, ext_out); ext_merged = find_out ? ext_out : ext_in; riscv_add_subset (&merged_subsets, ext_merged->name, @@ -3524,8 +3496,7 @@ riscv_merge_std_ext (bfd *ibfd, on success and FALSE when a conflict is found. */ static bool -riscv_merge_multi_letter_ext (bfd *ibfd, - riscv_subset_t **pin, +riscv_merge_multi_letter_ext (riscv_subset_t **pin, riscv_subset_t **pout) { riscv_subset_t *in = *pin; @@ -3555,8 +3526,7 @@ riscv_merge_multi_letter_ext (bfd *ibfd, else { /* Both present, check version and increment both. */ - if (!riscv_version_mismatch (ibfd, in, out)) - return false; + riscv_update_subset_version (in, out); riscv_add_subset (&merged_subsets, out->name, out->major_version, out->minor_version); @@ -3629,7 +3599,7 @@ riscv_merge_arch_attr_info (bfd *ibfd, char *in_arch, char *out_arch) return NULL; /* Merge all non-single letter extensions with single call. */ - if (!riscv_merge_multi_letter_ext (ibfd, &in, &out)) + if (!riscv_merge_multi_letter_ext (&in, &out)) return NULL; if (xlen_in != xlen_out) diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d deleted file mode 100644 index 669a1392067..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d +++ /dev/null @@ -1,11 +0,0 @@ -#source: attr-merge-arch-failed-01a.s -#source: attr-merge-arch-failed-01b.s -#as: -march-attr -#ld: -r -m[riscv_choose_ilp32_emul] -#warning: .*mis-matched ISA version 3.0 for 'a' extension, the output version is 2.0 -#readelf: -A - -Attribute Section: riscv -File Attributes - Tag_RISCV_arch: ".*a3p0.*" -#.. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s deleted file mode 100644 index 365901d8dc1..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s +++ /dev/null @@ -1 +0,0 @@ - .attribute arch, "rv32i2p0_m2p0_a2p0" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s deleted file mode 100644 index 49263bf66d4..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s +++ /dev/null @@ -1 +0,0 @@ - .attribute arch, "rv32i2p0_m2p0_a3p0" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d deleted file mode 100644 index 2f2638ace22..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d +++ /dev/null @@ -1,27 +0,0 @@ -#source: attr-merge-arch-failed-02a.s -#source: attr-merge-arch-failed-02b.s -#source: attr-merge-arch-failed-02c.s -#source: attr-merge-arch-failed-02d.s -#as: -march-attr -#ld: -r -m[riscv_choose_ilp32_emul] -#warning: .*mis-matched ISA version 3.0 for 'i' extension, the output version is 2.0 -#warning: .*mis-matched ISA version 3.0 for 'm' extension, the output version is 2.0 -#warning: .*mis-matched ISA version 3.0 for 'a' extension, the output version is 2.0 -#warning: .*mis-matched ISA version 3.0 for 'zicsr' extension, the output version is 2.0 -#warning: .*mis-matched ISA version 3.0 for 'xunknown' extension, the output version is 2.0 -#warning: .*mis-matched ISA version 2.1 for 'i' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 2.2 for 'm' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 2.3 for 'a' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 2.4 for 'zicsr' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 2.5 for 'xunknown' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 4.6 for 'i' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 4.7 for 'm' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 4.8 for 'a' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 4.9 for 'zicsr' extension, the output version is 3.0 -#warning: .*mis-matched ISA version 4.0 for 'xunknown' extension, the output version is 3.0 -#readelf: -A - -Attribute Section: riscv -File Attributes - Tag_RISCV_arch: "rv32i4p6_m4p7_a4p8_zicsr4p9_zifencei2p0_xunknown4p0" -#.. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s deleted file mode 100644 index 3dbf8a20d59..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s +++ /dev/null @@ -1 +0,0 @@ - .attribute arch, "rv32i2p0_m2p0_a2p0_zicsr2p0_xunknown2p0" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s deleted file mode 100644 index 7bbc39f4258..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s +++ /dev/null @@ -1 +0,0 @@ - .attribute arch, "rv32i3p0_m3p0_a3p0_zicsr3p0_xunknown3p0" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s deleted file mode 100644 index 2a921e62dca..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s +++ /dev/null @@ -1 +0,0 @@ - .attribute arch, "rv32i2p1_m2p2_a2p3_zicsr2p4_xunknown2p5" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s deleted file mode 100644 index 6ef5ee5851a..00000000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s +++ /dev/null @@ -1 +0,0 @@ - .attribute arch, "rv32i4p6_m4p7_a4p8_zicsr4p9_xunknown4p0" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d new file mode 100644 index 00000000000..d15bcdcab1b --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d @@ -0,0 +1,9 @@ +#source: attr-merge-user-ext-rv32i2p1_m2p0.s +#source: attr-merge-user-ext-rv32i2p1_m2p1.s +#as: +#ld: -r -m[riscv_choose_ilp32_emul] +#readelf: -A + +Attribute Section: riscv +File Attributes + Tag_RISCV_arch: "rv32i2p1_m2p1" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s new file mode 100644 index 00000000000..a7e0547215f --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s @@ -0,0 +1 @@ +.attribute arch, "rv32i2p1_m2p0" diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s new file mode 100644 index 00000000000..a1b61e3a949 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s @@ -0,0 +1 @@ +.attribute arch, "rv32i2p1_m2p1" diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 3d8950238a4..272424b33e3 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -160,8 +160,7 @@ if [istarget "riscv*-*-*"] { run_dump_test "attr-merge-priv-spec-01" run_dump_test "attr-merge-priv-spec-02" run_dump_test "attr-merge-priv-spec-03" - run_dump_test "attr-merge-arch-failed-01" - run_dump_test "attr-merge-arch-failed-02" + run_dump_test "attr-merge-user-ext-01" run_dump_test "attr-merge-stack-align-failed" run_dump_test "attr-merge-priv-spec-failed-01" run_dump_test "attr-merge-priv-spec-failed-02" |