From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <3pIHOYgcKCP0rfxpwf3lttlqj.htrgnszynqxxtzwhj1fwj.twl@flex--maskray.bounces.google.com> Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by sourceware.org (Postfix) with ESMTPS id 08F3E3858418 for ; Wed, 13 Jul 2022 08:26:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 08F3E3858418 Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-31cb93cadf2so89320727b3.11 for ; Wed, 13 Jul 2022 01:26:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=DnNIeI+UalgrxExnm9fO/S9rctZPpvv4loZNON5f/Es=; b=OKciijoUGIw/u4CiPveBYGP9V+nKrJU7vC+PKL9pg/jnlqMEXpJ7HVQ2/kir5KUDqW X9MNXMssSrfqZfD+MFv/VoIp9v3n8cdOawC6LiapQpv26OCJHpDDiuASWlywx7ME+c+m K/xYcahenpdz4DuxsQ6qX5s77Plhtxasu2DXy6mQ5dkUtwXUU/pXVWzNpRD3PxksBLob r4nlBEI5F+1libEYoqLUwgNB+buNPX9WkLUyCgR1g1wszDq4urJA6pDxejel8YfO+TB2 KEfFiokgv2qbuV9FeHdM89K0k4JYjPo/cGXK7X+bWCIm9ThfKWWwp1Njhf7N+SSFnDop fhFQ== X-Gm-Message-State: AJIora/B0Tf8B+wiXURFG46/ct1Q1USpkXsbdXXzv8Vg3oMpULdcN5Sd XHhRZlweMrzIDRaG+aYOto95zCT7JPEGvGYneWWAo8F27NVQBgZypY5K1FitfI4Z36V1SuUvvkS 2iVATu1UPVBiY4qFTPnr57g8ex/zpjXI2Nmgzd86xI1SJTozynuIdVUqrgLby/V9PgA== X-Google-Smtp-Source: AGRyM1t6tFudMBTd8aGtwa0CfYk/pe/eKvwtUKADnN3gNzcf6gJoAuVKIigQHZxVSr32yJHbjEHd0ykrtPSc X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:cb57:40d9:54fc:4f8]) (user=maskray job=sendgmr) by 2002:a25:2d42:0:b0:66e:b1b0:1ba7 with SMTP id s2-20020a252d42000000b0066eb1b01ba7mr2412431ybe.171.1657700772345; Wed, 13 Jul 2022 01:26:12 -0700 (PDT) Date: Wed, 13 Jul 2022 01:26:08 -0700 Message-Id: <20220713082608.1695497-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH] RISC-V: Add --[no-]relax-gp to ld From: Fangrui Song To: binutils@sourceware.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-19.6 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL 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.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Jul 2022 08:26:15 -0000 From: Fangrui Song --relax enables all relaxations. --no-relax-gp disables GP relaxation to allow measuring its effect. Link: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/issues/298 bfd/ * elfnn-riscv.c (struct riscv_elf_link_hash_table): Add params. (riscv_elfNN_set_options): New. (riscv_info_to_howto_rela): Check relax_gp. (_bfd_riscv_relax_section): Likewise. * elfxx-riscv.h (struct riscv_elf_params): New. (riscv_elf32_set_options): New. (riscv_elf64_set_options): New. ld/ * emultempl/riscvelf.em: Add option parsing. * testsuite/ld-riscv-elf/code-model-relax-medlow-01-norelaxgp.d: New. * testsuite/ld-riscv-elf/pcgp-relax-01-norelaxgp.d: New. * testsuite/ld-riscv-elf/pcgp-relax-02.d: Test --relax --relax-gp can be used together. --- bfd/elfnn-riscv.c | 22 ++++++++++--- bfd/elfxx-riscv.h | 11 +++++++ ld/emultempl/riscvelf.em | 31 +++++++++++++++++++ .../code-model-relax-medlow-01-norelaxgp.d | 4 +++ ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 2 ++ .../ld-riscv-elf/pcgp-relax-01-norelaxgp.d | 18 +++++++++++ ld/testsuite/ld-riscv-elf/pcgp-relax-02.d | 2 +- 7 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 ld/testsuite/ld-riscv-elf/code-model-relax-medlow-01-norelaxgp.d create mode 100644 ld/testsuite/ld-riscv-elf/pcgp-relax-01-norelaxgp.d diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 8f9f0d8a86a..527c3e74e97 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -118,6 +118,9 @@ struct riscv_elf_link_hash_table { struct elf_link_hash_table elf; + /* Various options and other info passed from the linker. */ + struct riscv_elf_params *params; + /* Short-cuts to get to dynamic linker sections. */ asection *sdyntdata; @@ -157,6 +160,13 @@ struct riscv_elf_link_hash_table && elf_hash_table_id (elf_hash_table (p)) == RISCV_ELF_DATA) \ ? (struct riscv_elf_link_hash_table *) (p)->hash : NULL) +void +riscv_elfNN_set_options (struct bfd_link_info *link_info, + struct riscv_elf_params *params) +{ + riscv_elf_hash_table (link_info)->params = params; +} + static bool riscv_info_to_howto_rela (bfd *abfd, arelent *cache_ptr, @@ -4289,7 +4299,9 @@ _bfd_riscv_relax_lui (bfd *abfd, bool undefined_weak) { bfd_byte *contents = elf_section_data (sec)->this_hdr.contents; - bfd_vma gp = riscv_global_pointer_value (link_info); + bfd_vma gp = riscv_elf_hash_table (link_info)->params->relax_gp + ? riscv_global_pointer_value (link_info) + : 0; int use_rvc = elf_elfheader (abfd)->e_flags & EF_RISCV_RVC; BFD_ASSERT (rel->r_offset + 4 <= sec->size); @@ -4754,10 +4766,10 @@ _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) - && (type == R_RISCV_PCREL_HI20 - || type == R_RISCV_PCREL_LO12_I - || type == R_RISCV_PCREL_LO12_S)) + else if ((type == R_RISCV_PCREL_HI20 || type == R_RISCV_PCREL_LO12_I + || type == R_RISCV_PCREL_LO12_S) + && !bfd_link_pic (info) + && riscv_elf_hash_table (info)->params->relax_gp) relax_func = _bfd_riscv_relax_pc; else continue; diff --git a/bfd/elfxx-riscv.h b/bfd/elfxx-riscv.h index ea7126bdb4d..f9bd0ad882c 100644 --- a/bfd/elfxx-riscv.h +++ b/bfd/elfxx-riscv.h @@ -27,6 +27,17 @@ #define RISCV_UNKNOWN_VERSION -1 +struct riscv_elf_params +{ + /* Whether to relax code sequences to GP-relative addressing. */ + bool relax_gp; +}; + +extern void riscv_elf32_set_options (struct bfd_link_info *, + struct riscv_elf_params *); +extern void riscv_elf64_set_options (struct bfd_link_info *, + struct riscv_elf_params *); + extern reloc_howto_type * riscv_reloc_name_lookup (bfd *, const char *); diff --git a/ld/emultempl/riscvelf.em b/ld/emultempl/riscvelf.em index 645a807f239..37a0fd08e96 100644 --- a/ld/emultempl/riscvelf.em +++ b/ld/emultempl/riscvelf.em @@ -25,6 +25,35 @@ fragment <: +.*:[ ]+[0-9a-f]+[ ]+addi[ ]+a0,a0,[0-9]+ +.*:[ ]+[0-9a-f]+[ ]+jal[ ]+ra,[0-9a-f]+ <_start> +.*:[ ]+[0-9a-f]+[ ]+auipc[ ]+a1,0x[0-9a-f]+ +.*:[ ]+[0-9a-f]+[ ]+addi[ ]+a1,a1,[0-9]+ # [0-9a-f]+ +.*:[ ]+[0-9a-f]+[ ]+lui[ ]+a2,0x[0-9a-f]+ +.*:[ ]+[0-9a-f]+[ ]+addi[ ]+a2,a2,[0-9]+ # [0-9a-f]+ +.*:[ ]+[0-9a-f]+[ ]+addi[ ]+a3,tp,0 # 0 +.*:[ ]+[0-9a-f]+[ ]+auipc[ ]+a0,0x[0-9a-f]+ diff --git a/ld/testsuite/ld-riscv-elf/pcgp-relax-02.d b/ld/testsuite/ld-riscv-elf/pcgp-relax-02.d index c6c73c54265..984d457aed9 100644 --- a/ld/testsuite/ld-riscv-elf/pcgp-relax-02.d +++ b/ld/testsuite/ld-riscv-elf/pcgp-relax-02.d @@ -1,6 +1,6 @@ #source: pcgp-relax-02.s #as: -#ld: --relax +#ld: --relax --relax-gp #objdump: -d .*:[ ]+file format .* -- 2.37.0.144.g8ac04bfd2-goog