From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x52a.google.com (mail-pg1-x52a.google.com [IPv6:2607:f8b0:4864:20::52a]) by sourceware.org (Postfix) with ESMTPS id 7439E384640D for ; Thu, 20 Aug 2020 06:34:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7439E384640D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=nelson.chu@sifive.com Received: by mail-pg1-x52a.google.com with SMTP id i10so685654pgk.1 for ; Wed, 19 Aug 2020 23:34:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=R6FfzNQzKYh734JRayeoraFrJm/0k3EV3VuR3x2cInQ=; b=XIK7msQa6jmVB7Olq9Wbh2jZz0hu24VlVhaoR4XsYgRPsYh1y19XABaGN7nLP0Akso 1X2nZ+Ri2ZidMB3uL+/NMOf9ySYL76NtrN0YKaFB8cMEAJ8x85rFYtEgEBVlR88h/mx1 OLOiC0zrksk2Yii6VYv43EWVtu6atqwHwTGVS8N1Q54dEtRnNFS53TNNbyA9P8+8K0P2 KDOImELSUUUeybbEqzWZC0JayN/wVlhq/u/TbwkrgVOnOKSC84gGy6eKV+Yij8EOtLOc E95+JA2zP0LV4ep6iV+TpcjLRjozMkFTCtLzouM9FrAp6S3NgM9UoXRzQrM7b/i91EfJ N5HA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=R6FfzNQzKYh734JRayeoraFrJm/0k3EV3VuR3x2cInQ=; b=s3tul7+i+Ia7C1yYEOo9GfFDGHuvOU9Ep+o6kGjLwe99/E2lJ9V/cT9HbnJ/6poEkJ 8owtLgO5vM50zHC1QDpXkiBfYfoKPZwEVjFabwsdn6UR5jFYNqDvkktFDY5PQldhUh9c /MUVe91j2BBou6jwd04BajeozW5WOpsaJVONx9kSQj2hfywKgImND5ccGRWJ3lTK72mm iETyfqV/IrOAJbqBz4UapYlAUGfKsOd3PFQZvqLCxB674k/r/0s6duoxwl8XVLU9Hcw8 Xqwf+TYsCP4WaY+tvBlU0B8L280ZMoSP/wdabUu7egfV/ySSex5Co0T9/mwRm5kSCgfz xbeQ== X-Gm-Message-State: AOAM531MqPRkE2bRi4ofDB7C4/gYT4J3Nw18Vfb+YofulvTKgXnjmpMY ZUL41QrninbznKUV/BcTMunUMBK9SXFhiqhM X-Google-Smtp-Source: ABdhPJxoBD9ysauRkiEZp19bTZUbTeAju46eq7ZLFjInyFCjhhqcgbOtsKyp9rKfBhom1ywTfRJN9g== X-Received: by 2002:a63:501f:: with SMTP id e31mr1393255pgb.389.1597905288122; Wed, 19 Aug 2020 23:34:48 -0700 (PDT) Received: from gamma05.internal.sifive.com ([64.62.193.194]) by smtp.gmail.com with ESMTPSA id o38sm1245632pgb.38.2020.08.19.23.34.47 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 19 Aug 2020 23:34:47 -0700 (PDT) From: Nelson Chu To: binutils@sourceware.org Cc: jimw@sifive.com, kito.cheng@sifive.com, nelson.chu@sifive.com Subject: [PATCH 2/3] RISC-V: Report warnings rather than errors for the mis-matched ISA versions. Date: Wed, 19 Aug 2020 23:34:41 -0700 Message-Id: <1597905282-22927-3-git-send-email-nelson.chu@sifive.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1597905282-22927-1-git-send-email-nelson.chu@sifive.com> References: <1597905282-22927-1-git-send-email-nelson.chu@sifive.com> X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Aug 2020 06:34:51 -0000 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 sub 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. --- bfd/elfnn-riscv.c | 71 ++++++++++++---------- .../ld-riscv-elf/attr-merge-arch-failed-01.d | 8 ++- .../ld-riscv-elf/attr-merge-arch-failed-02.d | 27 ++++++++ .../ld-riscv-elf/attr-merge-arch-failed-02a.s | 1 + .../ld-riscv-elf/attr-merge-arch-failed-02b.s | 1 + .../ld-riscv-elf/attr-merge-arch-failed-02c.s | 1 + .../ld-riscv-elf/attr-merge-arch-failed-02d.s | 1 + ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 1 + 8 files changed, 78 insertions(+), 33 deletions(-) create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02a.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02b.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02c.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-02d.s diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index aa0141b..513785e 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -2616,19 +2616,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'. */ @@ -2690,16 +2713,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; @@ -2716,17 +2734,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); } @@ -2810,12 +2821,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/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d b/ld/testsuite/ld-riscv-elf/attr-merge-arch-failed-01.d index 8a9c092..435e827 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..3e43f68 --- /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" -- 2.7.4