From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id eeDLCAvAVGqTVgUAWB0awg (envelope-from ) for ; Mon, 13 Jul 2026 06:38:03 -0400 Received: by simark.ca (Postfix, from userid 112) id 2099C1E098; Mon, 13 Jul 2026 06:38:03 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.3 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 2B3681E04F for ; Mon, 13 Jul 2026 06:38:01 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F00264BA2E11 for ; Mon, 13 Jul 2026 10:37:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F00264BA2E11 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 3919F4BA5434 for ; Mon, 13 Jul 2026 10:37:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3919F4BA5434 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3919F4BA5434 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783939055; cv=none; b=KWNCXopBPpsVpJH/sG/PpWzFmub1fduH8zEppLJ6+0DQbxJC4RO8b0TOyXILdTTkwE7LcOzCuzlk9qodQrdoI1DZ6xN3MsiGuCef/3mr/VX28U0Lzi15PQKAD13l7a38iF6H3jZT8jcXgbJ3iLIX0ja/uhBVr94kpfMvS2AQfk4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1783939055; c=relaxed/simple; bh=FITU4Qo95XbrXaDAZtBeD/Ox2+411A7YCKdPnVM+LzM=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=m1sKmXTlHMVXjbWZUFaKB2fWtwCzjqJx13GM//HoikNKkKKK0XtDk9AYSAGDiXDqyjOjPsZ1x8RJhEUXWRqEsBh1rPbs6p4ckEZwDq5zYDKiyqoAXi4X/DOWb7gQTZgBtUNCylzETKV7LOtGIhw9A4vKs7A7ROqa2DgZeJ7CQFI= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3919F4BA5434 Received: from loongson.cn (unknown [113.200.148.30]) by gateway (Coremail) with SMTP id _____8CxJOrmv1RqxAQDAA--.10875S3; Mon, 13 Jul 2026 18:37:27 +0800 (CST) Received: from localhost.localdomain (unknown [113.200.148.30]) by front1 (Coremail) with SMTP id qMiowJDxu8Tlv1Rqr+ILAA--.2405S2; Mon, 13 Jul 2026 18:37:25 +0800 (CST) From: Hui Li To: gdb-patches@sourceware.org Cc: Tiezhu Yang Subject: [PATCH] gdb: LoongArch: Add internal TLS support Date: Mon, 13 Jul 2026 18:37:24 +0800 Message-Id: <20260713103724.7713-1-lihui@loongson.cn> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: qMiowJDxu8Tlv1Rqr+ILAA--.2405S2 X-CM-SenderInfo: 5olk3xo6or00hjvr0hdfq/ X-Coremail-Antispam: 1Uk129KBj93XoW3JFy8GFyDGF15uFyfZF45twc_yoWxJFyUpF ZrCr17tr48Jrn7CrnrG3WFvrW3XrZ7uryjgrWfWFy5Cr1DXw4xuws5KFy7ZF15C3WUtr4S gF4kA3Z09FWDJFXCm3ZEXasCq-sJn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUkFb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVW8Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l57IF6xkI12xvs2x26I8E6xACxx 1l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv 67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41l42xK82IYc2 Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s02 6x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAKI48JMIIF0x vE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE 42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6x kF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07UE-erUUUUU= X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Implements the LoongArch-specific get_tls_dtv_addr() and uses svr4_tls_register_tls_methods() to register it, together with svr4_tls_get_thread_local_address as the get_thread_local_address gdbarch method, to support internal TLS address lookup. LoongArch doesn't need get_tls_dtp_offset since musl's DTP_OFFSET is defined as 0. This is the LoongArch version of commit c34309bea22 ("Internal TLS support for aarch64, x86_64, riscv, ppc64, and s390x"). Depends-On: bfc3ac0d13b ("LoongArch: Support R_LARCH_TLS_DTPREL32/64 used in debug section") Before: make check-gdb TESTS="gdb.base/tls-nothreads.exp" === gdb Summary === # of expected passes 101 # of known failures 48 make check-gdb TESTS="gdb.base/tls-dlobj.exp" === gdb Summary === # of expected passes 261 After: make check-gdb TESTS="gdb.base/tls-nothreads.exp" === gdb Summary === # of expected passes 302 make check-gdb TESTS="gdb.base/tls-dlobj.exp" === gdb Summary === # of expected passes 523 Signed-off-by: Hui Li --- gdb/arch/loongarch.h | 1 + gdb/configure.tgt | 2 +- gdb/loongarch-linux-tdep.c | 54 +++++++++++++++++++++++ gdb/testsuite/gdb.base/tls-common.exp.tcl | 2 +- 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/gdb/arch/loongarch.h b/gdb/arch/loongarch.h index ee9d378afd6..ec3d0d195c9 100644 --- a/gdb/arch/loongarch.h +++ b/gdb/arch/loongarch.h @@ -26,6 +26,7 @@ enum loongarch_regnum { LOONGARCH_RA_REGNUM = 1, /* Return Address. */ + LOONGARCH_TP_REGNUM = 2, /* Thread Pointer. */ LOONGARCH_SP_REGNUM = 3, /* Stack Pointer. */ LOONGARCH_A0_REGNUM = 4, /* First Argument/Return Value. */ LOONGARCH_A7_REGNUM = 11, /* Seventh Argument/Syscall Number. */ diff --git a/gdb/configure.tgt b/gdb/configure.tgt index 362de60065c..7313b31e42a 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -374,7 +374,7 @@ loongarch*-*-linux*) # Target: LoongArch running Linux gdb_target_obs="loongarch-linux-tdep.o glibc-tdep.o \ linux-tdep.o solib-svr4.o solib-svr4-linux.o \ - linux-record.o" + linux-record.o svr4-tls-tdep.o" ;; m32c-*-*) diff --git a/gdb/loongarch-linux-tdep.c b/gdb/loongarch-linux-tdep.c index bab84fd126a..9ccb26914a7 100644 --- a/gdb/loongarch-linux-tdep.c +++ b/gdb/loongarch-linux-tdep.c @@ -26,6 +26,7 @@ #include "linux-record.h" #include "linux-tdep.h" #include "solib-svr4-linux.h" +#include "svr4-tls-tdep.h" #include "loongarch-tdep.h" #include "record-full.h" #include "regset.h" @@ -1137,6 +1138,57 @@ init_loongarch_linux_record_tdep (struct gdbarch *gdbarch) loongarch_linux_record_tdep.arg7 = LOONGARCH_A0_REGNUM + 6; } +/* Fetch and return the TLS DTV (dynamic thread vector) address for PTID. + Throw a suitable TLS error if something goes wrong. */ + +static CORE_ADDR +loongarch_linux_get_tls_dtv_addr (struct gdbarch *gdbarch, ptid_t ptid, + svr4_tls_libc libc) +{ + /* On LoongArch, the thread pointer is found in TP. */ + regcache *regcache + = get_thread_arch_regcache (current_inferior (), ptid, gdbarch); + target_fetch_registers (regcache, LOONGARCH_TP_REGNUM); + ULONGEST thr_ptr; + if (regcache->cooked_read (LOONGARCH_TP_REGNUM, &thr_ptr) != REG_VALID) + throw_error (TLS_GENERIC_ERROR, _("Unable to fetch thread pointer")); + + CORE_ADDR dtv_ptr_addr; + switch (libc) + { + case svr4_tls_libc_musl: + /* MUSL: The DTV pointer is found at the very end of the pthread + struct which is located *before* the thread pointer. I.e. + the thread pointer will be just beyond the end of the struct, + so the address of the DTV pointer is found one pointer-size + before the thread pointer. */ + dtv_ptr_addr = thr_ptr - (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT); + break; + case svr4_tls_libc_glibc: + /* GLIBC: The thread pointer (TP) points just beyond the end of + the TCB (thread control block). On LoongArch, this struct + (tcbhead_t) is defined to contain two pointers. The first is + a pointer to the DTV and the second is a pointer to private + data. So the DTV pointer address is found two pointer-size + before thread pointer. */ + + dtv_ptr_addr = thr_ptr - 2 * (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT); + break; + default: + throw_error (TLS_GENERIC_ERROR, _("Unknown LoongArch C library")); + break; + } + + gdb::byte_vector buf (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT); + if (target_read_memory (dtv_ptr_addr, buf.data (), buf.size ()) != 0) + throw_error (TLS_GENERIC_ERROR, _("Unable to fetch DTV address")); + + const struct builtin_type *builtin = builtin_type (gdbarch); + CORE_ADDR dtv_addr = gdbarch_pointer_to_address + (gdbarch, builtin->builtin_data_ptr, buf.data ()); + return dtv_addr; +} + /* Initialize LoongArch Linux ABI info. */ static void @@ -1158,6 +1210,8 @@ loongarch_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); + set_gdbarch_get_thread_local_address (gdbarch, svr4_tls_get_thread_local_address); + svr4_tls_register_tls_methods (info, gdbarch, loongarch_linux_get_tls_dtv_addr); /* Prepend tramp frame unwinder for signal. */ tramp_frame_prepend_unwinder (gdbarch, &loongarch_linux_rt_sigframe); diff --git a/gdb/testsuite/gdb.base/tls-common.exp.tcl b/gdb/testsuite/gdb.base/tls-common.exp.tcl index 06cab649519..53ed1ca4d8a 100644 --- a/gdb/testsuite/gdb.base/tls-common.exp.tcl +++ b/gdb/testsuite/gdb.base/tls-common.exp.tcl @@ -26,7 +26,7 @@ require {is_any_target "*-*-linux*"} set internal_tls_linux_targets {"x86_64-*-linux*" "aarch64-*-linux*" "riscv*-*-linux*" "powerpc64*-*-linux*" - "s390x*-*-linux*"} + "s390x*-*-linux*" "loongarch*-*-linux*"} # The "maint set force-internal-tls-address-lookup" command is only # available for certain Linux architectures. Don't attempt to force -- 2.48.1