Skip to content
This repository has been archived by the owner on Aug 17, 2022. It is now read-only.

Commit

Permalink
RISC-V: Stop reporting warnings for mismatched extension versions
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
palmer-dabbelt committed Feb 8, 2022
1 parent 3cb9793 commit 1379b6e
Show file tree
Hide file tree
Showing 13 changed files with 36 additions and 100 deletions.
78 changes: 24 additions & 54 deletions bfd/elfnn-riscv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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'. */
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 0 additions & 11 deletions ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d

This file was deleted.

1 change: 0 additions & 1 deletion ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s

This file was deleted.

1 change: 0 additions & 1 deletion ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s

This file was deleted.

27 changes: 0 additions & 27 deletions ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d

This file was deleted.

1 change: 0 additions & 1 deletion ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s

This file was deleted.

1 change: 0 additions & 1 deletion ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s

This file was deleted.

1 change: 0 additions & 1 deletion ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s

This file was deleted.

1 change: 0 additions & 1 deletion ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s

This file was deleted.

9 changes: 9 additions & 0 deletions ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d
Original file line number Diff line number Diff line change
@@ -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"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.attribute arch, "rv32i2p1_m2p0"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.attribute arch, "rv32i2p1_m2p1"
3 changes: 1 addition & 2 deletions ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 1379b6e

Please sign in to comment.