From patchwork Fri Aug 26 08:03:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 57078 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 47FFF38286D4 for ; Fri, 26 Aug 2022 08:04:06 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id BBAFF3858004 for ; Fri, 26 Aug 2022 08:03:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org BBAFF3858004 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by localhost.localdomain (Coremail) with SMTP id AQAAf8AxFeJcfghjvkAKAA--.46458S2; Fri, 26 Aug 2022 16:03:40 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name, xry111@xry111.site Subject: [PATCH 1/1] LoongArch: Fix ptr mangling/demangling features. Date: Fri, 26 Aug 2022 16:03:39 +0800 Message-Id: <20220826080339.2859494-1-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-CM-TRANSID: AQAAf8AxFeJcfghjvkAKAA--.46458S2 X-Coremail-Antispam: 1UD129KBjvJXoW3Gw1xtryfWw18tF4kJrWrZrb_yoWxWF45pr y7uF4rtFs7W3WfGrWqva4SgFn5JF48Gry7u3WfAr48AF4UZw1rZwsayr93Wayjgas5G3y0 vr1rK3WUu3Z8ZwUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkI14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j 6r4UJwA2z4x0Y4vEx4A2jsIE14v26F4UJVW0owA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gc CE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E 2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJV W8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMxAI w28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr 4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUtVW8ZwCIc40Y0x0EwIxG rwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8Jw CI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2 z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbXdbUUUUUU== X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: xuchenghua@loongson.cn, caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Co-authored-by: Xi Ruoyao --- 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) \