diff options
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/elfnn-riscv.c | 71 | ||||
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d | 27 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 1 |
10 files changed, 101 insertions, 33 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8703aeb..3bf4d29 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2020-09-03 Nelson Chu <nelson.chu@sifive.com> + + * elfnn-riscv.c (riscv_version_mismatch): Change the return type + from void to bfd_boolean. Report warnings rather than errors + when the ISA versions are mis-matched. Afterwards, remember to + update the output ISA versions to the newest ones. + (riscv_merge_std_ext): Allow to link objects with different + standard ISA versions. Try to add output ISA versions to + merged_subsets first. + (riscv_merge_multi_letter_ext): Likewise. But for standard additional + ISA and non-standard ISA versions. + 2020-09-03 Kito Cheng <kito.cheng@sifive.com> * elfnn-riscv.c (riscv_merge_std_ext): Fix to report the correct diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index f8de719..83d4e63 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -2618,19 +2618,42 @@ riscv_std_ext_p (const char *name) return (strlen (name) == 1) && (name[0] != 'x') && (name[0] != 's'); } -/* Error handler when version mis-match. */ +/* Check if the versions are compatible. */ -static void +static bfd_boolean riscv_version_mismatch (bfd *ibfd, struct riscv_subset_t *in, struct riscv_subset_t *out) { - _bfd_error_handler - (_("error: %pB: Mis-matched ISA version for '%s' extension. " - "%d.%d vs %d.%d"), - ibfd, in->name, - in->major_version, in->minor_version, - out->major_version, out->minor_version); + if (in == NULL || out == NULL) + return TRUE; + + /* 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) + { + _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; + } + } + + return TRUE; } /* Return true if subset is 'i' or 'e'. */ @@ -2692,16 +2715,11 @@ riscv_merge_std_ext (bfd *ibfd, ibfd, in->name, out->name); return FALSE; } - else if ((in->major_version != out->major_version) || - (in->minor_version != out->minor_version)) - { - /* TODO: Allow different merge policy. */ - riscv_version_mismatch (ibfd, in, out); - return FALSE; - } + else if (!riscv_version_mismatch (ibfd, in, out)) + return FALSE; else riscv_add_subset (&merged_subsets, - in->name, in->major_version, in->minor_version); + out->name, out->major_version, out->minor_version); in = in->next; out = out->next; @@ -2718,17 +2736,10 @@ riscv_merge_std_ext (bfd *ibfd, if (find_in == NULL && find_out == NULL) continue; - /* Check version is same or not. */ - /* TODO: Allow different merge policy. */ - if ((find_in != NULL && find_out != NULL) - && ((find_in->major_version != find_out->major_version) - || (find_in->minor_version != find_out->minor_version))) - { - riscv_version_mismatch (ibfd, find_in, find_out); - return FALSE; - } + if (!riscv_version_mismatch (ibfd, find_in, find_out)) + return FALSE; - struct riscv_subset_t *merged = find_in ? find_in : find_out; + struct riscv_subset_t *merged = find_out ? find_out : find_in; riscv_add_subset (&merged_subsets, merged->name, merged->major_version, merged->minor_version); } @@ -2812,12 +2823,8 @@ riscv_merge_multi_letter_ext (bfd *ibfd, else { /* Both present, check version and increment both. */ - if ((in->major_version != out->major_version) - || (in->minor_version != out->minor_version)) - { - riscv_version_mismatch (ibfd, in, out); - return FALSE; - } + if (!riscv_version_mismatch (ibfd, in, out)) + return FALSE; riscv_add_subset (&merged_subsets, out->name, out->major_version, out->minor_version); diff --git a/ld/ChangeLog b/ld/ChangeLog index 4bba884..185f37b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2020-09-03 Nelson Chu <nelson.chu@sifive.com> + + * testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Update the + message from error to warning. + * testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d: New testcases. + * testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s: Likewise. + * testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s: Likewise. + * testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s: Likewise. + * testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s: Likewise. + * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated. + 2020-09-03 Kito Cheng <kito.cheng@sifive.com> * testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Updated. 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 index 8a9c092..4b31238 100644 --- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d +++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d @@ -2,4 +2,10 @@ #source: attr-merge-arch-failed-01b.s #as: -march-attr #ld: -r -melf32lriscv -#error: Mis-matched ISA version for 'a' extension. 3.0 vs 2.0 +#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-02.d b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d new file mode 100644 index 0000000..880ee15 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d @@ -0,0 +1,27 @@ +#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 -melf32lriscv +#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_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 new file mode 100644 index 0000000..3dbf8a2 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s @@ -0,0 +1 @@ + .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 new file mode 100644 index 0000000..7bbc39f --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s @@ -0,0 +1 @@ + .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 new file mode 100644 index 0000000..2a921e6 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s @@ -0,0 +1 @@ + .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 new file mode 100644 index 0000000..6ef5ee5 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s @@ -0,0 +1 @@ + .attribute arch, "rv32i4p6_m4p7_a4p8_zicsr4p9_xunknown4p0" diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 1a0c68f..2c008d4 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -39,6 +39,7 @@ if [istarget "riscv*-*-*"] { 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-stack-align-failed" run_dump_test "attr-merge-priv-spec-failed-01" run_dump_test "attr-merge-priv-spec-failed-02" |