* [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173] @ 2020-06-25 23:02 Tulio Magno Quites Machado Filho 2020-06-30 19:44 ` Matheus Castanho 2020-06-30 20:50 ` Paul E Murphy 0 siblings, 2 replies; 6+ messages in thread From: Tulio Magno Quites Machado Filho @ 2020-06-25 23:02 UTC (permalink / raw) To: libc-alpha 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 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173] 2020-06-25 23:02 [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173] Tulio Magno Quites Machado Filho @ 2020-06-30 19:44 ` Matheus Castanho 2020-06-30 20:50 ` Paul E Murphy 1 sibling, 0 replies; 6+ messages in thread From: Matheus Castanho @ 2020-06-30 19:44 UTC (permalink / raw) To: Tulio Magno Quites Machado Filho, libc-alpha 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 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173] 2020-06-25 23:02 [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173] Tulio Magno Quites Machado Filho 2020-06-30 19:44 ` Matheus Castanho @ 2020-06-30 20:50 ` Paul E Murphy 2020-07-01 20:50 ` [PATCHv2] " Tulio Magno Quites Machado Filho 1 sibling, 1 reply; 6+ messages in thread From: Paul E Murphy @ 2020-06-30 20:50 UTC (permalink / raw) To: Tulio Magno Quites Machado Filho, libc-alpha 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? ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv2] powerpc64: Fix calls when r2 is not used [BZ #26173] 2020-06-30 20:50 ` Paul E Murphy @ 2020-07-01 20:50 ` Tulio Magno Quites Machado Filho 2020-07-01 21:32 ` Paul E Murphy 0 siblings, 1 reply; 6+ messages in thread From: Tulio Magno Quites Machado Filho @ 2020-07-01 20:50 UTC (permalink / raw) To: Paul E . Murphy, libc-alpha Paul E Murphy via Libc-alpha <libc-alpha@sourceware.org> 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 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCHv2] powerpc64: Fix calls when r2 is not used [BZ #26173] 2020-07-01 20:50 ` [PATCHv2] " Tulio Magno Quites Machado Filho @ 2020-07-01 21:32 ` Paul E Murphy 2020-07-10 23:06 ` Tulio Magno Quites Machado Filho 0 siblings, 1 reply; 6+ messages in thread From: Paul E Murphy @ 2020-07-01 21:32 UTC (permalink / raw) To: Tulio Magno Quites Machado Filho, libc-alpha On 7/1/20 3:50 PM, Tulio Magno Quites Machado Filho wrote: > Paul E Murphy via Libc-alpha <libc-alpha@sourceware.org> 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. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCHv2] powerpc64: Fix calls when r2 is not used [BZ #26173] 2020-07-01 21:32 ` Paul E Murphy @ 2020-07-10 23:06 ` Tulio Magno Quites Machado Filho 0 siblings, 0 replies; 6+ messages in thread From: Tulio Magno Quites Machado Filho @ 2020-07-10 23:06 UTC (permalink / raw) To: Paul E Murphy, libc-alpha Paul E Murphy via Libc-alpha <libc-alpha@sourceware.org> 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 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-07-10 23:06 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-06-25 23:02 [PATCH] powerpc64: Fix calls when r2 is not used [BZ #26173] Tulio Magno Quites Machado Filho 2020-06-30 19:44 ` Matheus Castanho 2020-06-30 20:50 ` Paul E Murphy 2020-07-01 20:50 ` [PATCHv2] " Tulio Magno Quites Machado Filho 2020-07-01 21:32 ` Paul E Murphy 2020-07-10 23:06 ` Tulio Magno Quites Machado Filho
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).