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.
This commit is contained in:
Nelson Chu
2020-08-18 17:48:34 +08:00
parent 72bd6912ea
commit 32f0ce4db9
10 changed files with 101 additions and 33 deletions

View File

@ -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> 2020-09-03 Kito Cheng <kito.cheng@sifive.com>
* elfnn-riscv.c (riscv_merge_std_ext): Fix to report the correct * elfnn-riscv.c (riscv_merge_std_ext): Fix to report the correct

View File

@ -2618,19 +2618,42 @@ riscv_std_ext_p (const char *name)
return (strlen (name) == 1) && (name[0] != 'x') && (name[0] != 's'); 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, riscv_version_mismatch (bfd *ibfd,
struct riscv_subset_t *in, struct riscv_subset_t *in,
struct riscv_subset_t *out) struct riscv_subset_t *out)
{ {
_bfd_error_handler if (in == NULL || out == NULL)
(_("error: %pB: Mis-matched ISA version for '%s' extension. " return TRUE;
"%d.%d vs %d.%d"),
ibfd, in->name, /* Since there are no version conflicts for now, we just report
in->major_version, in->minor_version, warning when the versions are mis-matched. */
out->major_version, out->minor_version); 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'. */ /* Return true if subset is 'i' or 'e'. */
@ -2692,16 +2715,11 @@ riscv_merge_std_ext (bfd *ibfd,
ibfd, in->name, out->name); ibfd, in->name, out->name);
return FALSE; return FALSE;
} }
else if ((in->major_version != out->major_version) || else if (!riscv_version_mismatch (ibfd, in, out))
(in->minor_version != out->minor_version)) return FALSE;
{
/* TODO: Allow different merge policy. */
riscv_version_mismatch (ibfd, in, out);
return FALSE;
}
else else
riscv_add_subset (&merged_subsets, riscv_add_subset (&merged_subsets,
in->name, in->major_version, in->minor_version); out->name, out->major_version, out->minor_version);
in = in->next; in = in->next;
out = out->next; out = out->next;
@ -2718,17 +2736,10 @@ riscv_merge_std_ext (bfd *ibfd,
if (find_in == NULL && find_out == NULL) if (find_in == NULL && find_out == NULL)
continue; continue;
/* Check version is same or not. */ if (!riscv_version_mismatch (ibfd, find_in, find_out))
/* TODO: Allow different merge policy. */ return FALSE;
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;
}
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, riscv_add_subset (&merged_subsets, merged->name,
merged->major_version, merged->minor_version); merged->major_version, merged->minor_version);
} }
@ -2812,12 +2823,8 @@ riscv_merge_multi_letter_ext (bfd *ibfd,
else else
{ {
/* Both present, check version and increment both. */ /* Both present, check version and increment both. */
if ((in->major_version != out->major_version) if (!riscv_version_mismatch (ibfd, in, out))
|| (in->minor_version != out->minor_version)) return FALSE;
{
riscv_version_mismatch (ibfd, in, out);
return FALSE;
}
riscv_add_subset (&merged_subsets, out->name, out->major_version, riscv_add_subset (&merged_subsets, out->name, out->major_version,
out->minor_version); out->minor_version);

View File

@ -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> 2020-09-03 Kito Cheng <kito.cheng@sifive.com>
* testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Updated. * testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Updated.

View File

@ -2,4 +2,10 @@
#source: attr-merge-arch-failed-01b.s #source: attr-merge-arch-failed-01b.s
#as: -march-attr #as: -march-attr
#ld: -r -melf32lriscv #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.*"
#..

View File

@ -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"
#..

View File

@ -0,0 +1 @@
.attribute arch, "rv32i2p0_m2p0_a2p0_zicsr2p0_xunknown2p0"

View File

@ -0,0 +1 @@
.attribute arch, "rv32i3p0_m3p0_a3p0_zicsr3p0_xunknown3p0"

View File

@ -0,0 +1 @@
.attribute arch, "rv32i2p1_m2p2_a2p3_zicsr2p4_xunknown2p5"

View File

@ -0,0 +1 @@
.attribute arch, "rv32i4p6_m4p7_a4p8_zicsr4p9_xunknown4p0"

View File

@ -39,6 +39,7 @@ if [istarget "riscv*-*-*"] {
run_dump_test "attr-merge-priv-spec-02" run_dump_test "attr-merge-priv-spec-02"
run_dump_test "attr-merge-priv-spec-03" run_dump_test "attr-merge-priv-spec-03"
run_dump_test "attr-merge-arch-failed-01" 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-stack-align-failed"
run_dump_test "attr-merge-priv-spec-failed-01" run_dump_test "attr-merge-priv-spec-failed-01"
run_dump_test "attr-merge-priv-spec-failed-02" run_dump_test "attr-merge-priv-spec-failed-02"