Browse Source

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>
gdb-12-branch
Palmer Dabbelt 4 years ago
parent
commit
87fdd7ac09
No known key found for this signature in database GPG Key ID: EF4CA1502CCBAB41
  1. 78
      bfd/elfnn-riscv.c
  2. 11
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d
  3. 1
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s
  4. 1
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s
  5. 27
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d
  6. 1
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s
  7. 1
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s
  8. 1
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s
  9. 1
      ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s
  10. 9
      ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d
  11. 1
      ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s
  12. 1
      ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s
  13. 3
      ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp

78
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)

11
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d

@ -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
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s

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

1
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s

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

27
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d

@ -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
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s

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

1
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s

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

1
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s

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

1
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s

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

9
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"

1
ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s

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

1
ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s

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

3
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"

Loading…
Cancel
Save