From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 955463858D32 for ; Tue, 16 Jan 2024 06:39:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 955463858D32 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 955463858D32 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=1705387147; cv=none; b=KWnzDMfPm3F/+VqDXm+CUZeXWcDBWnew5zFtXXPRvyET0aoiMB8QIKwMcYE3zyi3G6U75kc7AG31rHqruyLQDVrlawnjF6FLnI6Ha9S3qMEDsxMrlMtOBjkSgFpgcicL7idZoIv1F8V5LNX4Njy3roOcDFF1ahQzbCkXHeq6L/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1705387147; c=relaxed/simple; bh=Bgy3p0WZgDsX80UMnYWTXkmHMWW4pZNR4lRjLR6O5Gs=; h=Subject:To:From:Message-ID:Date:MIME-Version; b=IyNXReFvl9qPmcCBCHQFPzeeEpieYllvfK1XsbWvBXPNEt5o1zIQvLUwZxx3979+x5Qgk5y87KjVJDH+EvTs7pQ9xw00vxejlN9Uua44offcABOSXaTsSd3V1INwSvkZttQCeiIa0Q72M2WE+z5OSpeXnvqSybMJ550N/SE5oUQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.20.4.171]) by gateway (Coremail) with SMTP id _____8Axz+uCJKZlGZkAAA--.2792S3; Tue, 16 Jan 2024 14:38:59 +0800 (CST) Received: from [10.20.4.171] (unknown [10.20.4.171]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Cx_c5oJKZl1ncDAA--.18264S3; Tue, 16 Jan 2024 14:38:54 +0800 (CST) Subject: Re: [PATCH] LoongArch: Adapt R_LARCH_{PCALA,GOT,TLS_IE,TLS_DESC}64_* handling per psABI v2.30 To: Xi Ruoyao , binutils@sourceware.org Cc: liuzhensong@loongson.cn, i.swmail@xen0n.name, maskray@google.com, hejinyang@loongson.cn, cailulu@loongson.cn, chenglulu@loongson.cn, xuchenghua@loongson.cn, luweining@loongson.cn References: <20240115124417.102655-2-xry111@xry111.site> From: mengqinggang Message-ID: <66b241f8-df13-ef9a-aa8d-ae2acdc1f8f0@loongson.cn> Date: Tue, 16 Jan 2024 14:38:32 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20240115124417.102655-2-xry111@xry111.site> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8Cx_c5oJKZl1ncDAA--.18264S3 X-CM-SenderInfo: 5phqw15lqjwttqj6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBj93XoW3XF48KF17CFWfJr4DGryDArc_yoWxJw45pr yfuwn0kayrJF1xWF1qk345X345Cr4xG3W2qasFq3Wv9rn3Xryjqw1IgrWYgF45J3ykJrWr Zry0qw1UZF1jy3gCm3ZEXasCq-sJn29KB7ZKAUJUUUU5529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUv2b4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Gr0_Cr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVW8Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l57IF6xkI12xvs2x26I8E6xACxx 1l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1Y6r17McIj6I8E87Iv 67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IY64vIr41lc7I2V7IY0VAS07 AlzVAYIcxG8wCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02 F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GF ylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7Cj xVAFwI0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r 1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU1QV y3UUUUU== X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00,BODY_8BITS,GIT_PATCH_0,KAM_DMARC_STATUS,KAM_NUMSUBJECT,NICE_REPLY_A,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 List-Id: 在 2024/1/15 下午8:44, Xi Ruoyao 写道: > In LoongArch psABI v2.30, an offset (-8 for LO20 and -12 for HI12) > should be applied on PC for these reloc types to avoid wrong relocation > when the instruction sequence crosses a page boundary. > > The lld linker has already adapted the change. Make it for the bfd > linker too. > > Link: https://github.com/loongson/la-abi-specs/releases/v2.30 > Link: https://github.com/loongson-community/discussions/issues/17 > Link: https://github.com/llvm/llvm-project/pull/73387 > Signed-off-by: Xi Ruoyao > --- > bfd/elfnn-loongarch.c | 29 +++++++++++-------- > .../ld-loongarch-elf/ld-loongarch-elf.exp | 1 + > ld/testsuite/ld-loongarch-elf/pcala64.d | 15 ++++++++++ > ld/testsuite/ld-loongarch-elf/pcala64.s | 8 +++++ > 4 files changed, 41 insertions(+), 12 deletions(-) > create mode 100644 ld/testsuite/ld-loongarch-elf/pcala64.d > create mode 100644 ld/testsuite/ld-loongarch-elf/pcala64.s > > diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c > index 3858a3179fd..e4f4da7a0dc 100644 > --- a/bfd/elfnn-loongarch.c > +++ b/bfd/elfnn-loongarch.c > @@ -3544,14 +3544,16 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, > } > break; > > - case R_LARCH_PCALA64_LO20: > case R_LARCH_PCALA64_HI12: > + pc -= 4; > + /* Fall through. */ > + case R_LARCH_PCALA64_LO20: > if (h && h->plt.offset != MINUS_ONE) > relocation = sec_addr (plt) + h->plt.offset; > else > relocation += rel->r_addend; > > - RELOCATE_CALC_PC64_HI32 (relocation, pc); > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 8); The 'pc - 8' triggered an error because the pc parameter is not enclosed in parentheses in macro definition. /home/mengqinggang/toolchains/src/binutils-gdb/bfd/elfnn-loongarch.c:3546:51: error: suggest parentheses around '-' in operand of '&' [-Werror=parentheses]  3546 |           RELOCATE_CALC_PC64_HI32 (relocation, pc - 8);       |                                                ~~~^~~ /home/mengqinggang/toolchains/src/binutils-gdb/bfd/elfnn-loongarch.c:2532:22: note: in definition of macro 'RELOCATE_CALC_PC64_HI32'  2532 |                   - (pc & ~(bfd_vma)0xfff);             \       |                      ^~ > > break; > > @@ -3678,9 +3680,10 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, > relocation = got_off + sec_addr (got); > } > > - if (r_type == R_LARCH_GOT64_PC_HI12 > - || r_type == R_LARCH_GOT64_PC_LO20) > - RELOCATE_CALC_PC64_HI32 (relocation, pc); > + if (r_type == R_LARCH_GOT64_PC_HI12) > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 12); > + else if (r_type == R_LARCH_GOT64_PC_LO20) > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 8); > > break; > > @@ -3881,13 +3884,14 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, > /* Use both TLS_GD and TLS_DESC. */ > if ((tls_type & GOT_TLS_GD) && (tls_type & GOT_TLS_GDESC)) > relocation += 2 * GOT_ENTRY_SIZE; > - } > > - if (r_type == R_LARCH_TLS_DESC64_PC_LO20 > - || r_type == R_LARCH_TLS_DESC64_PC_HI12) > - RELOCATE_CALC_PC64_HI32 (relocation, pc); > + if (r_type == R_LARCH_TLS_DESC64_PC_LO20) > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 8); > + else if (r_type == R_LARCH_TLS_DESC64_PC_HI12) > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 12); > > break; > + } > > case R_LARCH_TLS_DESC_LD: > case R_LARCH_TLS_DESC_CALL: > @@ -3916,9 +3920,10 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, > else if (GOT_TLS_GD_ANY_P (tls_type) && (tls_type & GOT_TLS_IE)) > relocation += 2 * GOT_ENTRY_SIZE; > > - if (r_type == R_LARCH_TLS_IE64_PC_LO20 > - || r_type == R_LARCH_TLS_IE64_PC_HI12) > - RELOCATE_CALC_PC64_HI32 (relocation, pc); > + if (r_type == R_LARCH_TLS_IE64_PC_LO20) > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 8); > + else if (r_type == R_LARCH_TLS_IE64_PC_HI12) > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 12); > > break; > > diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp > index 6ab87163039..2ff06d62236 100644 > --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp > +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp > @@ -26,6 +26,7 @@ if [istarget "loongarch64-*-*"] { > run_dump_test "disas-jirl" > run_dump_test "local-ifunc-reloc" > run_dump_test "anno-sym" > + run_dump_test "pcala64" > } > > if [istarget "loongarch32-*-*"] { > diff --git a/ld/testsuite/ld-loongarch-elf/pcala64.d b/ld/testsuite/ld-loongarch-elf/pcala64.d > new file mode 100644 > index 00000000000..6b1411577db > --- /dev/null > +++ b/ld/testsuite/ld-loongarch-elf/pcala64.d > @@ -0,0 +1,15 @@ > +#ld: -Ttext=0x180000ff8 -Tdata=0x1000000000 -shared The test need to be disabled on loongarch*-elf target because -shared option is not supported on loongarch*-elf target. It can be disabled by  adding a line "#skip: loongarch*-elf" after "#objdump -d". > +#objdump: -d > + > +.*:[ ]+file format .* > + > + > +Disassembly of section .text: > + > +0000000180000ff8 <_start>: > +[ ]+180000ff8:[ ]+1b000004[ ]+pcalau12i[ ]+\$a0,[ ]+-524288 > +[ ]+180000ffc:[ ]+02c0000c[ ]+li.d[ ]+\$t0,[ ]+0 > +[ ]+180001000:[ ]+160001ec[ ]+lu32i.d[ ]+\$t0,[ ]+15 > +[ ]+180001004:[ ]+0300018c[ ]+lu52i.d[ ]+\$t0,[ ]+\$t0,[ ]+0 > +[ ]+180001008:[ ]+0010b084[ ]+add.d[ ]+\$a0,[ ]+\$a0,[ ]+\$t0 > +[ ]+18000100c:[ ]+4c000020[ ]+ret > diff --git a/ld/testsuite/ld-loongarch-elf/pcala64.s b/ld/testsuite/ld-loongarch-elf/pcala64.s > new file mode 100644 > index 00000000000..dfef0e2b7b7 > --- /dev/null > +++ b/ld/testsuite/ld-loongarch-elf/pcala64.s > @@ -0,0 +1,8 @@ > +.text > +.globl _start > +_start: > + la.pcrel $a0, $t0, sym > + jr $ra > +.data > +sym: > + .dword 0