From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out30-44.freemail.mail.aliyun.com (out30-44.freemail.mail.aliyun.com [115.124.30.44]) by sourceware.org (Postfix) with ESMTPS id D6A5A3858C52 for ; Fri, 23 Sep 2022 06:48:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D6A5A3858C52 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.alibaba.com X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R181e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018045176;MF=lifang_xia@linux.alibaba.com;NM=1;PH=DS;RN=3;SR=0;TI=SMTPD_---0VQViczz_1663915683; Received: from localhost.localdomain(mailfrom:lifang_xia@linux.alibaba.com fp:SMTPD_---0VQViczz_1663915683) by smtp.aliyun-inc.com; Fri, 23 Sep 2022 14:48:04 +0800 From: lifang_xia@linux.alibaba.com To: binutils@sourceware.org Cc: nelson@rivosinc.com, Lifang Xia Subject: [PATCH] RISC-V: Optimize relax of GP with max_alignment. Date: Fri, 23 Sep 2022 14:47:26 +0800 Message-Id: <20220923064726.9639-1-lifang_xia@linux.alibaba.com> X-Mailer: git-send-email 2.32.1 (Apple Git-133) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-20.7 required=5.0 tests=BAYES_00,ENV_AND_HDR_SPF_MATCH,GIT_PATCH_0,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,UNPARSEABLE_RELAY,USER_IN_DEF_SPF_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 List-Id: From: Lifang Xia The max_alignment defined out of [gp-2K, gp+2k), the max_alignment shouldn't affect the relax of gp. If the symbol is in [gp-2K, gp+2k), the max_alignment would be replaced with the max_alignment of the section in [gp-2k, gp+2k). bfd/ * elfnn-riscv.c (_bfd_riscv_get_max_alignment_in_gp): New. (_bfd_riscv_relax_lui): The max_alignment of sections is from [gp-2K, gp+2K). (_bfd_riscv_relax_pc): Likewise. ld/ * ld/testsuite/ld-riscv-elf/relax-max-align.*: New tests. --- bfd/elfnn-riscv.c | 36 ++++++++++++++++ ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 1 + ld/testsuite/ld-riscv-elf/relax-max-align.d | 46 +++++++++++++++++++++ ld/testsuite/ld-riscv-elf/relax-max-align.s | 29 +++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 ld/testsuite/ld-riscv-elf/relax-max-align.d create mode 100644 ld/testsuite/ld-riscv-elf/relax-max-align.s diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 3d2ddf4e651..76f888d805c 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -4262,6 +4262,28 @@ _bfd_riscv_get_max_alignment (asection *sec) return (bfd_vma) 1 << max_alignment_power; } +/* Traverse all output sections in [gp-2K, gp+2K) and return the max alignment. */ + +static bfd_vma +_bfd_riscv_get_max_alignment_in_gp (asection *sec, bfd_vma gp) +{ + unsigned int max_alignment_power = 0; + asection *o; + + if (sec == NULL) + return 0; + + for (o = sec->output_section->owner->sections; o != NULL; o = o->next) + { + if (VALID_ITYPE_IMM (sec_addr(o) - gp) + || VALID_ITYPE_IMM (sec_addr(o) + o->size - gp)) + if (o->alignment_power > max_alignment_power) + max_alignment_power = o->alignment_power; + } + + return (bfd_vma) 1 << max_alignment_power; +} + /* Relax non-PIC global variable references to GP-relative references. */ static bool @@ -4293,6 +4315,13 @@ _bfd_riscv_relax_lui (bfd *abfd, if (h->u.def.section->output_section == sym_sec->output_section && sym_sec->output_section != bfd_abs_section_ptr) max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power; + + /* Otherwise, consider the alignment of sections in [gp-2K,gp+2K). */ + else if (!undefined_weak){ + bfd_vma new_max_alignment = _bfd_riscv_get_max_alignment_in_gp (sym_sec, gp); + if (new_max_alignment) + max_alignment = new_max_alignment; + } } /* Is the reference in range of x0 or gp? @@ -4559,6 +4588,13 @@ _bfd_riscv_relax_pc (bfd *abfd ATTRIBUTE_UNUSED, if (h->u.def.section->output_section == sym_sec->output_section && sym_sec->output_section != bfd_abs_section_ptr) max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power; + + /* Otherwise, consider the alignment of sections in [gp-2K,gp+2K). */ + else if (!undefined_weak){ + bfd_vma new_max_alignment = _bfd_riscv_get_max_alignment_in_gp (sym_sec, gp); + if (new_max_alignment) + max_alignment = new_max_alignment; + } } /* Is the reference in range of x0 or gp? diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index df89e0ee68b..e53f16facfa 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -169,6 +169,7 @@ if [istarget "riscv*-*-*"] { run_dump_test "attr-merge-priv-spec-failed-05" run_dump_test "attr-merge-priv-spec-failed-06" run_dump_test "attr-phdr" + run_dump_test "relax-max-align" run_ld_link_tests [list \ [list "Weak reference 32" "-T weakref.ld -m[riscv_choose_ilp32_emul]" "" \ "-march=rv32i -mabi=ilp32" {weakref32.s} \ diff --git a/ld/testsuite/ld-riscv-elf/relax-max-align.d b/ld/testsuite/ld-riscv-elf/relax-max-align.d new file mode 100644 index 00000000000..4ba920da970 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/relax-max-align.d @@ -0,0 +1,46 @@ +#source: relax-max-align.s +#ld: +#objdump: -d + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+[0-9a-f]+ <_start>: +.*:[ ]+[0-9a-f]+[ ]+addi[ ]+.* +.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* +.*:[ ]+[0-9a-f]+[ ]+j[ ]+.* +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop +.*:[ ]+[0-9a-f]+[ ]+nop + +0+[0-9a-f]+ : +.*:[ ]+[0-9a-f]+[ ]+ret +[ ]+... diff --git a/ld/testsuite/ld-riscv-elf/relax-max-align.s b/ld/testsuite/ld-riscv-elf/relax-max-align.s new file mode 100644 index 00000000000..e8abe0f34a1 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/relax-max-align.s @@ -0,0 +1,29 @@ + +.global _start +_start: + lui a0, %hi(gdata) + addi a0, a0, %lo(gdata) + call func + j . + .size _start, . - _start + +.global func +.align 7 +func: + ret + .size func, . - func + +.data +padding: + .long 0 + .long 0 + .long 0 + .long 0 + .size padding, . - padding + +.global gdata +.type gdata, object +gdata: + .zero 4 + .size gdata, . - gdata + -- 2.32.1 (Apple Git-133)