From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by sourceware.org (Postfix) with ESMTPS id F3EDC38582BC for ; Wed, 13 Jul 2022 09:10:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org F3EDC38582BC Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=sifive.com Received: by mail-ed1-x536.google.com with SMTP id v12so13222115edc.10 for ; Wed, 13 Jul 2022 02:10:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=4I2tKXdDEfkgZ8B4AN7NFoQZh/Pm+qpAi64rZI7FoQ4=; b=ah5a3PqIGEaoVIa0ndZSAyxKjgQs6Zq1HrTV15CgBxZaZXSEfe0G4Ta7S4kYJP2rwq 6ydjjrLvmjCKdDBjrMM0kKW431XOimdMa47fVW2aQxC54uXQfn1tcfEbUMKOMUeN32NK oao0BPpQIryF0pQsT5bdqqRom1B0W2VvI9b3J+y6zkbsJYua9btScyqX39pZO1a+5ZUF b1s6vy5STYVPXRBK6Ybg9N/e6oMkirkIU+s80ObfoEi/0Uv83tvC38uLL0OZ8jVcipIh 6OBWEipG+EAp2+zrGlajbjmBaUC7/dECbVNFRs6UqqP4Ua4bcVHGXSdEENe5k7OeeAny gm2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=4I2tKXdDEfkgZ8B4AN7NFoQZh/Pm+qpAi64rZI7FoQ4=; b=3InfFRZvyYdQj9/e14ty/dpQn8mGpqAGiVKMn99dK7ph7zox9Zjz3Mv7NuYlC3xws/ E2iZpiVH7OPOpIR02gx9jlHZqWFHpHHTYRxLvEoheQb02z8rIRVavmT3by1hw+ZWaFjz xDs8p1+gn+ef0+s1cY4kyEjZW5flVtAP0ApIGZ2MEOajbbt0h4YLgujr3jYv7wv58WtM KUVxML+gxPdb2UMhxnGYbHuUSOJcQUtqaSGu2P+eaYaBp3hVFDb7Y44+cB4FyKwHM25n 86jBUXewAcA9ehW2pFq9ejqufzqwW791KFDzSwWanPbohOQX+mRoRQ6FPVlWgBsKndFx F0cg== X-Gm-Message-State: AJIora/eFSCnOtylQ98ldCu6YKDOV3RE9AKuX4BRgK2UXFdxpJgKgqBT OtM+Jmed5uCikFRkKFo/utW8jaSpdm7aAL5W X-Google-Smtp-Source: AGRyM1v4Aagwf/ZjH9bhHMUh5xKVfhv4v74C2fY7ZZYe0YJbgAHvIEIi5MnirmRO80PE53Reuuo7NQ== X-Received: by 2002:a05:6402:1d53:b0:43a:9ba7:315b with SMTP id dz19-20020a0564021d5300b0043a9ba7315bmr3406695edb.350.1657703413452; Wed, 13 Jul 2022 02:10:13 -0700 (PDT) Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com. [209.85.128.51]) by smtp.gmail.com with ESMTPSA id z41-20020a509e2c000000b0043a95981050sm7575432ede.79.2022.07.13.02.10.12 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 13 Jul 2022 02:10:12 -0700 (PDT) Received: by mail-wm1-f51.google.com with SMTP id p4so6139849wms.0 for ; Wed, 13 Jul 2022 02:10:12 -0700 (PDT) X-Received: by 2002:a05:600c:1401:b0:3a2:de4e:7537 with SMTP id g1-20020a05600c140100b003a2de4e7537mr2391643wmi.21.1657703412018; Wed, 13 Jul 2022 02:10:12 -0700 (PDT) MIME-Version: 1.0 References: <20220713082608.1695497-1-maskray@google.com> In-Reply-To: <20220713082608.1695497-1-maskray@google.com> From: Andrew Waterman Date: Wed, 13 Jul 2022 02:10:00 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] RISC-V: Add --[no-]relax-gp to ld To: Fangrui Song Cc: Binutils Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.8 required=5.0 tests=BAYES_00, 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 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 09:10:19 -0000 Wowza. On Wed, Jul 13, 2022 at 1:26 AM Fangrui Song via Binutils wrote: > > 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 < #include "elf/riscv.h" > #include "elfxx-riscv.h" > > +static struct riscv_elf_params params = { .relax_gp = 1 }; > +EOF > + > +# Define some shell vars to insert bits of code into the standard elf > +# parse_args and list_options functions. */ > +PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}' > +enum risccv_opt > +{ > + OPTION_RELAX_GP = 321, > + OPTION_NO_RELAX_GP, > +}; > +' > + > +PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}' > + { "relax-gp", no_argument, NULL, OPTION_RELAX_GP }, > + { "no-relax-gp", no_argument, NULL, OPTION_NO_RELAX_GP }, > +' > + > +PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}' > + case OPTION_RELAX_GP: > + params.relax_gp = 1; > + break; > + > + case OPTION_NO_RELAX_GP: > + params.relax_gp = 0; > + break; > +' > + > +fragment < static void > riscv_elf_before_allocation (void) > { > @@ -96,6 +125,8 @@ riscv_create_output_section_statements (void) > " whilst linking %s binaries\n"), "RISC-V"); > return; > } > + > + riscv_elf${ELFSIZE}_set_options (&link_info, ¶ms); > } > > EOF > diff --git a/ld/testsuite/ld-riscv-elf/code-model-relax-medlow-01-norelaxgp.d b/ld/testsuite/ld-riscv-elf/code-model-relax-medlow-01-norelaxgp.d > new file mode 100644 > index 00000000000..8e40cc5f32d > --- /dev/null > +++ b/ld/testsuite/ld-riscv-elf/code-model-relax-medlow-01-norelaxgp.d > @@ -0,0 +1,4 @@ > +#source: code-model.s > +#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1 > +#ld: -Tcode-model-01.ld -melf64lriscv --no-relax-gp --relax > +#error: .*relocation truncated to fit: R_RISCV_HI20 against `symbolL' > diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp > index 272424b33e3..1711d12ba23 100644 > --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp > +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp > @@ -122,6 +122,7 @@ if [istarget "riscv*-*-*"] { > run_dump_test "align-small-region" > run_dump_test "call-relax" > run_dump_test "pcgp-relax-01" > + run_dump_test "pcgp-relax-01-norelaxgp" > run_dump_test "pcgp-relax-02" > run_dump_test "c-lui" > run_dump_test "c-lui-2" > @@ -141,6 +142,7 @@ if [istarget "riscv*-*-*"] { > run_dump_test "code-model-medany-weakref-01" > run_dump_test "code-model-medany-weakref-02" > run_dump_test "code-model-relax-medlow-01" > + run_dump_test "code-model-relax-medlow-01-norelaxgp" > run_dump_test "code-model-relax-medlow-02" > run_dump_test "code-model-relax-medlow-weakref-01" > run_dump_test "code-model-relax-medlow-weakref-02" > diff --git a/ld/testsuite/ld-riscv-elf/pcgp-relax-01-norelaxgp.d b/ld/testsuite/ld-riscv-elf/pcgp-relax-01-norelaxgp.d > new file mode 100644 > index 00000000000..d1344576ff3 > --- /dev/null > +++ b/ld/testsuite/ld-riscv-elf/pcgp-relax-01-norelaxgp.d > @@ -0,0 +1,18 @@ > +#source: pcgp-relax-01.s > +#ld: --no-relax-gp --relax > +#objdump: -d -Mno-aliases > + > +.*:[ ]+file format .* > + > + > +Disassembly of section \.text: > + > +0+[0-9a-f]+ <_start>: > +.*:[ ]+[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 >