summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPalmer Dabbelt <palmer@rivosinc.com>2022-02-07 12:14:30 -0800
committerPalmer Dabbelt <palmer@rivosinc.com>2022-02-08 08:33:13 -0800
commit1379b6ec0776f27f16d08e99a3dba2350f5b19d0 (patch)
treec94be46d94b51feed66b9f9cc6dd575fc8cbe9d5
parenti386: Allow GOT32 relocations against ABS symbols (diff)
downloadbinutils-gdb-1379b6ec0776f27f16d08e99a3dba2350f5b19d0.tar.gz
binutils-gdb-1379b6ec0776f27f16d08e99a3dba2350f5b19d0.tar.bz2
binutils-gdb-1379b6ec0776f27f16d08e99a3dba2350f5b19d0.zip
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>
-rw-r--r--bfd/elfnn-riscv.c78
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d11
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d27
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d9
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s1
-rw-r--r--ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp3
13 files changed, 36 insertions, 100 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 95fcc77bea1..8f9f0d8a86a 100644
--- a/bfd/elfnn-riscv.c
+++ b/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)
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
deleted file mode 100644
index 669a1392067..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d
+++ /dev/null
@@ -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.*"
-#..
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s
deleted file mode 100644
index 365901d8dc1..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s
+++ /dev/null
@@ -1 +0,0 @@
- .attribute arch, "rv32i2p0_m2p0_a2p0"
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s
deleted file mode 100644
index 49263bf66d4..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s
+++ /dev/null
@@ -1 +0,0 @@
- .attribute arch, "rv32i2p0_m2p0_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
deleted file mode 100644
index 2f2638ace22..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d
+++ /dev/null
@@ -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"
-#..
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
deleted file mode 100644
index 3dbf8a20d59..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s
+++ /dev/null
@@ -1 +0,0 @@
- .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
deleted file mode 100644
index 7bbc39f4258..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s
+++ /dev/null
@@ -1 +0,0 @@
- .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
deleted file mode 100644
index 2a921e62dca..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s
+++ /dev/null
@@ -1 +0,0 @@
- .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
deleted file mode 100644
index 6ef5ee5851a..00000000000
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s
+++ /dev/null
@@ -1 +0,0 @@
- .attribute arch, "rv32i4p6_m4p7_a4p8_zicsr4p9_xunknown4p0"
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d
new file mode 100644
index 00000000000..d15bcdcab1b
--- /dev/null
+++ b/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"
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s
new file mode 100644
index 00000000000..a7e0547215f
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s
@@ -0,0 +1 @@
+.attribute arch, "rv32i2p1_m2p0"
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s
new file mode 100644
index 00000000000..a1b61e3a949
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s
@@ -0,0 +1 @@
+.attribute arch, "rv32i2p1_m2p1"
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
index 3d8950238a4..272424b33e3 100644
--- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
+++ b/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"