diff options
author | Nelson Chu <nelson.chu@sifive.com> | 2020-08-18 17:48:34 +0800 |
---|---|---|
committer | Nelson Chu <nelson.chu@sifive.com> | 2020-09-03 11:11:51 +0800 |
commit | 32f0ce4db98eb1e8e1cc326d3a22ef0c436ae6fe (patch) | |
tree | d20388d7924e00b1f98f0ddf41711e4c927768eb /bfd/elfnn-riscv.c | |
parent | 72bd6912ea38224481f8bd0ed13b751e0fda4683 (diff) | |
download | gdb-32f0ce4db98eb1e8e1cc326d3a22ef0c436ae6fe.zip gdb-32f0ce4db98eb1e8e1cc326d3a22ef0c436ae6fe.tar.gz gdb-32f0ce4db98eb1e8e1cc326d3a22ef0c436ae6fe.tar.bz2 |
RISC-V: Report warnings rather than errors for the mis-matched ISA versions.
Same as the privileged spec attributes check - different ISA versions
should be compatible, unless there are some known conflicts. Therefore,
we should allow to link objects with different ISA versions, and update
the output ISA versions once the corresponding input ones are newer.
But it's better to also warn people that the conflicts may happen when
the ISA versions are mis-matched.
bfd/
* 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.
ld/
* 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.
Diffstat (limited to 'bfd/elfnn-riscv.c')
-rw-r--r-- | bfd/elfnn-riscv.c | 71 |
1 files changed, 39 insertions, 32 deletions
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); |