aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elfnn-riscv.c71
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d8
-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/ld-riscv-elf.exp1
10 files changed, 101 insertions, 33 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8703aeb..3bf4d29 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+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
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index f8de719..83d4e63 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -2618,19 +2618,42 @@ riscv_std_ext_p (const char *name)
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'. */
@@ -2692,16 +2715,11 @@ riscv_merge_std_ext (bfd *ibfd,
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;
@@ -2718,17 +2736,10 @@ riscv_merge_std_ext (bfd *ibfd,
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);
}
@@ -2812,12 +2823,8 @@ riscv_merge_multi_letter_ext (bfd *ibfd,
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);
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 4bba884..185f37b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,14 @@
+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.
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
index 8a9c092..4b31238 100644
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d
@@ -2,4 +2,10 @@
#source: attr-merge-arch-failed-01b.s
#as: -march-attr
#ld: -r -melf32lriscv
-#error: Mis-matched ISA version for 'a' extension. 3.0 vs 2.0
+#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-02.d b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d
new file mode 100644
index 0000000..880ee15
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d
@@ -0,0 +1,27 @@
+#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"
+#..
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
new file mode 100644
index 0000000..3dbf8a2
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s
@@ -0,0 +1 @@
+ .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
new file mode 100644
index 0000000..7bbc39f
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s
@@ -0,0 +1 @@
+ .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
new file mode 100644
index 0000000..2a921e6
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s
@@ -0,0 +1 @@
+ .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
new file mode 100644
index 0000000..6ef5ee5
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s
@@ -0,0 +1 @@
+ .attribute arch, "rv32i4p6_m4p7_a4p8_zicsr4p9_xunknown4p0"
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
index 1a0c68f..2c008d4 100644
--- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
+++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
@@ -39,6 +39,7 @@ if [istarget "riscv*-*-*"] {
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-stack-align-failed"
run_dump_test "attr-merge-priv-spec-failed-01"
run_dump_test "attr-merge-priv-spec-failed-02"