From patchwork Sun Oct 15 00:44:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tsukasa OI X-Patchwork-Id: 152978 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2908:b0:403:3b70:6f57 with SMTP id ib8csp2715739vqb; Sat, 14 Oct 2023 17:44:43 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEcEQAO+oXX1fnT8U1AQeWF+BjNSCWuYUURfHwvoyM10oqeaMgOzZZqkpPricEzdbDI+KFg X-Received: by 2002:a05:620a:a98:b0:76f:1eac:e72d with SMTP id v24-20020a05620a0a9800b0076f1eace72dmr30361114qkg.38.1697330682932; Sat, 14 Oct 2023 17:44:42 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1697330682; cv=pass; d=google.com; s=arc-20160816; b=VV0aXQ4PABezqGpzgWT25pWoSmcwjSIuQznHg34+OB/1G3ifIwRNAisQyB/z3CevZI IMat9RG7nZ0PHTK2//95IH8tOUh5VCIfUTzt1oXEPP+9THmHoN/ELarEsw9pTgaerAdp VZKxqmPERmRCN1oH5lbaNdKCoK1q/a1Eik43NoAUyF8zR35YXz9v4pnXXVaKUJBlL9gJ xAuIWCsP+kyCuyhWUCw08zuKVrnoXyr+ZY2NTZPKllwh/zNY0YxpeIwR0zsYmvIJZEHy ZLUcLhqM7qC1NEgi4wj6iplI6cnd+n5erfwBevrQVLfSC0liz+/4iKNl4YNh8WoIO4aE J1oA== 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=hfIubmdGtzg9ADBfPkSQb3q8909FDLTTgOMWGebq6yA=; fh=Q+ZPQdyJDzJx4BfovHNTR1lP4msTSfN6TDra8V1lyf8=; b=HqhZYKZnv+zsBkfTTE5SUwFTAFfncaQIxTFMpLDOCIyKyPBj3GbPVefjRXWb1HYWtQ HcmqO6cJ78tERfxr5xWisrNWDGYhcwqrxiyX30Vy/g4Q7WglZq7QDlJm+AK/bd8ZleB7 kmiBHic6eHCisKbB5Jn+K7zTs8Y6wD6lyqj5OF/R6Bs8gelWehzw/WvXoD7qm5+Xgm+2 RveajznUxTqMT1PQXr6s9gNWdhEiTE7vzO7ARb67bY5zWRuhnW5z0MZl7vFO+Ta97Uf2 8LaTmK05jCdOCUkmzCLDn6s34x3cmxBXYb9vZcGhbnMo07qCAT4UZdF+8YTWEaZUVx4/ OSVg== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@irq.a4lg.com header.s=2017s01 header.b=TZtpatva; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id q22-20020a05620a0c9600b00776fb0c6b42si3347117qki.461.2023.10.14.17.44.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Oct 2023 17:44:42 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@irq.a4lg.com header.s=2017s01 header.b=TZtpatva; arc=pass (i=1); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 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 A39CA3858031 for ; Sun, 15 Oct 2023 00:44:42 +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 3AC2E3858C5F for ; Sun, 15 Oct 2023 00:44:36 +0000 (GMT) ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3AC2E3858C5F 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=1697330678; cv=none; b=bZ0JHhe7nwBcYQw/+1CX1bbHBeFbA8OlDmtvBNTcLqf/AggblRd7FodFWDR/BIsUdhWTSPdr8sPwFpxlKsCWhJk6LKQ+Hx8t5PoCwb105pMJZZIbPLDQLeitkYoUZ+9x8p37pFjxtJ2qRM2ruFBpdy1FBIJigARB1f7RMGoJW0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697330678; c=relaxed/simple; bh=Klwr/baGX8A5XlwSS1DFFl7TkzbBoG3lEpxRrsgW0I4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:Mime-Version; b=olLPhyWLipy6957WWOyCab1mR2O15z7ODSnMYHiYOxMW1ieZdkegHdDgJC9xTpnqYPwr8lVVGkxVScv86vpRhTtykP5I3pl0yVzSJt34XrLhjlNV0uSXb1l6yCzkMxVu+WMqqrte2mJS8IElc8rAhnbnRMOh0e3rKXNbJE8xETc= ARC-Authentication-Results: i=1; server2.sourceware.org DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3AC2E3858C5F 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 ACC27300089; Sun, 15 Oct 2023 00:44:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irq.a4lg.com; s=2017s01; t=1697330673; bh=hfIubmdGtzg9ADBfPkSQb3q8909FDLTTgOMWGebq6yA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Mime-Version:Content-Transfer-Encoding; b=TZtpatvawnc/mROo/OgoSFb8NnnQiYHcn4vdcJ0/x1/gdFkgHPqoRIu7ACZSn6h8I 0D+0RzZT6VTWInTwcFmasyZB+twobEBAO0KQGc0zhh75wMKPAEIiM2TkZ9zKp5Wdtd ckndedxPJaeovY1byYNn9Cimw+WfoNTbMjDWuELc= From: Tsukasa OI To: Tsukasa OI , Palmer Dabbelt , Andrew Waterman , Jim Wilson , Nelson Chu , Kito Cheng Cc: binutils@sourceware.org Subject: [PATCH v2 1/2] RISC-V: Group linker relaxation features Date: Sun, 15 Oct 2023 00:44:17 +0000 Message-ID: <9b8b01e1427cc0498fed6df25787af0da63cca47.1697330630.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: 1779780218558326717 X-GMAIL-MSGID: 1779780218558326717 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. Use the PIC feature flag generated by itself. --- bfd/elfnn-riscv.c | 50 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 09aa7be225ef..947a02d44478 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -4085,6 +4085,11 @@ _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 +#define RISCV_RELAX_PIC 0x04U + /* A second format for recording PC-relative hi relocations. This stores the information required to relax them to GP-relative addresses. */ @@ -4471,7 +4476,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 +4490,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 @@ -4505,7 +4513,8 @@ _bfd_riscv_relax_call (bfd *abfd, asection *sec, asection *sym_sec, } /* See if this function call can be shortened. */ - if (!VALID_JTYPE_IMM (foff) && !(!bfd_link_pic (link_info) && near_zero)) + if (!VALID_JTYPE_IMM (foff) + && !(!(relax_features & RISCV_RELAX_PIC) && near_zero)) return true; /* Shorten the function call. */ @@ -4590,15 +4599,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 +4713,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 +4756,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 +4817,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 +4978,15 @@ _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; + if (bfd_link_pic (info)) + relax_features |= RISCV_RELAX_PIC; *again = false; @@ -5032,7 +5054,7 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec, || type == R_RISCV_TPREL_LO12_I || type == R_RISCV_TPREL_LO12_S) relax_func = _bfd_riscv_relax_tls_le; - else if (!bfd_link_pic (info) + else if (!(relax_features & RISCV_RELAX_PIC) && (type == R_RISCV_PCREL_HI20 || type == R_RISCV_PCREL_LO12_I || type == R_RISCV_PCREL_LO12_S)) @@ -5145,7 +5167,7 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec, /* This line has to match the check in riscv_elf_relocate_section in the R_RISCV_CALL[_PLT] case. */ - if (bfd_link_pic (info) && h->plt.offset != MINUS_ONE) + if ((relax_features & RISCV_RELAX_PIC) && h->plt.offset != MINUS_ONE) { sym_sec = htab->elf.splt; symval = h->plt.offset; @@ -5208,7 +5230,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; }