diff mbox series

[1/2] LoongArch: Fix ptr mangling/demangling features.

Message ID 20220823122833.1561228-2-caiyinyu@loongson.cn
State New
Headers show
Series LoongArch: Fix ptr mangling/demangling features | expand

Commit Message

caiyinyu Aug. 23, 2022, 12:28 p.m. UTC
Co-authored-by: Xi Ruoyao <xry111@xry111.site>
---
 sysdeps/loongarch/__longjmp.S              |  2 +-
 sysdeps/loongarch/configure                | 26 ++++++++++++++
 sysdeps/loongarch/configure.ac             | 14 ++++++++
 sysdeps/loongarch/setjmp.S                 |  2 +-
 sysdeps/unix/sysv/linux/loongarch/sysdep.h | 40 +++++++++++++---------
 5 files changed, 65 insertions(+), 19 deletions(-)

Comments

Adhemerval Zanella Netto Aug. 25, 2022, 3:08 p.m. UTC | #1
Does is really pay off the complexity to use HAVE_LOONGARCH_EXPLICIT_RELOCS? The
PTR_MANGLE is used some specific cases and hardly a hotstop.

On 23/08/22 09:28, caiyinyu wrote:
> Co-authored-by: Xi Ruoyao <xry111@xry111.site>
> ---
>  sysdeps/loongarch/__longjmp.S              |  2 +-
>  sysdeps/loongarch/configure                | 26 ++++++++++++++
>  sysdeps/loongarch/configure.ac             | 14 ++++++++
>  sysdeps/loongarch/setjmp.S                 |  2 +-
>  sysdeps/unix/sysv/linux/loongarch/sysdep.h | 40 +++++++++++++---------
>  5 files changed, 65 insertions(+), 19 deletions(-)
> 
> diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
> index c2c5b56a80..4207376f5e 100644
> --- a/sysdeps/loongarch/__longjmp.S
> +++ b/sysdeps/loongarch/__longjmp.S
> @@ -22,7 +22,7 @@
>  ENTRY (__longjmp)
>  #ifdef PTR_MANGLE
>  	REG_L t0, a0, 0*SZREG
> -	PTR_DEMANGLE (ra, t0, t1, t2)
> +	PTR_DEMANGLE (ra, t0, t1)
>  	REG_L t0, a0, 1*SZREG
>  	PTR_DEMANGLE2 (sp, t0, t1)
>  #else
> diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
> index 43b54d4965..54385786d2 100644
> --- a/sysdeps/loongarch/configure
> +++ b/sysdeps/loongarch/configure
> @@ -3,3 +3,29 @@
>  
>  $as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h
>  
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether explicit relocs can be used" >&5
> +$as_echo_n "checking whether explicit relocs can be used... " >&6; }
> +if ${libc_cv_loongarch_explicit_relocs+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.s << EOF
> +x: pcalau12i \$t0, %pc_hi20(x)
> +EOF
> +libc_cv_loongarch_explicit_relocs=no
> +if { ac_try='${CC-cc} -c $CFLAGS conftest.s -o conftest.o 1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }; then
> +  libc_cv_loongarch_explicit_relocs=yes
> +fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_loongarch_explicit_relocs" >&5
> +$as_echo "$libc_cv_loongarch_explicit_relocs" >&6; }
> +if test $libc_cv_loongarch_explicit_relocs = yes; then
> +  $as_echo "#define HAVE_LOONGARCH_EXPLICIT_RELOCS 1" >>confdefs.h
> +
> +fi
> diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
> index f744367bf3..c5d3cb5ead 100644
> --- a/sysdeps/loongarch/configure.ac
> +++ b/sysdeps/loongarch/configure.ac
> @@ -4,3 +4,17 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
>  dnl It is always possible to access static and hidden symbols in an
>  dnl position independent way.
>  AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC)
> +
> +AC_CACHE_CHECK(whether explicit relocs can be used,
> +               libc_cv_loongarch_explicit_relocs, [dnl
> +cat > conftest.s << EOF
> +x: pcalau12i \$t0, %pc_hi20(x)
> +EOF
> +libc_cv_loongarch_explicit_relocs=no
> +if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s -o conftest.o 1>&AS_MESSAGE_LOG_FD); then
> +  libc_cv_loongarch_explicit_relocs=yes
> +fi
> +rm -f conftest*])
> +if test $libc_cv_loongarch_explicit_relocs = yes; then
> +  AC_DEFINE(HAVE_LOONGARCH_EXPLICIT_RELOCS)
> +fi
> diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
> index ec4ddc72da..298bb02a82 100644
> --- a/sysdeps/loongarch/setjmp.S
> +++ b/sysdeps/loongarch/setjmp.S
> @@ -30,7 +30,7 @@ END (setjmp)
>  
>  ENTRY (__sigsetjmp)
>  #ifdef PTR_MANGLE
> -	PTR_MANGLE (t0, ra, t1, t2)
> +	PTR_MANGLE (t0, ra, t1)
>  	REG_S t0, a0, 0*SZREG
>  	PTR_MANGLE2 (t0, sp, t1)
>  	REG_S t0, a0, 1*SZREG
> diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
> index 157cbd6c6b..0a8773c38d 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
> @@ -316,29 +316,35 @@ extern long int __syscall_error (long int neg_errno);
>  
>  /* Pointer mangling is supported for LoongArch.  */
>  
> -/* Load or store to/from a got-relative EXPR into/from G, using T.
> +/* Load a got-relative EXPR into G, using T.
>     Note G and T are register names.  */
> -#define LDST_GLOBAL(OP, G, T,  EXPR) \
> -  pcalau12i T, %got_pc_hi20(EXPR); \
> -  OP	    T, T, %got_pc_lo12(EXPR); \
> -  OP	    G, T, 0;
> +#define LD_GLOBAL(G, EXPR) \
> +  la.global G,	EXPR; \
> +  REG_L	    G,	G,  0;
>  
> -/* Load or store to/from a pc-relative EXPR into/from G, using T.
> +/* Load a pc-relative EXPR into G, using T.
>     Note G and T are register names.  */
> -#define LDST_PCREL(OP, G, T,  EXPR) \
> -  pcalau12i T, %pc_hi20(EXPR); \
> -  OP	    G, T, %pc_lo12(EXPR);
> +
> +#ifdef HAVE_LOONGARCH_EXPLICIT_RELOCS
> +#define LD_PCREL(G, EXPR) \
> +  pcalau12i G,	%pc_hi20(EXPR); \
> +  REG_L	    G,	G,  %pc_lo12(EXPR);
> +#else
> +#define LD_PCREL(G, EXPR) \
> +  la.pcrel  G,	EXPR; \
> +  REG_L	    G,	G,  0;
> +#endif
>  
>  #if (IS_IN (rtld) \
>       || (!defined SHARED && (IS_IN (libc) \
>       || IS_IN (libpthread))))
>  
>  #ifdef __ASSEMBLER__
> -#define PTR_MANGLE(dst, src, guard, tmp) \
> -  LDST_PCREL (REG_L, guard, tmp, __pointer_chk_guard_local); \
> +#define PTR_MANGLE(dst, src, guard) \
> +  LD_PCREL (guard, __pointer_chk_guard_local); \
>    PTR_MANGLE2 (dst, src, guard);
> -#define PTR_DEMANGLE(dst, src, guard, tmp) \
> -  LDST_PCREL (REG_L, guard, tmp, __pointer_chk_guard_local); \
> +#define PTR_DEMANGLE(dst, src, guard) \
> +  LD_PCREL (guard, __pointer_chk_guard_local); \
>    PTR_DEMANGLE2 (dst, src, guard);
>  /* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
>  #define PTR_MANGLE2(dst, src, guard) \
> @@ -355,11 +361,11 @@ extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
>  #else
>  
>  #ifdef __ASSEMBLER__
> -#define PTR_MANGLE(dst, src, guard, tmp) \
> -  LDST_GLOBAL (REG_L, guard, tmp, __pointer_chk_guard); \
> +#define PTR_MANGLE(dst, src, guard) \
> +  LD_GLOBAL (guard, __pointer_chk_guard); \
>    PTR_MANGLE2 (dst, src, guard);
> -#define PTR_DEMANGLE(dst, src, guard, tmp) \
> -  LDST_GLOBAL (REG_L, guard, tmp, __pointer_chk_guard); \
> +#define PTR_DEMANGLE(dst, src, guard) \
> +  LD_GLOBAL (guard, __pointer_chk_guard); \
>    PTR_DEMANGLE2 (dst, src, guard);
>  /* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
>  #define PTR_MANGLE2(dst, src, guard) \
Xi Ruoyao Aug. 25, 2022, 3:27 p.m. UTC | #2
On Thu, 2022-08-25 at 12:08 -0300, Adhemerval Zanella Netto wrote:
> Does is really pay off the complexity to use HAVE_LOONGARCH_EXPLICIT_RELOCS? The
> PTR_MANGLE is used some specific cases and hardly a hotstop.

LDST_PCREL added as a macro in sysdep.h, so further assembly
implementations might reuse it then it may appear in some hot spot.

If we quote "optimization too early is the ultimate evil", we can drop
it for now and review once we use LDST_PCREL somewhere else. But to me
this is rather a simple autoconf check and I can't figure out a
situation where it's evil...
Adhemerval Zanella Netto Aug. 25, 2022, 5:01 p.m. UTC | #3
On 25/08/22 12:27, Xi Ruoyao wrote:
> On Thu, 2022-08-25 at 12:08 -0300, Adhemerval Zanella Netto wrote:
>> Does is really pay off the complexity to use HAVE_LOONGARCH_EXPLICIT_RELOCS? The
>> PTR_MANGLE is used some specific cases and hardly a hotstop.
> 
> LDST_PCREL added as a macro in sysdep.h, so further assembly
> implementations might reuse it then it may appear in some hot spot.
> 
> If we quote "optimization too early is the ultimate evil", we can drop
> it for now and review once we use LDST_PCREL somewhere else. But to me
> this is rather a simple autoconf check and I can't figure out a
> situation where it's evil...

It is more that configure checks might create maintainability burden or just
dead code in the long term, specially where it does have a fallback that works
with no much performance penalty.
caiyinyu Aug. 26, 2022, 2:44 a.m. UTC | #4
How about using this patch[1] now to fix this build error first?

[1] https://sourceware.org/pipermail/libc-alpha/2022-August/141489.html

There is no modify in common files and all happy besides performance 
overhead

of one more instruction.


在 2022/8/26 上午1:01, Adhemerval Zanella Netto 写道:
>
> On 25/08/22 12:27, Xi Ruoyao wrote:
>> On Thu, 2022-08-25 at 12:08 -0300, Adhemerval Zanella Netto wrote:
>>> Does is really pay off the complexity to use HAVE_LOONGARCH_EXPLICIT_RELOCS? The
>>> PTR_MANGLE is used some specific cases and hardly a hotstop.
>> LDST_PCREL added as a macro in sysdep.h, so further assembly
>> implementations might reuse it then it may appear in some hot spot.
>>
>> If we quote "optimization too early is the ultimate evil", we can drop
>> it for now and review once we use LDST_PCREL somewhere else. But to me
>> this is rather a simple autoconf check and I can't figure out a
>> situation where it's evil...
> It is more that configure checks might create maintainability burden or just
> dead code in the long term, specially where it does have a fallback that works
> with no much performance penalty.
caiyinyu Aug. 26, 2022, 8:11 a.m. UTC | #5
在 2022/8/26 上午10:44, caiyinyu 写道:
>
> How about using this patch[1] now to fix this build error first?
>
> [1] https://sourceware.org/pipermail/libc-alpha/2022-August/141489.html
>
> There is no modify in common files and all happy besides performance 
> overhead
>
> of one more instruction.

I also sent a new patch which combined the two patches If community can 
accept it.

https://sourceware.org/pipermail/libc-alpha/2022-August/141677.html




>
>
> 在 2022/8/26 上午1:01, Adhemerval Zanella Netto 写道:
>>
>> On 25/08/22 12:27, Xi Ruoyao wrote:
>>> On Thu, 2022-08-25 at 12:08 -0300, Adhemerval Zanella Netto wrote:
>>>> Does is really pay off the complexity to use 
>>>> HAVE_LOONGARCH_EXPLICIT_RELOCS? The
>>>> PTR_MANGLE is used some specific cases and hardly a hotstop.
>>> LDST_PCREL added as a macro in sysdep.h, so further assembly
>>> implementations might reuse it then it may appear in some hot spot.
>>>
>>> If we quote "optimization too early is the ultimate evil", we can drop
>>> it for now and review once we use LDST_PCREL somewhere else. But to me
>>> this is rather a simple autoconf check and I can't figure out a
>>> situation where it's evil...
>> It is more that configure checks might create maintainability burden 
>> or just
>> dead code in the long term, specially where it does have a fallback 
>> that works
>> with no much performance penalty.
diff mbox series

Patch

diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
index c2c5b56a80..4207376f5e 100644
--- a/sysdeps/loongarch/__longjmp.S
+++ b/sysdeps/loongarch/__longjmp.S
@@ -22,7 +22,7 @@ 
 ENTRY (__longjmp)
 #ifdef PTR_MANGLE
 	REG_L t0, a0, 0*SZREG
-	PTR_DEMANGLE (ra, t0, t1, t2)
+	PTR_DEMANGLE (ra, t0, t1)
 	REG_L t0, a0, 1*SZREG
 	PTR_DEMANGLE2 (sp, t0, t1)
 #else
diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
index 43b54d4965..54385786d2 100644
--- a/sysdeps/loongarch/configure
+++ b/sysdeps/loongarch/configure
@@ -3,3 +3,29 @@ 
 
 $as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h
 
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether explicit relocs can be used" >&5
+$as_echo_n "checking whether explicit relocs can be used... " >&6; }
+if ${libc_cv_loongarch_explicit_relocs+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.s << EOF
+x: pcalau12i \$t0, %pc_hi20(x)
+EOF
+libc_cv_loongarch_explicit_relocs=no
+if { ac_try='${CC-cc} -c $CFLAGS conftest.s -o conftest.o 1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+  libc_cv_loongarch_explicit_relocs=yes
+fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_loongarch_explicit_relocs" >&5
+$as_echo "$libc_cv_loongarch_explicit_relocs" >&6; }
+if test $libc_cv_loongarch_explicit_relocs = yes; then
+  $as_echo "#define HAVE_LOONGARCH_EXPLICIT_RELOCS 1" >>confdefs.h
+
+fi
diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
index f744367bf3..c5d3cb5ead 100644
--- a/sysdeps/loongarch/configure.ac
+++ b/sysdeps/loongarch/configure.ac
@@ -4,3 +4,17 @@  GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
 dnl It is always possible to access static and hidden symbols in an
 dnl position independent way.
 AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC)
+
+AC_CACHE_CHECK(whether explicit relocs can be used,
+               libc_cv_loongarch_explicit_relocs, [dnl
+cat > conftest.s << EOF
+x: pcalau12i \$t0, %pc_hi20(x)
+EOF
+libc_cv_loongarch_explicit_relocs=no
+if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s -o conftest.o 1>&AS_MESSAGE_LOG_FD); then
+  libc_cv_loongarch_explicit_relocs=yes
+fi
+rm -f conftest*])
+if test $libc_cv_loongarch_explicit_relocs = yes; then
+  AC_DEFINE(HAVE_LOONGARCH_EXPLICIT_RELOCS)
+fi
diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
index ec4ddc72da..298bb02a82 100644
--- a/sysdeps/loongarch/setjmp.S
+++ b/sysdeps/loongarch/setjmp.S
@@ -30,7 +30,7 @@  END (setjmp)
 
 ENTRY (__sigsetjmp)
 #ifdef PTR_MANGLE
-	PTR_MANGLE (t0, ra, t1, t2)
+	PTR_MANGLE (t0, ra, t1)
 	REG_S t0, a0, 0*SZREG
 	PTR_MANGLE2 (t0, sp, t1)
 	REG_S t0, a0, 1*SZREG
diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
index 157cbd6c6b..0a8773c38d 100644
--- a/sysdeps/unix/sysv/linux/loongarch/sysdep.h
+++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
@@ -316,29 +316,35 @@  extern long int __syscall_error (long int neg_errno);
 
 /* Pointer mangling is supported for LoongArch.  */
 
