From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7867) id 7C78E3858D33; Fri, 17 Nov 2023 08:43:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7C78E3858D33 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: liu & zhensong To: bfd-cvs@sourceware.org Subject: [binutils-gdb] LoongArch: Multiple relax_trip in one relax_pass X-Act-Checkin: binutils-gdb X-Git-Author: mengqinggang X-Git-Refname: refs/heads/master X-Git-Oldrev: 4e94082d95e046f357409cd689ffeedd60f6c673 X-Git-Newrev: b130a0849a1b3e174210903cf5370092decc62d6 Message-Id: <20231117084339.7C78E3858D33@sourceware.org> Date: Fri, 17 Nov 2023 08:43:39 +0000 (GMT) X-BeenThere: binutils-cvs@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Nov 2023 08:43:39 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Db130a0849a1b= 3e174210903cf5370092decc62d6 commit b130a0849a1b3e174210903cf5370092decc62d6 Author: mengqinggang Date: Thu Nov 16 19:19:13 2023 +0800 LoongArch: Multiple relax_trip in one relax_pass =20 If deleting instructions in one relax_trip, set again to true to start = the next relax_trip. Diff: --- bfd/elfnn-loongarch.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 9d4ea7e4ae7..7436a14441f 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -3740,7 +3740,7 @@ loongarch_relax_delete_bytes (bfd *abfd, static bool loongarch_relax_pcala_addi (bfd *abfd, asection *sec, Elf_Internal_Rela *rel_hi, bfd_vma symval, - struct bfd_link_info *info) + struct bfd_link_info *info, bool *again) { bfd_byte *contents =3D elf_section_data (sec)->this_hdr.contents; Elf_Internal_Rela *rel_lo =3D rel_hi + 2; @@ -3766,6 +3766,9 @@ loongarch_relax_pcala_addi (bfd *abfd, asection *sec, || ((bfd_signed_vma)(symval - pc) > (bfd_signed_vma)(int32_t)0x1ffff= c)) return false; =20 + /* Continue next relax trip. */ + *again =3D true; + pca =3D pcaddi | rd; bfd_put (32, abfd, pca, contents + rel_hi->r_offset); =20 @@ -4006,14 +4009,15 @@ loongarch_elf_relax_section (bfd *abfd, asection *s= ec, break; case R_LARCH_PCALA_HI20: if (0 =3D=3D info->relax_pass && (i + 4) <=3D sec->reloc_count) - loongarch_relax_pcala_addi (abfd, sec, rel, symval, info); + loongarch_relax_pcala_addi (abfd, sec, rel, symval, info, again); break; case R_LARCH_GOT_PC_HI20: if (local_got && 0 =3D=3D info->relax_pass && (i + 4) <=3D sec->reloc_count) { if (loongarch_relax_pcala_ld (abfd, sec, rel)) - loongarch_relax_pcala_addi (abfd, sec, rel, symval, info); + loongarch_relax_pcala_addi (abfd, sec, rel, symval, + info, again); } break; default: