+2020-09-03 Nelson Chu <nelson.chu@sifive.com>
+
+ * elfnn-riscv.c (riscv_version_mismatch): Change the return type
+ from void to bfd_boolean. Report warnings rather than errors
+ when the ISA versions are mis-matched. Afterwards, remember to
+ update the output ISA versions to the newest ones.
+ (riscv_merge_std_ext): Allow to link objects with different
+ standard ISA versions. Try to add output ISA versions to
+ merged_subsets first.
+ (riscv_merge_multi_letter_ext): Likewise. But for standard additional
+ ISA and non-standard ISA versions.
+
2020-09-03 Kito Cheng <kito.cheng@sifive.com>
* elfnn-riscv.c (riscv_merge_std_ext): Fix to report the correct
return (strlen (name) == 1) && (name[0] != 'x') && (name[0] != 's');
}
-/* Error handler when version mis-match. */
+/* Check if the versions are compatible. */
-static void
+static bfd_boolean
riscv_version_mismatch (bfd *ibfd,
struct riscv_subset_t *in,
struct riscv_subset_t *out)
{
- _bfd_error_handler
- (_("error: %pB: Mis-matched ISA version for '%s' extension. "
- "%d.%d vs %d.%d"),
- ibfd, in->name,
- in->major_version, in->minor_version,
- out->major_version, out->minor_version);
+ if (in == NULL || out == NULL)
+ return TRUE;
+
+ /* 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)
+ {
+ _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;
+ }
+ }
+
+ return TRUE;
}
/* Return true if subset is 'i' or 'e'. */
ibfd, in->name, out->name);
return FALSE;
}
- else if ((in->major_version != out->major_version) ||
- (in->minor_version != out->minor_version))
- {
- /* TODO: Allow different merge policy. */
- riscv_version_mismatch (ibfd, in, out);
- return FALSE;
- }
+ else if (!riscv_version_mismatch (ibfd, in, out))
+ return FALSE;
else
riscv_add_subset (&merged_subsets,
- in->name, in->major_version, in->minor_version);
+ out->name, out->major_version, out->minor_version);
in = in->next;
out = out->next;
if (find_in == NULL && find_out == NULL)
continue;
- /* Check version is same or not. */
- /* TODO: Allow different merge policy. */
- if ((find_in != NULL && find_out != NULL)
- && ((find_in->major_version != find_out->major_version)
- || (find_in->minor_version != find_out->minor_version)))
- {
- riscv_version_mismatch (ibfd, find_in, find_out);
- return FALSE;
- }
+ if (!riscv_version_mismatch (ibfd, find_in, find_out))
+ return FALSE;
- struct riscv_subset_t *merged = find_in ? find_in : find_out;
+ struct riscv_subset_t *merged = find_out ? find_out : find_in;
riscv_add_subset (&merged_subsets, merged->name,
merged->major_version, merged->minor_version);
}
else
{
/* Both present, check version and increment both. */
- if ((in->major_version != out->major_version)
- || (in->minor_version != out->minor_version))
- {
- riscv_version_mismatch (ibfd, in, out);
- return FALSE;
- }
+ if (!riscv_version_mismatch (ibfd, in, out))
+ return FALSE;
riscv_add_subset (&merged_subsets, out->name, out->major_version,
out->minor_version);
+2020-09-03 Nelson Chu <nelson.chu@sifive.com>
+
+ * testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Update the
+ message from error to warning.
+ * testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d: New testcases.
+ * 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/ld-riscv-elf.exp: Updated.
+
2020-09-03 Kito Cheng <kito.cheng@sifive.com>
* testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d: Updated.
--- /dev/null
+#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 -melf32lriscv
+#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_xunknown4p0"
+#..