RISC-V: Stop reporting warnings for mismatched extension versions

The extension version checking logic is really just too complicated to
encode into the linker, trying to do so causes more harm than good.
This removes the checks and the associated tests, leaving the logic to
keep the largest version of each extension linked into the target.

bfd/

	* elfnn-riscv.c (riscv_version_mismatch): Rename to
	riscv_update_subset_version, and stop reporting warnings on
	version mismatches.
	(riscv_merge_std_ext): Adjust calls to riscv_version_mismatch.
	(riscv_merge_multi_letter_ext): Likewise.

ld/
	* testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Remove
	* testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s: Likewise
	* testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s: Likewise
	* testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d: Likewise
	* 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/attr-merge-user-ext-01.d: New test.
	* testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i21_m2p0.s:
	Likewise.
	* testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i21_m2p1.s:
	Likewise.
	* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Remove obselete
	attr-merge-arch-failed-{01,02}, replace with
	attr-merge-user-ext-01.

Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
Palmer Dabbelt
2022-02-07 12:14:30 -08:00
parent 481153777e
commit 87fdd7ac09
13 changed files with 36 additions and 100 deletions
+24 -54
View File
@@ -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)
@@ -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.*"
#..
@@ -1 +0,0 @@
.attribute arch, "rv32i2p0_m2p0_a2p0"
@@ -1 +0,0 @@
.attribute arch, "rv32i2p0_m2p0_a3p0"
@@ -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"
#..
@@ -1 +0,0 @@
.attribute arch, "rv32i2p0_m2p0_a2p0_zicsr2p0_xunknown2p0"
@@ -1 +0,0 @@
.attribute arch, "rv32i3p0_m3p0_a3p0_zicsr3p0_xunknown3p0"
@@ -1 +0,0 @@
.attribute arch, "rv32i2p1_m2p2_a2p3_zicsr2p4_xunknown2p5"
@@ -1 +0,0 @@
.attribute arch, "rv32i4p6_m4p7_a4p8_zicsr4p9_xunknown4p0"
@@ -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"
@@ -0,0 +1 @@
.attribute arch, "rv32i2p1_m2p0"
@@ -0,0 +1 @@
.attribute arch, "rv32i2p1_m2p1"
+1 -2
View File
@@ -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"