public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2] LoongArch: ld: Fix bug not generate plt when link a dso
@ 2022-08-22  2:17 liuzhensong
  2022-08-22  5:32 ` Fangrui Song
  0 siblings, 1 reply; 2+ messages in thread
From: liuzhensong @ 2022-08-22  2:17 UTC (permalink / raw)
  To: binutils
  Cc: i.swmail, xry111, maskray, caiyinyu, chenglulu, mengqinggang,
	xuchenghua, liuzhensong

  Fix the bug that can not generate func@plt
  when linking a undefined function with cmodel=medium.
  Add testcase.

  bfd/
    elfnn-loongarch.c
  ld/testsuite/ld-loongarch-elf/
    cmodel-libjirl.dd
    cmodel.exp
    libjirl.s
---
 bfd/elfnn-loongarch.c                         |  6 +++
 .../ld-loongarch-elf/cmodel-libjirl.dd        |  4 ++
 ld/testsuite/ld-loongarch-elf/cmodel.exp      | 37 +++++++++++++++++++
 ld/testsuite/ld-loongarch-elf/libjirl.s       | 31 ++++++++++++++++
 4 files changed, 78 insertions(+)
 create mode 100644 ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd
 create mode 100644 ld/testsuite/ld-loongarch-elf/cmodel.exp
 create mode 100644 ld/testsuite/ld-loongarch-elf/libjirl.s

diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index 8d0f66ea7c1..ed42b8b6770 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -746,6 +746,12 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
 	case R_LARCH_PCALA_HI20:
 	  if (h != NULL)
 	    {
+	      /* For pcalau12i + jirl.  */
+	      h->needs_plt = 1;
+	      if (h->plt.refcount < 0)
+		h->plt.refcount = 0;
+	      h->plt.refcount++;
+
 	      h->non_got_ref = 1;
 	      h->pointer_equality_needed = 1;
 	    }
diff --git a/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd b/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd
new file mode 100644
index 00000000000..52d3dca8443
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd
@@ -0,0 +1,4 @@
+.*file format.*loongarch
+#...
+[0-9a-f]+ <func@plt>:
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/cmodel.exp b/ld/testsuite/ld-loongarch-elf/cmodel.exp
new file mode 100644
index 00000000000..7ef972a44e5
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/cmodel.exp
@@ -0,0 +1,37 @@
+# Expect script for LoongArch ELF linker tests
+#   Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+if ![istarget loongarch*-*-*] {
+  return
+}
+
+run_ld_link_tests [list \
+		    [list \
+		    "medium jirl plt" \
+		    "-shared" "" \
+		    "" \
+		    {libjirl.s} \
+		    [list \
+			[list objdump -d cmodel-libjirl.dd] \
+		    ] \
+		    "libjirl.so" \
+		    ] \
+		  ]
diff --git a/ld/testsuite/ld-loongarch-elf/libjirl.s b/ld/testsuite/ld-loongarch-elf/libjirl.s
new file mode 100644
index 00000000000..5b151203fae
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/libjirl.s
@@ -0,0 +1,31 @@
+	.file	"liba.c"
+	.text
+	.align	2
+	.globl	foo
+	.type	foo, @function
+foo:
+.LFB0 = .
+	.cfi_startproc
+	addi.d	$r3,$r3,-16
+	.cfi_def_cfa_offset 16
+	st.d	$r1,$r3,8
+	stptr.d	$r22,$r3,0
+	.cfi_offset 1, -8
+	.cfi_offset 22, -16
+	addi.d	$r22,$r3,16
+	.cfi_def_cfa 22, 0
+	pcalau12i $r12, %pc_hi20(func)
+	jirl $r1,$r12, %pc_lo12(func)
+	nop
+	ld.d	$r1,$r3,8
+	.cfi_restore 1
+	ldptr.d	$r22,$r3,0
+	.cfi_restore 22
+	addi.d	$r3,$r3,16
+	.cfi_def_cfa_register 3
+	jr	$r1
+	.cfi_endproc
+.LFE0:
+	.size	foo, .-foo
+	.ident	"GCC: (GNU) 13.0.0 20220512 (experimental)"
+	.section	.note.GNU-stack,"",@progbits
-- 
2.31.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] LoongArch: ld: Fix bug not generate plt when link a dso
  2022-08-22  2:17 [PATCH v2] LoongArch: ld: Fix bug not generate plt when link a dso liuzhensong
@ 2022-08-22  5:32 ` Fangrui Song
  0 siblings, 0 replies; 2+ messages in thread
From: Fangrui Song @ 2022-08-22  5:32 UTC (permalink / raw)
  To: liuzhensong
  Cc: binutils, i.swmail, xry111, caiyinyu, chenglulu, mengqinggang,
	xuchenghua

