[PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173]

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173]

Sourceware - libc-alpha mailing list
Teach the linker that __mcount_internal, __sigjmp_save_symbol,
__syscall_error and __GI_exit do not use r2, so that it does not need to
recover r2 after the call.
---
 sysdeps/powerpc/powerpc64/ppc-mcount.S                  | 2 +-
 sysdeps/powerpc/powerpc64/setjmp-common.S               | 2 +-
 sysdeps/powerpc/powerpc64/sysdep.h                      | 2 +-
 sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/sysdeps/powerpc/powerpc64/ppc-mcount.S b/sysdeps/powerpc/powerpc64/ppc-mcount.S
index f7e9836cae..7b2b3ab908 100644
--- a/sysdeps/powerpc/powerpc64/ppc-mcount.S
+++ b/sysdeps/powerpc/powerpc64/ppc-mcount.S
@@ -29,7 +29,7 @@ ENTRY(_mcount)
  cfi_adjust_cfa_offset (FRAME_MIN_SIZE)
  cfi_offset (lr, FRAME_LR_SAVE)
  ld r3, FRAME_LR_SAVE(r11)
- bl JUMPTARGET(__mcount_internal)
+ bl JUMPTARGET(__mcount_internal@notoc)
 #ifndef SHARED
  nop
 #endif
diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
index eb37000980..44cc43937e 100644
--- a/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
@@ -217,7 +217,7 @@ L(no_vmx):
  li r3,0
  blr
 #elif defined SHARED
- b JUMPTARGET (__sigjmp_save_symbol)
+ b JUMPTARGET (__sigjmp_save_symbol@notoc)
 #else
  mflr r0
  std r0,FRAME_LR_SAVE(r1)
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
index d6616ac905..fbddeb492e 100644
--- a/sysdeps/powerpc/powerpc64/sysdep.h
+++ b/sysdeps/powerpc/powerpc64/sysdep.h
@@ -278,7 +278,7 @@ LT_LABELSUFFIX(name,_name_end): ; \
 
 #ifdef SHARED
 #define TAIL_CALL_SYSCALL_ERROR \
