From patchwork Sat Oct 14 05:03:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tsukasa OI X-Patchwork-Id: 152897 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2908:b0:403:3b70:6f57 with SMTP id ib8csp2305915vqb; Fri, 13 Oct 2023 22:03:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEXcjXoJ1glr+qC+0+2ZDWA8ggeZz9o1vkeMbcmAKDdC8e3EpgXIGOEmP7WptykEZ9wnNez X-Received: by 2002:ac8:1383:0:b0:418:11de:ce1 with SMTP id h3-20020ac81383000000b0041811de0ce1mr25584564qtj.24.1697259837429; Fri, 13 Oct 2023 22:03:57 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1697259837; cv=pass; d=google.com; s=arc-20160816; b=reGBgtpblsG0ZYYWOufOXZLVEZkViEbPgAb6pVobNBXys42FJ1khSSf214TW4mllco 9o/JaGFl/xw1BUZS+3ZoTqnKPJ6nqhaLWaewEina77b0uAPNkZfzpMMozx/z4AdVRBWg hfYYHk5LzIok+dWY1aml1IjpARP/sm8fGqDsq1VP+3Ju08+BzPaHxV43zmF9hY7XTn0R sMQWGfwiINFgM9WPWfgOIN/C0K01Djf+m5hXQTj62772pspdU8bNb5nCyk51kiRYs750 BMO92JKPc1ycB+EGNDnVCuyUnywDgCsIEQkIU4qnOMvQSNvMBxMl5I4QCtX3wyzZIfax mOtQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:dmarc-filter:arc-filter:delivered-to; bh=PqOf4wByx4soVQoeC9mMLesAEUJ4c6BFbGklwcykFYw=; fh=Q+ZPQdyJDzJx4BfovHNTR1lP4msTSfN6TDra8V1lyf8=; b=D2gVMqegPFuAhX9gmapDg01opfZ4v0PXxI3Y03fTttLZw6AiLPRI0VZwJDJoePqErD H2zr4oePWfxhBeeW+Ya1l6Nuaswx686f73AjMcXZbV14tdtha8G7Vl0wgFso48ujD2KE /C/OVRRS+FO1BWb6m3tFGmHtaZT3E3E1+iL0gfHh1ztKIgnAB7l7N134p6fnFKBS3cMX iKWqQAP1ckXnYgpt7Nc+p8aq5x5pQy2XLQmKL73mGZNvQXFOr005FwIiEMduSRfOzMRQ jZGVayT9meOMHSNFUsOqikHdPJIRZdxfZ38MWyWMRgQrcnob5/+Eg5jLAdYuHS/cQd/Z sn7A== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@irq.a4lg.com header.s=2017s01 header.b=aiJ9TcT9; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=irq.a4lg.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id o11-20020a05622a008b00b004182092dcacsi2237116qtw.321.2023.10.13.22.03.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Oct 2023 22:03:57 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@irq.a4lg.com header.s=2017s01 header.b=aiJ9TcT9; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=irq.a4lg.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 377AC3857725 for ; Sat, 14 Oct 2023 05:03:57 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-sender-0.a4lg.com (mail-sender.a4lg.com [153.120.152.154]) by sourceware.org (Postfix) with ESMTPS id 9BA1A385771C for ; Sat, 14 Oct 2023 05:03:50 +0000 (GMT) ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9BA1A385771C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=153.120.152.154 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697259832; cv=none; b=EaXTljLxLrNN43WJpJD2cBj+X+EfzZ5h13eq9q2OUTq1Tr3XtzGx8Cb79uK552akWNEquEEOJUd24v1H9qFY5eiFVbf6ZdjfjpdN1GxRcH7sQRe7YubTGWGYUsqBdt9zRlnOq9c92KWwAziJDBmhaNn+ffr863eVMjMFxDmWlXQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697259832; c=relaxed/simple; bh=S1NvQq5pXdEGsN9f8bSa8PKAJxZA70CbfvMwaohNoo0=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:Mime-Version; b=Tw1ZYzm2lVz3dph3OTpVBE97sh+AzIC8mUSv8Tt7LjMjqu7Sr/hzu6bh982rmP43C3bFmtHFbsd1zkjJrr37w4Zxfn/oXIpf1XaDusa0VWQMPfliR624U3QsB5KTVzciIQk/6Bq8qK8OR4jcV34IYXsrUconZ+4foCHngtywQuw= ARC-Authentication-Results: i=1; server2.sourceware.org DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9BA1A385771C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=irq.a4lg.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=irq.a4lg.com Received: from [127.0.0.1] (localhost [127.0.0.1]) by mail-sender-0.a4lg.com (Postfix) with ESMTPSA id 70A77300089; Sat, 14 Oct 2023 05:03:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irq.a4lg.com; s=2017s01; t=1697259826; bh=PqOf4wByx4soVQoeC9mMLesAEUJ4c6BFbGklwcykFYw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Mime-Version:Content-Transfer-Encoding; b=aiJ9TcT9DSZzwwCb6IUoS0QvV6VzcCAA7NdjdyCYxgrKQJ2EZC3DVYYZZDg8TZwMv WGtMkHFYvBmySA/OnwlGk3OvqGWYE7VQxIWma+JozmVQFxS9EtkCNhY/tAnBz5HMFF wABgut5zc81b8Rrlubkew2rNiXIU5XMZCSOAKwZ4= From: Tsukasa OI To: Tsukasa OI , Palmer Dabbelt , Andrew Waterman , Jim Wilson , Nelson Chu , Kito Cheng Cc: binutils@sourceware.org Subject: [PATCH 1/2] RISC-V: Group relaxation features Date: Sat, 14 Oct 2023 05:03:21 +0000 Message-ID: <08e0064b49da8f235f75a45cc04a55e242edca97.1697259797.git.research_trasio@irq.a4lg.com> In-Reply-To: References: Mime-Version: 1.0 X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, KAM_MANYTO, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1779705931080849366 X-GMAIL-MSGID: 1779705931080849366 From: Tsukasa OI It does not only deduplicate multiple relaxation feature detection, but enable more complex features so that querying the feature availability will get too slow if we perform it per-relocation (not per-section). Even if that wouldn't happen any time soon, it will improve the maintainability around the linker relaxation code. bfd/ChangeLog: * elfnn-riscv.c (RISCV_RELAX_RVC, RISCV_RELAX_GP): New. (relax_func_t): Add new relax_features argument. (_bfd_riscv_relax_call): Likewise. Move feature detection to _bfd_riscv_relax_section. Use bool for simplicity. (_bfd_riscv_relax_lui): Likewise. Move feature detection to _bfd_riscv_relax_section. (_bfd_riscv_relax_tls_le): Likewise but features are not used. (_bfd_riscv_relax_align): Likewise but features are not used. (_bfd_riscv_relax_pc): Likewise. Move feature detection to _bfd_riscv_relax_section. (_bfd_riscv_relax_section): Detect relaxation-related features and pass the flags to each relaxation function. --- bfd/elfnn-riscv.c | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 09aa7be225ef..15652a08296d 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -4085,6 +4085,10 @@ _bfd_riscv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) return false; } +/* Enabled relaxation features to use. */ +#define RISCV_RELAX_RVC 0x01U +#define RISCV_RELAX_GP 0x02U + /* A second format for recording PC-relative hi relocations. This stores the information required to relax them to GP-relative addresses. */ @@ -4471,7 +4475,8 @@ typedef bool (*relax_func_t) (bfd *, asection *, asection *, Elf_Internal_Rela *, bfd_vma, bfd_vma, bfd_vma, bool *, riscv_pcgp_relocs *, - bool undefined_weak); + bool undefined_weak, + unsigned relax_features); /* Relax AUIPC + JALR into JAL. */ @@ -4484,13 +4489,15 @@ _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec, bfd_vma reserve_size ATTRIBUTE_UNUSED, bool *again, riscv_pcgp_relocs *pcgp_relocs, - bool undefined_weak ATTRIBUTE_UNUSED) + bool undefined_weak ATTRIBUTE_UNUSED, + unsigned relax_features) { bfd_byte *contents = elf_section_data (sec)->this_hdr.contents; bfd_vma foff = symval - (sec_addr (sec) + rel->r_offset); bool near_zero = (symval + RISCV_IMM_REACH / 2) < RISCV_IMM_REACH; + bool rvc = (relax_features & RISCV_RELAX_RVC) != 0; bfd_vma auipc, jalr; - int rd, r_type, len = 4, rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC; + int rd, r_type, len = 4; /* If the call crosses section boundaries, an alignment directive could cause the PC-relative offset to later increase, so we need to add in the @@ -4590,15 +4597,16 @@ _bfd_riscv_relax_lui (bfd *abfd, bfd_vma reserve_size, bool *again, riscv_pcgp_relocs *pcgp_relocs, - bool undefined_weak) + bool undefined_weak, + unsigned relax_features) { struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (link_info); bfd_byte *contents = elf_section_data (sec)->this_hdr.contents; /* Can relax to x0 even when gp relaxation is disabled. */ - bfd_vma gp = htab->params->relax_gp + bfd_vma gp = (relax_features & RISCV_RELAX_GP) != 0 ? riscv_global_pointer_value (link_info) : 0; - int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC; + bool use_rvc = (relax_features & RISCV_RELAX_RVC) != 0; BFD_ASSERT (rel->r_offset + 4 <= sec->size); @@ -4703,7 +4711,8 @@ _bfd_riscv_relax_tls_le (bfd *abfd, bfd_vma reserve_size ATTRIBUTE_UNUSED, bool *again, riscv_pcgp_relocs *pcgp_relocs, - bool undefined_weak ATTRIBUTE_UNUSED) + bool undefined_weak ATTRIBUTE_UNUSED, + unsigned relax_features ATTRIBUTE_UNUSED) { /* See if this symbol is in range of tp. */ if (RISCV_CONST_HIGH_PART (tpoff (link_info, symval)) != 0) @@ -4745,7 +4754,8 @@ _bfd_riscv_relax_align (bfd *abfd, asection *sec, bfd_vma reserve_size ATTRIBUTE_UNUSED, bool *again ATTRIBUTE_UNUSED, riscv_pcgp_relocs *pcgp_relocs ATTRIBUTE_UNUSED, - bool undefined_weak ATTRIBUTE_UNUSED) + bool undefined_weak ATTRIBUTE_UNUSED, + unsigned relax_features ATTRIBUTE_UNUSED) { bfd_byte *contents = elf_section_data (sec)->this_hdr.contents; bfd_vma alignment = 1, pos; @@ -4805,11 +4815,12 @@ _bfd_riscv_relax_pc (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma reserve_size, bool *again, riscv_pcgp_relocs *pcgp_relocs, - bool undefined_weak) + bool undefined_weak, + unsigned relax_features) { struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (link_info); /* Can relax to x0 even when gp relaxation is disabled. */ - bfd_vma gp = htab->params->relax_gp + bfd_vma gp = (relax_features & RISCV_RELAX_GP) != 0 ? riscv_global_pointer_value (link_info) : 0; @@ -4965,6 +4976,13 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec, bfd_vma max_alignment, reserve_size = 0; riscv_pcgp_relocs pcgp_relocs; static asection *first_section = NULL; + unsigned relax_features = 0; + + /* Detect available/enabled relaxation features. */ + if (elf_elfheader (abfd)->e_flags & EF_RISCV_RVC) + relax_features |= RISCV_RELAX_RVC; + if (htab->params->relax_gp) + relax_features |= RISCV_RELAX_GP; *again = false; @@ -5208,7 +5226,7 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec, if (!relax_func (abfd, sec, sym_sec, info, rel, symval, max_alignment, reserve_size, again, - &pcgp_relocs, undefined_weak)) + &pcgp_relocs, undefined_weak, relax_features)) goto fail; }