-/* Load or store to/from a got-relative EXPR into/from G, using T.
+/* Load a got-relative EXPR into G, using T.
    Note G and T are register names.  */
-#define LDST_GLOBAL(OP, G, T,  EXPR) \
-  pcalau12i T, %got_pc_hi20(EXPR); \
-  OP	    T, T, %got_pc_lo12(EXPR); \
-  OP	    G, T, 0;
+#define LD_GLOBAL(G, EXPR) \
+  la.global G,	EXPR; \
+  REG_L	    G,	G,  0;
 
-/* Load or store to/from a pc-relative EXPR into/from G, using T.
+/* Load a pc-relative EXPR into G, using T.
    Note G and T are register names.  */
-#define LDST_PCREL(OP, G, T,  EXPR) \
-  pcalau12i T, %pc_hi20(EXPR); \
-  OP	    G, T, %pc_lo12(EXPR);
+
+#ifdef HAVE_LOONGARCH_EXPLICIT_RELOCS
+#define LD_PCREL(G, EXPR) \
+  pcalau12i G,	%pc_hi20(EXPR); \
+  REG_L	    G,	G,  %pc_lo12(EXPR);
+#else
+#define LD_PCREL(G, EXPR) \
+  la.pcrel  G,	EXPR; \
+  REG_L	    G,	G,  0;
+#endif
 
 #if (IS_IN (rtld) \
      || (!defined SHARED && (IS_IN (libc) \
      || IS_IN (libpthread))))
 
 #ifdef __ASSEMBLER__