-    b JUMPTARGET(__syscall_error)
+    b JUMPTARGET(__syscall_error@notoc)
 #else
 /* Static version might be linked into a large app with a toc exceeding
    64k.  We can't put a toc adjusting stub on a plain branch, so can't
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
index e4d4575d68..fd22f8f7ae 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
@@ -160,7 +160,7 @@ L(exitcode):
  li    r3,-1
 L(do_exit):
 #ifdef SHARED
- b     JUMPTARGET(__GI_exit);
+ b     JUMPTARGET(__GI_exit@notoc);
 #else
  b     JUMPTARGET(exit);
  nop
--
2.25.4

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173]

Sourceware - libc-alpha mailing list
Hi Tulio,

On 6/25/20 8:02 PM, Tulio Magno Quites Machado Filho via Libc-alpha wrote:

> Teach the linker that __mcount_internal, __sigjmp_save_symbol,
> __syscall_error and __GI_exit do not use r2, so that it does not need to
> recover r2 after the call.
> ---
>  sysdeps/powerpc/powerpc64/ppc-mcount.S                  | 2 +-
>  sysdeps/powerpc/powerpc64/setjmp-common.S               | 2 +-
>  sysdeps/powerpc/powerpc64/sysdep.h                      | 2 +-
>  sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S | 2 +-
>  4 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/sysdeps/powerpc/powerpc64/ppc-mcount.S b/sysdeps/powerpc/powerpc64/ppc-mcount.S
> index f7e9836cae..7b2b3ab908 100644
> --- a/sysdeps/powerpc/powerpc64/ppc-mcount.S
> +++ b/sysdeps/powerpc/powerpc64/ppc-mcount.S
> @@ -29,7 +29,7 @@ ENTRY(_mcount)
>   cfi_adjust_cfa_offset (FRAME_MIN_SIZE)
>   cfi_offset (lr, FRAME_LR_SAVE)
>   ld r3, FRAME_LR_SAVE(r11)
> - bl JUMPTARGET(__mcount_internal)
> + bl JUMPTARGET(__mcount_internal@notoc)
Ok.

>  #ifndef SHARED
>   nop
>  #endif
> diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
> index eb37000980..44cc43937e 100644
> --- a/sysdeps/powerpc/powerpc64/setjmp-common.S
> +++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
> @@ -217,7 +217,7 @@ L(no_vmx):
>   li r3,0
>   blr
>  #elif defined SHARED
> - b JUMPTARGET (__sigjmp_save_symbol)
> + b JUMPTARGET (__sigjmp_save_symbol@notoc)
Ok.

>  #else
>   mflr r0
>   std r0,FRAME_LR_SAVE(r1)
> diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
> index d6616ac905..fbddeb492e 100644
> --- a/sysdeps/powerpc/powerpc64/sysdep.h
> +++ b/sysdeps/powerpc/powerpc64/sysdep.h
> @@ -278,7 +278,7 @@ LT_LABELSUFFIX(name,_name_end): ; \
>  
>  #ifdef SHARED
>  #define TAIL_CALL_SYSCALL_ERROR \
> -    b JUMPTARGET(__syscall_error)
> +    b JUMPTARGET(__syscall_error@notoc)
Ok.

>  #else
>  /* Static version might be linked into a large app with a toc exceeding
>     64k.  We can't put a toc adjusting stub on a plain branch, so can't
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
> index e4d4575d68..fd22f8f7ae 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
> @@ -160,7 +160,7 @@ L(exitcode):
>   li    r3,-1
>  L(do_exit):
>  #ifdef SHARED
> - b     JUMPTARGET(__GI_exit);
> + b     JUMPTARGET(__GI_exit@notoc);
Ok.

>  #else
>   b     JUMPTARGET(exit);
>   nop
>

LGTM.

Thanks,
Matheus Castanho
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173]

Sourceware - libc-alpha mailing list
In reply to this post by Sourceware - libc-alpha mailing list


On 6/25/20 6:02 PM, Tulio Magno Quites Machado Filho via Libc-alpha wrote:

> --- a/sysdeps/powerpc/powerpc64/setjmp-common.S
> +++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
> @@ -217,7 +217,7 @@ L(no_vmx):
>   li r3,0
>   blr
>   #elif defined SHARED
> - b JUMPTARGET (__sigjmp_save_symbol)
> + b JUMPTARGET (__sigjmp_save_symbol@notoc)

Will this also require a newer version of binutils?
Reply | Threaded
Open this post in threaded view
|

[PATCHv2] powerpc64: Fix calls when r2 is not used [BZ #26173]

Sourceware - libc-alpha mailing list
Paul E Murphy via Libc-alpha <[hidden email]> writes:

> Will this also require a newer version of binutils?

Yes.  Fixed in this version.

Thanks!

Changes since v1:

 - Detect at configure time if the assembler supports @notoc. Use @notoc only
   when available.

---8<---

Teach the linker that __mcount_internal, __sigjmp_save_symbol,
__syscall_error and __GI_exit do not use r2, so that it does not need to
recover r2 after the call.

Test at configure time if the assembler supports @notoc and define
USE_PPC64_NOTOC.
---
 config.h.in                                   |  3 ++
 sysdeps/powerpc/powerpc64/configure           | 28 +++++++++++++++++++
 sysdeps/powerpc/powerpc64/configure.ac        | 11 ++++++++
 sysdeps/powerpc/powerpc64/ppc-mcount.S        |  2 +-
 sysdeps/powerpc/powerpc64/setjmp-common.S     |  2 +-
 sysdeps/powerpc/powerpc64/sysdep.h            |  8 +++++-
 .../linux/powerpc/powerpc64/makecontext.S     |  2 +-
 7 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/config.h.in b/config.h.in
index 831eca2fe1..6598d4573a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -20,6 +20,9 @@
 /* On powerpc64, use overlapping .opd entries.  */
 #undef  USE_PPC64_OVERLAPPING_OPD
 
+/* On powerpc64, use @notoc.  */
+#undef  USE_PPC64_NOTOC
+
 /* Define if _Unwind_Find_FDE should be exported from glibc.  */
 #undef  EXPORT_UNWIND_FIND_FDE
 
