From 32f0ce4db98eb1e8e1cc326d3a22ef0c436ae6fe Mon Sep 17 00:00:00 2001 From: Nelson Chu Date: Tue, 18 Aug 2020 17:48:34 +0800 Subject: [PATCH] RISC-V: Report warnings rather than errors for the mis-matched ISA versions. Same as the privileged spec attributes check - different ISA versions should be compatible, unless there are some known conflicts. Therefore, we should allow to link objects with different ISA versions, and update the output ISA versions once the corresponding input ones are newer. But it's better to also warn people that the conflicts may happen when the ISA versions are mis-matched. bfd/ * 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. ld/ * 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. --- bfd/ChangeLog | 12 ++++ bfd/elfnn-riscv.c | 71 ++++++++++--------- ld/ChangeLog | 11 +++ .../ld-riscv-elf/attr-merge-arch-failed-01.d | 8 ++- .../ld-riscv-elf/attr-merge-arch-failed-02.d | 27 +++++++ .../ld-riscv-elf/attr-merge-arch-failed-02a.s | 1 + .../ld-riscv-elf/attr-merge-arch-failed-02b.s | 1 + .../ld-riscv-elf/attr-merge-arch-failed-02c.s | 1 + .../ld-riscv-elf/attr-merge-arch-failed-02d.s | 1 + ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 1 + 10 files changed, 101 insertions(+), 33 deletions(-) create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8703aebeb34..3bf4d293889 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2020-09-03 Nelson Chu + + * 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 * 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 f8de7194ea6..83d4e63ceb4 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 4bba8847437..185f37b031f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2020-09-03 Nelson Chu + + * 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 * 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 8a9c0929f80..4b312388f72 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 00000000000..880ee154737 --- /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 00000000000..3dbf8a20d59 --- /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 00000000000..7bbc39f4258 --- /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 00000000000..2a921e62dca --- /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 00000000000..6ef5ee5851a --- /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 1a0c68fc44f..2c008d4c35c 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" -- 2.30.2