-#define PTR_MANGLE(dst, src, guard, tmp) \
-  LDST_PCREL (REG_L, guard, tmp, __pointer_chk_guard_local); \
+#define PTR_MANGLE(dst, src, guard) \
+  LD_PCREL (guard, __pointer_chk_guard_local); \
   PTR_MANGLE2 (dst, src, guard);
-#define PTR_DEMANGLE(dst, src, guard, tmp) \
-  LDST_PCREL (REG_L, guard, tmp, __pointer_chk_guard_local); \
+#define PTR_DEMANGLE(dst, src, guard) \
+  LD_PCREL (guard, __pointer_chk_guard_local); \
   PTR_DEMANGLE2 (dst, src, guard);
 /* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
 #define PTR_MANGLE2(dst, src, guard) \
@@ -355,11 +361,11 @@  extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
 #else
 
 #ifdef __ASSEMBLER__
-#define PTR_MANGLE(dst, src, guard, tmp) \
-  LDST_GLOBAL (REG_L, guard, tmp, __pointer_chk_guard); \
+#define PTR_MANGLE(dst, src, guard) \
+  LD_GLOBAL (guard, __pointer_chk_guard); \
   PTR_MANGLE2 (dst, src, guard);
-#define PTR_DEMANGLE(dst, src, guard, tmp) \
-  LDST_GLOBAL (REG_L, guard, tmp, __pointer_chk_guard); \
+#define PTR_DEMANGLE(dst, src, guard) \
+  LD_GLOBAL (guard, __pointer_chk_guard); \
   PTR_DEMANGLE2 (dst, src, guard);
 /* Use PTR_MANGLE2 for efficiency if guard is already loaded.  */
 #define PTR_MANGLE2(dst, src, guard) \