diff --git a/sysdeps/powerpc/powerpc64/configure b/sysdeps/powerpc/powerpc64/configure
index 7632a7be04..5ce77af631 100644
--- a/sysdeps/powerpc/powerpc64/configure
+++ b/sysdeps/powerpc/powerpc64/configure
@@ -31,3 +31,31 @@ if test x$libc_cv_overlapping_opd = xyes; then
   $as_echo "#define USE_PPC64_OVERLAPPING_OPD 1" >>confdefs.h
 
 fi
+
+# @notoc started to be supported in GNU Binutils 2.31.
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler supports @notoc" >&5
+$as_echo_n "checking if the assembler supports @notoc... " >&6; }
+if ${libc_cv_ppc64_notoc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+void foo (void) {asm("b foo@notoc");}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libc_cv_ppc64_notoc=yes
+else
+  libc_cv_ppc64_notoc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ppc64_notoc" >&5
+$as_echo "$libc_cv_ppc64_notoc" >&6; }
+if test x$libc_cv_ppc64_notoc = xyes; then :
+  $as_echo "#define USE_PPC64_NOTOC 1" >>confdefs.h
+
+fi
diff --git a/sysdeps/powerpc/powerpc64/configure.ac b/sysdeps/powerpc/powerpc64/configure.ac
index f309ba35a8..b77156f696 100644
--- a/sysdeps/powerpc/powerpc64/configure.ac
+++ b/sysdeps/powerpc/powerpc64/configure.ac
@@ -21,3 +21,14 @@ rm -f conftest.c conftest.s
 if test x$libc_cv_overlapping_opd = xyes; then
   AC_DEFINE(USE_PPC64_OVERLAPPING_OPD)
 fi
+
+# @notoc started to be supported in GNU Binutils 2.31.
+AC_CACHE_CHECK([if the assembler supports @notoc],
+       libc_cv_ppc64_notoc, [
+       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+void foo (void) {asm("b foo@notoc");}
+  ])],
+  [libc_cv_ppc64_notoc=yes],
+  [libc_cv_ppc64_notoc=no])])
+AS_IF([test x$libc_cv_ppc64_notoc = xyes],
+      [AC_DEFINE(USE_PPC64_NOTOC)])
diff --git a/sysdeps/powerpc/powerpc64/ppc-mcount.S b/sysdeps/powerpc/powerpc64/ppc-mcount.S
index f7e9836cae..1adc0a18f3 100644
--- a/sysdeps/powerpc/powerpc64/ppc-mcount.S
+++ b/sysdeps/powerpc/powerpc64/ppc-mcount.S
@@ -29,7 +29,7 @@ ENTRY(_mcount)
  cfi_adjust_cfa_offset (FRAME_MIN_SIZE)
  cfi_offset (lr, FRAME_LR_SAVE)
  ld r3, FRAME_LR_SAVE(r11)
- bl JUMPTARGET(__mcount_internal)
+ bl JUMPTARGET (NOTOC (__mcount_internal))
 #ifndef SHARED
  nop
 #endif
diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
index eb37000980..2409d17831 100644
--- a/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
@@ -217,7 +217,7 @@ L(no_vmx):
  li r3,0
  blr
 #elif defined SHARED
- b JUMPTARGET (__sigjmp_save_symbol)
+ b JUMPTARGET (NOTOC (__sigjmp_save_symbol))
 #else
  mflr r0
  std r0,FRAME_LR_SAVE(r1)
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
index d6616ac905..d557098898 100644
--- a/sysdeps/powerpc/powerpc64/sysdep.h
+++ b/sysdeps/powerpc/powerpc64/sysdep.h
@@ -278,7 +278,7 @@ LT_LABELSUFFIX(name,_name_end): ; \
 
 #ifdef SHARED
 #define TAIL_CALL_SYSCALL_ERROR \