On Sun, Aug 21, 2022 at 7:18 PM liuzhensong <liuzhensong@loongson.cn> wrote:
>
>   Fix the bug that can not generate func@plt
>   when linking a undefined function with cmodel=medium.
>   Add testcase.
>
>   bfd/
>     elfnn-loongarch.c
>   ld/testsuite/ld-loongarch-elf/
>     cmodel-libjirl.dd
>     cmodel.exp
>     libjirl.s
> ---
>  bfd/elfnn-loongarch.c                         |  6 +++
>  .../ld-loongarch-elf/cmodel-libjirl.dd        |  4 ++
>  ld/testsuite/ld-loongarch-elf/cmodel.exp      | 37 +++++++++++++++++++
>  ld/testsuite/ld-loongarch-elf/libjirl.s       | 31 ++++++++++++++++
>  4 files changed, 78 insertions(+)
>  create mode 100644 ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd
>  create mode 100644 ld/testsuite/ld-loongarch-elf/cmodel.exp
>  create mode 100644 ld/testsuite/ld-loongarch-elf/libjirl.s
>
> diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
> index 8d0f66ea7c1..ed42b8b6770 100644
> --- a/bfd/elfnn-loongarch.c
> +++ b/bfd/elfnn-loongarch.c
> @@ -746,6 +746,12 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
>         case R_LARCH_PCALA_HI20:
>           if (h != NULL)
>             {
> +             /* For pcalau12i + jirl.  */
> +             h->needs_plt = 1;
> +             if (h->plt.refcount < 0)
> +               h->plt.refcount = 0;
> +             h->plt.refcount++;
> +
>               h->non_got_ref = 1;
>               h->pointer_equality_needed = 1;
>             }
> diff --git a/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd b/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd
> new file mode 100644
> index 00000000000..52d3dca8443
> --- /dev/null
> +++ b/ld/testsuite/ld-loongarch-elf/cmodel-libjirl.dd
> @@ -0,0 +1,4 @@
> +.*file format.*loongarch
> +#...
> +[0-9a-f]+ <func@plt>:
> +#pass
> diff --git a/ld/testsuite/ld-loongarch-elf/cmodel.exp b/ld/testsuite/ld-loongarch-elf/cmodel.exp
> new file mode 100644
> index 00000000000..7ef972a44e5
> --- /dev/null
> +++ b/ld/testsuite/ld-loongarch-elf/cmodel.exp
> @@ -0,0 +1,37 @@
> +# Expect script for LoongArch ELF linker tests
> +#   Copyright (C) 2022 Free Software Foundation, Inc.
> +#
> +# This file is part of the GNU Binutils.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
> +# MA 02110-1301, USA.
> +#
> +
> +if ![istarget loongarch*-*-*] {
> +  return
> +}
> +
> +run_ld_link_tests [list \
> +                   [list \
> +                   "medium jirl plt" \
> +                   "-shared" "" \
> +                   "" \
> +                   {libjirl.s} \
> +                   [list \
> +                       [list objdump -d cmodel-libjirl.dd] \
> +                   ] \
> +                   "libjirl.so" \
> +                   ] \
> +                 ]
> diff --git a/ld/testsuite/ld-loongarch-elf/libjirl.s b/ld/testsuite/ld-loongarch-elf/libjirl.s
> new file mode 100644
> index 00000000000..5b151203fae
> --- /dev/null
> +++ b/ld/testsuite/ld-loongarch-elf/libjirl.s
> @@ -0,0 +1,31 @@
> +       .file   "liba.c"
> +       .text
> +       .align  2
> +       .globl  foo
> +       .type   foo, @function
> +foo:
> +.LFB0 = .
> +       .cfi_startproc
> +       addi.d  $r3,$r3,-16
> +       .cfi_def_cfa_offset 16
> +       st.d    $r1,$r3,8
> +       stptr.d $r22,$r3,0
> +       .cfi_offset 1, -8
> +       .cfi_offset 22, -16
> +       addi.d  $r22,$r3,16
> +       .cfi_def_cfa 22, 0
> +       pcalau12i $r12, %pc_hi20(func)
> +       jirl $r1,$r12, %pc_lo12(func)
> +       nop
> +       ld.d    $r1,$r3,8
> +       .cfi_restore 1
> +       ldptr.d $r22,$r3,0
> +       .cfi_restore 22
> +       addi.d  $r3,$r3,16
> +       .cfi_def_cfa_register 3
> +       jr      $r1
> +       .cfi_endproc
> +.LFE0:
> +       .size   foo, .-foo
> +       .ident  "GCC: (GNU) 13.0.0 20220512 (experimental)"
> +       .section        .note.GNU-stack,"",@progbits
> --
> 2.31.1
>

You may want to remove prologue, epilogue, .ident, .note.GNU-stack,
.cfi_startproc, etc to increase signal-to-noise ratio.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-08-22  5:32 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-22  2:17 [PATCH v2] LoongArch: ld: Fix bug not generate plt when link a dso liuzhensong
2022-08-22  5:32 ` Fangrui Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).