From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt1-x844.google.com (mail-qt1-x844.google.com [IPv6:2607:f8b0:4864:20::844]) by sourceware.org (Postfix) with ESMTPS id 334403851C0A for ; Sat, 30 May 2020 08:44:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 334403851C0A 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-qt1-x844.google.com with SMTP id w90so3971303qtd.8 for ; Sat, 30 May 2020 01:44:42 -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=jbOnOMUz1juu/sJXPmhAiK1IJsnAONNBBga3mYlLvqw=; b=ixUcw5PuUiGcB9iigUzV+S7ZHOmdbkmDZhjVRWYsl2A55UeRT4mRfKWzARWCf77O46 97GCWSU1L6schbVB3y5ckYNxEq4ukvTMsQyJqG7YnrtaWRTC4+2OGjSB7/1aUSTjIbPY ZwbKS62WU3bMb7ntK12rbse39Kkj9ER7bwfFakNEN7naHjG/9/ovFERvqkoot7vH5Kd+ DVItvsapUGoQw6K+jyNLamcG19881Oq2IT6vSrM3bH7w+SHLBhMdAsv0L5eKvupZ8SvW w3yVFW7hJC28Z2356a7FaojxBDtTaydpAzd3b5QqP4SMDUSZKOXdnUy/URxyvBxCfy4W 7Q+Q== 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=jbOnOMUz1juu/sJXPmhAiK1IJsnAONNBBga3mYlLvqw=; b=QXo3YnlyKsgg5go6rOHsKDxvg3ncxKrsJ3GZRBxzPIRNJbZg/dokH+RFA5DzDSBUX9 H06/Br6FCz4EJpi6LbATfD1TlcGNTei03vjN7JPjj0nBQYUw4vAxOSj+ZTVM3RyJUpeI z7Jmc8v4LAU4KeIgw0fquJK4WCqDz239q4nw9aLCVoUu0Pl6d/rFa4d2tHWDr6gwhP3O 5phSUbzGF6ubqfZlzIAwG9CQzBgJ7mvgsICUIlhrE3HzjUWNTDlGU5hrVwag3qmE9wuj TeZnWutrhKxe1i0bssByAccED3cLbpIKJPInEN734REh60WtwzFdg+jKAjB26Myrinx5 KJiQ== X-Gm-Message-State: AOAM533v85EXSZRX0iHOTvj5MGiT6cD6kHmJzmrPiFDnE614+XWMC6yy I94HTuNxh4NvKQrHzJ0PMBSayIbkElX2UA== X-Google-Smtp-Source: ABdhPJxekd6o99RuBio+E6zY2UlhHT5BhyWs2oaMavjAq8Hy0Ye+F0iJNTxCfQgt7+UTT+w2eHra/w== X-Received: by 2002:ac8:306d:: with SMTP id g42mr12620862qte.18.1590828281382; Sat, 30 May 2020 01:44:41 -0700 (PDT) Received: from gamma05.internal.sifive.com ([64.62.193.194]) by smtp.gmail.com with ESMTPSA id d9sm9753265qtq.56.2020.05.30.01.44.40 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 30 May 2020 01:44:40 -0700 (PDT) From: Nelson Chu To: binutils@sourceware.org, jimw@sifive.com Subject: [PATCH 2/2] RISC-V: The object without priv spec attributes can be linked with any object. Date: Sat, 30 May 2020 01:44:35 -0700 Message-Id: <1590828275-5587-3-git-send-email-nelson.chu@sifive.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1590828275-5587-1-git-send-email-nelson.chu@sifive.com> References: <1590828275-5587-1-git-send-email-nelson.chu@sifive.com> X-Spam-Status: No, score=-13.1 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: Sat, 30 May 2020 08:44:44 -0000 bfd/ * elfnn-riscv.c (riscv_merge_attributes): Add new boolean priv_may_conflict, in_priv_zero and out_priv_zero to decide whether the object can be linked according to it's priv attributes. The object without any priv spec attributes can be linked with others. If the first input object doesn't contain any priv attributes, then we need to copy the setting from the next input one. Also report more detailed error messages to user. ld/ * testsuite/ld-riscv-elf/attr-merge-priv-spec.d: Rename to attr-merge-priv-spec-01.d. * testsuite/ld-riscv-elf/attr-merge-priv-spec-c.s: Set priv spec to 1.11. * testsuite/ld-riscv-elf/attr-merge-priv-spec-d.s: Empty priv spec setting. * testsuite/ld-riscv-elf/attr-merge-priv-spec-02.d: New testcase. * testsuite/ld-riscv-elf/attr-merge-priv-spec-03.d: Likewise. * testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-01.d: Likewise. * testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-02.d: Likewise. * testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-03.d: Likewise. * testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-04.d: Likewise. * testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-05.d: Likewise. * testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-06.d: Likewise. * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated. --- bfd/elfnn-riscv.c | 40 ++++++++++++++++++++-- .../ld-riscv-elf/attr-merge-priv-spec-01.d | 12 +++++++ .../ld-riscv-elf/attr-merge-priv-spec-02.d | 12 +++++++ .../ld-riscv-elf/attr-merge-priv-spec-03.d | 12 +++++++ ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-c.s | 2 ++ ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-d.s | 1 + .../ld-riscv-elf/attr-merge-priv-spec-failed-01.d | 5 +++ .../ld-riscv-elf/attr-merge-priv-spec-failed-02.d | 5 +++ .../ld-riscv-elf/attr-merge-priv-spec-failed-03.d | 6 ++++ .../ld-riscv-elf/attr-merge-priv-spec-failed-04.d | 6 ++++ .../ld-riscv-elf/attr-merge-priv-spec-failed-05.d | 6 ++++ .../ld-riscv-elf/attr-merge-priv-spec-failed-06.d | 6 ++++ ld/testsuite/ld-riscv-elf/attr-merge-priv-spec.d | 12 ------- ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 10 +++++- 14 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-01.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-02.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-03.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-c.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-d.s create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-01.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-02.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-03.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-04.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-05.d create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-06.d delete mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-priv-spec.d diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 5fa6e35..9aed2a0 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -3067,6 +3067,9 @@ riscv_merge_attributes (bfd *ibfd, struct bfd_link_info *info) obj_attribute *in_attr; obj_attribute *out_attr; bfd_boolean result = TRUE; + bfd_boolean priv_may_conflict = FALSE; + bfd_boolean in_priv_zero = TRUE; + bfd_boolean out_priv_zero = TRUE; const char *sec_name = get_elf_backend_data (ibfd)->obj_attrs_section; unsigned int i; @@ -3121,20 +3124,52 @@ riscv_merge_attributes (bfd *ibfd, struct bfd_link_info *info) out_attr[Tag_RISCV_arch].s = merged_arch; } break; + case Tag_RISCV_priv_spec: case Tag_RISCV_priv_spec_minor: case Tag_RISCV_priv_spec_revision: + if (in_attr[i].i != 0) + in_priv_zero = FALSE; + if (out_attr[i].i != 0) + out_priv_zero = FALSE; if (out_attr[i].i != in_attr[i].i) + priv_may_conflict = TRUE; + + /* We check the priv version conflict when parsing the + revision version. */ + if (i != Tag_RISCV_priv_spec_revision) + break; + + /* Allow to link the object wihtout the priv setting. */ + if (out_priv_zero) + { + out_attr[i].i = in_attr[i].i; + out_attr[Tag_RISCV_priv_spec].i = + in_attr[Tag_RISCV_priv_spec].i; + out_attr[Tag_RISCV_priv_spec_minor].i = + in_attr[Tag_RISCV_priv_spec_minor].i; + } + else if (!in_priv_zero + && priv_may_conflict) { _bfd_error_handler - (_("error: %pB: conflicting priv spec version " - "(major/minor/revision)."), ibfd); + (_("error: %pB use privilege spec version %u.%u.%u but " + "the output use version %u.%u.%u."), + ibfd, + in_attr[Tag_RISCV_priv_spec].i, + in_attr[Tag_RISCV_priv_spec_minor].i, + in_attr[i].i, + out_attr[Tag_RISCV_priv_spec].i, + out_attr[Tag_RISCV_priv_spec_minor].i, + out_attr[i].i); result = FALSE; } break; + case Tag_RISCV_unaligned_access: out_attr[i].i |= in_attr[i].i; break; + case Tag_RISCV_stack_align: if (out_attr[i].i == 0) out_attr[i].i = in_attr[i].i; @@ -3149,6 +3184,7 @@ riscv_merge_attributes (bfd *ibfd, struct bfd_link_info *info) result = FALSE; } break; + default: result &= _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i); } diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-01.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-01.d new file mode 100644 index 0000000..0aa6fe0 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-01.d @@ -0,0 +1,12 @@ +#source: attr-merge-priv-spec-a.s +#source: attr-merge-priv-spec-b.s +#as: -march-attr +#ld: -r +#readelf: -A + +Attribute Section: riscv +File Attributes + Tag_RISCV_arch: [a-zA-Z0-9_\"].* + Tag_RISCV_priv_spec: 1 + Tag_RISCV_priv_spec_minor: 9 + Tag_RISCV_priv_spec_revision: 1 diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-02.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-02.d new file mode 100644 index 0000000..0ac4ca7 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-02.d @@ -0,0 +1,12 @@ +#source: attr-merge-priv-spec-a.s +#source: attr-merge-priv-spec-d.s +#as: -march-attr +#ld: -r +#readelf: -A + +Attribute Section: riscv +File Attributes + Tag_RISCV_arch: [a-zA-Z0-9_\"].* + Tag_RISCV_priv_spec: 1 + Tag_RISCV_priv_spec_minor: 9 + Tag_RISCV_priv_spec_revision: 1 diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-03.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-03.d new file mode 100644 index 0000000..6950483 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-03.d @@ -0,0 +1,12 @@ +#source: attr-merge-priv-spec-d.s +#source: attr-merge-priv-spec-a.s +#as: -march-attr +#ld: -r +#readelf: -A + +Attribute Section: riscv +File Attributes + Tag_RISCV_arch: [a-zA-Z0-9_\"].* + Tag_RISCV_priv_spec: 1 + Tag_RISCV_priv_spec_minor: 9 + Tag_RISCV_priv_spec_revision: 1 diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-c.s b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-c.s new file mode 100644 index 0000000..7ea3185 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-c.s @@ -0,0 +1,2 @@ + .attribute priv_spec, 1 + .attribute priv_spec_minor, 11 diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-d.s b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-d.s new file mode 100644 index 0000000..37fddd0 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-d.s @@ -0,0 +1 @@ +# Empty priv attributes setting. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-01.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-01.d new file mode 100644 index 0000000..c52ebac --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-01.d @@ -0,0 +1,5 @@ +#source: attr-merge-priv-spec-a.s +#source: attr-merge-priv-spec-c.s +#as: +#ld: -r +#error: .*use privilege spec version 1.11.0 but the output use version 1.9.1. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-02.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-02.d new file mode 100644 index 0000000..fc00145 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-02.d @@ -0,0 +1,5 @@ +#source: attr-merge-priv-spec-c.s +#source: attr-merge-priv-spec-a.s +#as: +#ld: -r +#error: .*use privilege spec version 1.9.1 but the output use version 1.11.0. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-03.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-03.d new file mode 100644 index 0000000..1d40e90 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-03.d @@ -0,0 +1,6 @@ +#source: attr-merge-priv-spec-a.s +#source: attr-merge-priv-spec-d.s +#source: attr-merge-priv-spec-c.s +#as: +#ld: -r +#error: .*use privilege spec version 1.11.0 but the output use version 1.9.1. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-04.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-04.d new file mode 100644 index 0000000..0efee3c --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-04.d @@ -0,0 +1,6 @@ +#source: attr-merge-priv-spec-d.s +#source: attr-merge-priv-spec-a.s +#source: attr-merge-priv-spec-c.s +#as: +#ld: -r +#error: .*use privilege spec version 1.11.0 but the output use version 1.9.1. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-05.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-05.d new file mode 100644 index 0000000..5b9b8d0 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-05.d @@ -0,0 +1,6 @@ +#source: attr-merge-priv-spec-c.s +#source: attr-merge-priv-spec-d.s +#source: attr-merge-priv-spec-a.s +#as: +#ld: -r +#error: .*use privilege spec version 1.9.1 but the output use version 1.11.0. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-06.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-06.d new file mode 100644 index 0000000..dab7eb6 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec-failed-06.d @@ -0,0 +1,6 @@ +#source: attr-merge-priv-spec-d.s +#source: attr-merge-priv-spec-c.s +#source: attr-merge-priv-spec-a.s +#as: +#ld: -r +#error: .*use privilege spec version 1.9.1 but the output use version 1.11.0. diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec.d b/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec.d deleted file mode 100644 index 0aa6fe0..0000000 --- a/ld/testsuite/ld-riscv-elf/attr-merge-priv-spec.d +++ /dev/null @@ -1,12 +0,0 @@ -#source: attr-merge-priv-spec-a.s -#source: attr-merge-priv-spec-b.s -#as: -march-attr -#ld: -r -#readelf: -A - -Attribute Section: riscv -File Attributes - Tag_RISCV_arch: [a-zA-Z0-9_\"].* - Tag_RISCV_priv_spec: 1 - Tag_RISCV_priv_spec_minor: 9 - Tag_RISCV_priv_spec_revision: 1 diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 0e9750e..1a0c68f 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -35,9 +35,17 @@ if [istarget "riscv*-*-*"] { run_dump_test "attr-merge-strict-align-04" run_dump_test "attr-merge-strict-align-05" run_dump_test "attr-merge-stack-align" - run_dump_test "attr-merge-priv-spec" + 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-stack-align-failed" + run_dump_test "attr-merge-priv-spec-failed-01" + run_dump_test "attr-merge-priv-spec-failed-02" + run_dump_test "attr-merge-priv-spec-failed-03" + run_dump_test "attr-merge-priv-spec-failed-04" + run_dump_test "attr-merge-priv-spec-failed-05" + run_dump_test "attr-merge-priv-spec-failed-06" run_ld_link_tests { { "Weak reference 32" "-T weakref.ld -melf32lriscv" "" "-march=rv32i -mabi=ilp32" {weakref32.s} -- 2.7.4