-    b JUMPTARGET(__syscall_error)
+    b JUMPTARGET (NOTOC (__syscall_error))
 #else
 /* Static version might be linked into a large app with a toc exceeding
    64k.  We can't put a toc adjusting stub on a plain branch, so can't
@@ -366,6 +366,12 @@ LT_LABELSUFFIX(name,_name_end): ; \
  lwz rOUT,0(rOUT)
 #endif
 
+#ifdef USE_PPC64_NOTOC
+# define NOTOC(l) l@notoc
+#else
+# define NOTOC(l) l
+#endif
+
 #else /* !__ASSEMBLER__ */
 
 #if _CALL_ELF != 2
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
index e4d4575d68..3c528aa4b7 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
@@ -160,7 +160,7 @@ L(exitcode):
  li    r3,-1
 L(do_exit):
 #ifdef SHARED
- b     JUMPTARGET(__GI_exit);
+ b     JUMPTARGET (NOTOC (__GI_exit));
 #else
  b     JUMPTARGET(exit);
  nop
--
2.25.4

Reply | Threaded
Open this post in threaded view
|

Re: [PATCHv2] powerpc64: Fix calls when r2 is not used [BZ #26173]

Sourceware - libc-alpha mailing list


On 7/1/20 3:50 PM, Tulio Magno Quites Machado Filho wrote:

> Paul E Murphy via Libc-alpha <[hidden email]> writes:
>
>> Will this also require a newer version of binutils?
>
> Yes.  Fixed in this version.
>
> Thanks!
>
> Changes since v1:
>
>   - Detect at configure time if the assembler supports @notoc. Use @notoc only
>     when available.
>
> ---8<---
>
> Teach the linker that __mcount_internal, __sigjmp_save_symbol,
> __syscall_error and __GI_exit do not use r2, so that it does not need to
> recover r2 after the call.
>
> Test at configure time if the assembler supports @notoc and define
> USE_PPC64_NOTOC.
> ---
>   config.h.in                                   |  3 ++
>   sysdeps/powerpc/powerpc64/configure           | 28 +++++++++++++++++++
>   sysdeps/powerpc/powerpc64/configure.ac        | 11 ++++++++
>   sysdeps/powerpc/powerpc64/ppc-mcount.S        |  2 +-
>   sysdeps/powerpc/powerpc64/setjmp-common.S     |  2 +-
>   sysdeps/powerpc/powerpc64/sysdep.h            |  8 +++++-
>   .../linux/powerpc/powerpc64/makecontext.S     |  2 +-
>   7 files changed, 52 insertions(+), 4 deletions(-)
>
> diff --git a/config.h.in b/config.h.in
> index 831eca2fe1..6598d4573a 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -20,6 +20,9 @@
>   /* On powerpc64, use overlapping .opd entries.  */
>   #undef  USE_PPC64_OVERLAPPING_OPD
>  
> +/* On powerpc64, use @notoc.  */
> +#undef  USE_PPC64_NOTOC
> +
>   /* Define if _Unwind_Find_FDE should be exported from glibc.  */
>   #undef  EXPORT_UNWIND_FIND_FDE
>  
> diff --git a/sysdeps/powerpc/powerpc64/configure b/sysdeps/powerpc/powerpc64/configure
> index 7632a7be04..5ce77af631 100644
> --- a/sysdeps/powerpc/powerpc64/configure
> +++ b/sysdeps/powerpc/powerpc64/configure
> @@ -31,3 +31,31 @@ if test x$libc_cv_overlapping_opd = xyes; then
>     $as_echo "#define USE_PPC64_OVERLAPPING_OPD 1" >>confdefs.h
>  
>   fi
> +
> +# @notoc started to be supported in GNU Binutils 2.31.

An optional rewording suggestion: s/started to be supported/was added/.

I also did a quick compile test with binutils 2.30
and 2.34.  LGTM.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCHv2] powerpc64: Fix calls when r2 is not used [BZ #26173]

Tulio Magno Quites Machado Filho-3
Paul E Murphy via Libc-alpha <[hidden email]> writes:

> An optional rewording suggestion: s/started to be supported/was added/.
>
> I also did a quick compile test with binutils 2.30
> and 2.34.  LGTM.

Pushed as 7c7bcf3634e44cf7e001aaa302138c1ee0e58f8c.

Thanks!

--
Tulio Magno