RISC-V: Stop reporting warnings for mismatched extension versions
authorPalmer Dabbelt <palmer@rivosinc.com>
Mon, 7 Feb 2022 20:14:30 +0000 (12:14 -0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Tue, 8 Feb 2022 16:23:28 +0000 (08:23 -0800)
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>
13 files changed:
bfd/elfnn-riscv.c
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01a.s [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01b.s [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s [deleted file]
ld/testsuite/ld-riscv-elf/attr-merge-user-ext-01.d [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p0.s [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/attr-merge-user-ext-rv32i2p1_m2p1.s [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp

index 95fcc77bea11e02e45e45c0d71fd49950477ef52..8f9f0d8a86a3a793b627b0de653b83a5df3338db 100644 (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)
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 (file)
index 669a139..0000000
+++ /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 (file)
index 365901d..0000000
+++ /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 (file)
index 49263bf..0000000
+++ /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 (file)
index 2f2638a..0000000
+++ /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 (file)
index 3dbf8a2..0000000
+++ /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 (file)
index 7bbc39f..0000000
+++ /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 (file)
index 2a921e6..0000000
+++ /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 (file)
index 6ef5ee5..0000000
+++ /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 (file)
index 0000000..d15bcdc
--- /dev/null
@@ -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 (file)
index 0000000..a7e0547
--- /dev/null
@@ -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 (file)
index 0000000..a1b61e3
--- /dev/null
@@ -0,0 +1 @@
+.attribute arch, "rv32i2p1_m2p1"
index 3d8950238a428f486a14a5a379d3e2f1ad5f8608..272424b33e367612c0af9cd49fc7256186b0f798 100644 (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"