From patchwork Tue Nov 12 02:57:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lulu Cai X-Patchwork-Id: 100842 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DDB4F3858C33 for ; Tue, 12 Nov 2024 02:57:51 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 157163858D35 for ; Tue, 12 Nov 2024 02:57:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 157163858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 157163858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1731380236; cv=none; b=h3XyntrdK3oVjL8bVVZpmBLYHW01kZGTJdywxkHM/KZrHIUnI4bQiZfY7VOs07bCjgCFY9oRN5AWTrnHnYwKMqjKIdGa7FXc1o55QgrdZHugvfQ8MuNOSa488dIy0aPPuJChbOGzuM4YwDFMloMBi61aN3OO5m7usXlIQqjp+sE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1731380236; c=relaxed/simple; bh=0KwrNYgUkAqpIFNU3wqPxCSKupPLDBs7gbCMf6d10Hs=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=WDEf19vlBAxYx4OwthdVfQ15d4L5zmiN0LiNgHYoP5bNuG606rQw4NJ71iqIMnKrj3UbNKvtfhTCpLx7LF344I87TK6BG84Ed+k2powgogrTS+DVOcjiXPbKYLnXtckNVgctyT/4KTCYEkB8Bc0w+w14wJhxIlyrnxrLZBUESCw= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.2.6.5]) by gateway (Coremail) with SMTP id _____8CxCeEExDJn8bo7AA--.52301S3; Tue, 12 Nov 2024 10:57:08 +0800 (CST) Received: from 5.. (unknown [10.2.6.5]) by front1 (Coremail) with SMTP id qMiowMDxvkf_wzJnNTVSAA--.12115S4; Tue, 12 Nov 2024 10:57:03 +0800 (CST) From: Lulu Cai To: binutils@sourceware.org Cc: xuchenghua@loongson.cn, chenglulu@loongson.cn, mengqinggang@loongson.cn, xry111@xry111.site, i.swmail@xen0n.name, maskray@google.com, luweining@loongson.cn, hejinyang@loongson.cn, wangxin03@loongson.cn, Lulu Cai Subject: [PATCH v1] LoongArch: Do not relax pcalau12i+ld.d when overflow occurs after relaxation Date: Tue, 12 Nov 2024 10:57:01 +0800 Message-Id: <20241112025701.2678086-1-cailulu@loongson.cn> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-CM-TRANSID: qMiowMDxvkf_wzJnNTVSAA--.12115S4 X-CM-SenderInfo: xfdlz3tox6z05rqj20fqof0/1tbiAQETB2cyiLwFCgAAs6 X-Coremail-Antispam: 1Uk129KBj93XoWxKryxJr4ruFWUKw1xJF4rXrc_yoW7tr4Dpr 9rurn3KF48AF17Wr9Ik3y5uFn5Grs2kFy2qas7tF1I9rsxXry0qw1SyrW3WF45G398Xr13 Z340y3yYkF1qvwcCm3ZEXasCq-sJn29KB7ZKAUJUUUU5529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUkYb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r106r15M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVWxJVW8Jr1l84ACjcxK6I8E87Iv6xkF7I0E14v2 6r4UJVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44I27w Aqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jrv_JF1lYx0Ex4A2jsIE 14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwCF04k20xvY0x 0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E 7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcV C0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF 04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7 CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU8r9N3UUUUU== X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, 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~patchwork=sourceware.org@sourceware.org Currently, there is no overflow check for the relaxation of pcalau12i+ld.d => pcalau12i+addi.d. For instruction sequences that can be relaxed, they are directly relaxed to pcalau12i+addi.d. However, when the relative distance between the symbol and the pc exceeds the 32-bit range, the symbol value cannot be obtained correctly. This modification adds an overflow check for the relaxation of pcalau12i+ld.d. If it is found that the relaxation will overflow, it will not be relaxed. --- bfd/elfnn-loongarch.c | 32 ++++++++++++++++--- .../ld-loongarch-elf/check_got_relax.d | 30 +++++++++++++++++ .../ld-loongarch-elf/check_got_relax.s | 16 ++++++++++ .../ld-loongarch-elf/ld-loongarch-elf.exp | 1 + ld/testsuite/ld-loongarch-elf/relax.ld | 21 ++++++++++++ 5 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 ld/testsuite/ld-loongarch-elf/check_got_relax.d create mode 100644 ld/testsuite/ld-loongarch-elf/check_got_relax.s create mode 100644 ld/testsuite/ld-loongarch-elf/relax.ld diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 608d179c168..8189a23a3a9 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -5099,12 +5099,12 @@ loongarch_relax_call36 (bfd *abfd, asection *sec, asection *sym_sec, /* Relax pcalau12i,ld.d => pcalau12i,addi.d. */ static bool loongarch_relax_pcala_ld (bfd *abfd, asection *sec, - asection *sym_sec ATTRIBUTE_UNUSED, + asection *sym_sec, Elf_Internal_Rela *rel_hi, - bfd_vma symval ATTRIBUTE_UNUSED, - struct bfd_link_info *info ATTRIBUTE_UNUSED, + bfd_vma symval, + struct bfd_link_info *info, bool *again ATTRIBUTE_UNUSED, - bfd_vma max_alignment ATTRIBUTE_UNUSED) + bfd_vma max_alignment) { bfd_byte *contents = elf_section_data (sec)->this_hdr.contents; Elf_Internal_Rela *rel_lo = rel_hi + 2; @@ -5113,10 +5113,32 @@ loongarch_relax_pcala_ld (bfd *abfd, asection *sec, uint32_t rd = LARCH_GET_RD (pca); uint32_t addi_d = LARCH_OP_ADDI_D; + /* This section's output_offset need to subtract the bytes of instructions + relaxed by the previous sections, so it needs to be updated beforehand. + size_input_section already took care of updating it after relaxation, + so we additionally update once here. */ + sec->output_offset = sec->output_section->size; + bfd_vma pc = sec_addr (sec) + rel_hi->r_offset; + + /* If pc and symbol not in the same segment, add/sub segment alignment. */ + if (!loongarch_two_sections_in_same_segment (info->output_bfd, + sec->output_section, + sym_sec->output_section)) + max_alignment = info->maxpagesize > max_alignment ? info->maxpagesize + : max_alignment; + + if (symval > pc) + pc -= (max_alignment > 4 ? max_alignment : 0); + else if (symval < pc) + pc += (max_alignment > 4 ? max_alignment : 0); + if ((ELFNN_R_TYPE (rel_lo->r_info) != R_LARCH_GOT_PC_LO12) || (LARCH_GET_RD (ld) != rd) || (LARCH_GET_RJ (ld) != rd) - || !LARCH_INSN_LD_D (ld)) + || !LARCH_INSN_LD_D (ld) + /* Within +-2G addressing range. */ + || (bfd_signed_vma)(symval - pc) < (bfd_signed_vma)(int32_t)0x80000000 + || (bfd_signed_vma)(symval - pc) > (bfd_signed_vma)(int32_t)0x7fffffff) return false; addi_d = addi_d | (rd << 5) | rd; diff --git a/ld/testsuite/ld-loongarch-elf/check_got_relax.d b/ld/testsuite/ld-loongarch-elf/check_got_relax.d new file mode 100644 index 00000000000..3fb3b6d4d01 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/check_got_relax.d @@ -0,0 +1,30 @@ +#ld: -T relax.ld +#objdump: -D -j.text -j.got -j.other + +.*: file format .* + + +Disassembly of section \.text: + +0+10000 <_start>: + 10000: 1a000204 pcalau12i \$a0, 16 + 10004: 28c02084 ld.d \$a0, \$a0, 8 + 10008: 1a000204 pcalau12i \$a0, 16 + 1000c: 28c04084 ld.d \$a0, \$a0, 16 + +Disassembly of section \.got: + +0+20000 <_GLOBAL_OFFSET_TABLE_>: + ... + 20008: 0000000f .word 0x0000000f + 2000c: 00000001 .word 0x00000001 + 20010: 00000013 .word 0x00000013 + 20014: 00000001 .word 0x00000001 + +Disassembly of section \.other: + +0+10000000f : + 10000000f: 03400000 nop + +0+100000013 : + 100000013: 03400000 nop diff --git a/ld/testsuite/ld-loongarch-elf/check_got_relax.s b/ld/testsuite/ld-loongarch-elf/check_got_relax.s new file mode 100644 index 00000000000..bc13dca8461 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/check_got_relax.s @@ -0,0 +1,16 @@ + .text + .global _start +_start: + la.got $a0,sym_hidden + la.got $a0,sym_protected + + .section .other + .global sym_hidden + .hidden sym_hidden +sym_hidden: + nop + + .global sym_protected + .protected sym_protected +sym_protected: + nop diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp index 3313f72eee4..e1b038cb579 100644 --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp @@ -47,6 +47,7 @@ if [istarget "loongarch64-*-*"] { run_dump_test "tls-le-relax" run_dump_test "relax-medium-call" run_dump_test "relax-medium-call-1" + run_dump_test "check_got_relax" } if [istarget "loongarch32-*-*"] { diff --git a/ld/testsuite/ld-loongarch-elf/relax.ld b/ld/testsuite/ld-loongarch-elf/relax.ld new file mode 100644 index 00000000000..810a8b669a8 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/relax.ld @@ -0,0 +1,21 @@ +OUTPUT_ARCH(loongarch) +ENTRY(_start) +SECTIONS +{ + PROVIDE (__executable_start = 0x8000); . = 0x10000; + .text : + { + *(.text) + } =0 + . = 0x20000; + .got : + { + *(.got) + *(.got.plt) + } + . = 0x10000000f; + .other : + { + *(.other) + } +}