Message ID | 20220826080339.2859494-1-caiyinyu@loongson.cn |
---|---|
State | New |
Headers | show |
Series | [1/1] LoongArch: Fix ptr mangling/demangling features. | expand |
I'm OK with either this or the simplified version w/o ac check. Not sure about Glibc policy about committing a change (does a port maintainer needs approval to commit a change within this port?) On Fri, 2022-08-26 at 16:03 +0800, caiyinyu wrote: > Co-authored-by: Xi Ruoyao <xry111@xry111.site> > --- > config.h.in | 3 ++ > 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 +++++++++++++-------- > - > 6 files changed, 68 insertions(+), 19 deletions(-) > > diff --git a/config.h.in b/config.h.in > index 43d32518ab..b182de0e91 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -138,6 +138,9 @@ > /* LOONGARCH floating-point ABI for ld.so. */ > #undef LOONGARCH_ABI_FRLEN > > +/* To Indicate whether we can use explicit relocs or not. */ > +#undef HAVE_LOONGARCH_EXPLICIT_RELOCS > + > /* Linux specific: minimum supported kernel version. */ > #undef __LINUX_KERNEL_VERSION > > 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) \
On 29/08/22 04:08, Xi Ruoyao wrote: > I'm OK with either this or the simplified version w/o ac check. > > Not sure about Glibc policy about committing a change (does a port > maintainer needs approval to commit a change within this port?) Afaik as long the arch-maintainer is ok with the change and there is no blocker it should be ok to push. I stil prefer to just use la.pcrel, since it way simpler and I am really sceptical that using pcalau12i will yield any real performance difference, but it is not a blocker from my part. > > On Fri, 2022-08-26 at 16:03 +0800, caiyinyu wrote: >> Co-authored-by: Xi Ruoyao <xry111@xry111.site> >> --- >> config.h.in | 3 ++ >> 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 +++++++++++++-------- >> - >> 6 files changed, 68 insertions(+), 19 deletions(-) >> >> diff --git a/config.h.in b/config.h.in >> index 43d32518ab..b182de0e91 100644 >> --- a/config.h.in >> +++ b/config.h.in >> @@ -138,6 +138,9 @@ >> /* LOONGARCH floating-point ABI for ld.so. */ >> #undef LOONGARCH_ABI_FRLEN >> >> +/* To Indicate whether we can use explicit relocs or not. */ >> +#undef HAVE_LOONGARCH_EXPLICIT_RELOCS >> + >> /* Linux specific: minimum supported kernel version. */ >> #undef __LINUX_KERNEL_VERSION >> >> 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) \ >
diff --git a/config.h.in b/config.h.in index 43d32518ab..b182de0e91 100644 --- a/config.h.in +++ b/config.h.in @@ -138,6 +138,9 @@ /* LOONGARCH floating-point ABI for ld.so. */ #undef LOONGARCH_ABI_FRLEN +/* To Indicate whether we can use explicit relocs or not. */ +#undef HAVE_LOONGARCH_EXPLICIT_RELOCS + /* Linux specific: minimum supported kernel version. */ #undef __LINUX_KERNEL_VERSION 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) \