From nobody Tue Dec 9 15:52:56 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4dQjzr1ywbz6Kpmk for ; Tue, 09 Dec 2025 15:52:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dQjzr0wQXz43Vh for ; Tue, 09 Dec 2025 15:52:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765295576; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uCXtxJHrvd+udxuFn6UCpVivbSnQQGvM8306+O04tcE=; b=Y6enN/0TMgZaC2g9/ue91+AozzkDrZK7s6M8mzE8LwLwKtEGofcT1IyKDrniQMisM1CEEm bMwhTvqdwl7naNBs2v1VmMUDDwmNLyNN/9NWAidBPdrAUw5DZmFT2SWy7yeT4+8mlu5zJP YTXHYO3/QyUINyTR1hhmap8iqfJfdbHB42wt2zGwLCqSsGX7XDNcDTUclyLEar6jfcG2cb mhgQYaiwMLiH0PpGLirgb4qiQtZFJTdmifkO/pU4w6+YpT8OtjIUN0GORq/x4/4WyEa/Fw O1GxTdYbM8y8Mf++AU+DTbRwGOP/GEix2WIvuSYha+i/5WQkmRX9hsFQCp1Pgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765295576; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uCXtxJHrvd+udxuFn6UCpVivbSnQQGvM8306+O04tcE=; b=EKQg3ZUXMDS/01kOqyirIiHDVn2I7i1WScUc/8t7hbXd+U4t6sk5SG6pXOSlHM35l7onKx SXVhM6Y7Bc0a7bqt/rJaMQ/6fdwBsy8Q5YlgDWBxWTEJ2YcC4HqKVjjpQxcZBcRmsURUjl Ems7DCcGVzURNeiNJbkkFKTdOqF5MvjM04FBHZlomNg66dv9vaA6TZhXZfEG44DekS0OhF qtIKdviC4hka1Wv+Na4Cv8PXxCkleLYI0vad+Y2Z7uhZdNYQRP0ZHE/rejkWRHcHZMXByZ wvo9tc+LeWNuR/Wa0G/3m+yrp3bjQXk5cgc+CpQfqOfM37dt+vdcdwdehdXgJQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1765295576; a=rsa-sha256; cv=none; b=hyM/ISsMb73MmOodGuePrcuBavuBjBS7vkiLBvrIfsDAoJHzXQxMVniwJirX2z/vcl23+4 ri2XcDkU8uFMySGh/ceB4s7dB1CBYM5Osj4eku5oPxo0RZscrCmWkxafQlNMSSInwTcmvr ZNo5z9Tb1hAedm+6zHDw1aBF9MoWSPkBkwDo4IOAX7au7VG1XUMmkpCEypM6/CLG2Ga23P JMwKcjnIwZIzrBXeeQJp6YUbMOp0zSz+s/sslH0MPjPswiCqrO1yeFnaUm/TjxtXOZMG/i WIXPFy3BBxmSi3S617Xiu7QDLq3kAYKkzVBwocC1/DH8F0Ys56uH9P/vL9Q5Ew== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dQjzr0Csqz14Wr for ; Tue, 09 Dec 2025 15:52:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3364f by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 09 Dec 2025 15:52:56 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: ShengYi Hung From: Ed Maste Subject: git: 20133eccbdd8 - stable/14 - lldb: Fix empty register set when trying to get size of register List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: emaste X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 20133eccbdd854915e88c6f720212814f2f5313b Auto-Submitted: auto-generated Date: Tue, 09 Dec 2025 15:52:56 +0000 Message-Id: <693845d8.3364f.3d426240@gitrepo.freebsd.org> The branch stable/14 has been updated by emaste: URL: https://cgit.FreeBSD.org/src/commit/?id=20133eccbdd854915e88c6f720212814f2f5313b commit 20133eccbdd854915e88c6f720212814f2f5313b Author: ShengYi Hung AuthorDate: 2025-11-21 18:30:25 +0000 Commit: Ed Maste CommitDate: 2025-12-09 15:52:31 +0000 lldb: Fix empty register set when trying to get size of register The register set information is stored as a singleton in GetRegisterInfo_i386. However, other functions later access this information assuming it is stored in GetSharedRegisterInfoVector. To resolve this inconsistency, we remove the original construction logic and instead initialize the singleton using llvm::call_once within the appropriate function (GetSharedRegisterInfoVector_i386). PR: 289945 Obtained from: llvm-project 41859c27842eeda1ef6ff18f3b2fb269388c0857 (cherry picked from commit 1d1a2e6932d682c40ab878bf83cbbde02d8d0af1) (cherry picked from commit ee286907ad455f967233f715bd468f1d0ff01f6c) --- .../Utility/RegisterContextFreeBSD_x86_64.cpp | 44 ++++++++++------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.cpp b/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.cpp index e0f3971c6e27..c361b2abb726 100644 --- a/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.cpp +++ b/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.cpp @@ -9,6 +9,7 @@ #include "RegisterContextFreeBSD_x86_64.h" #include "RegisterContextFreeBSD_i386.h" #include "RegisterContextPOSIX_x86.h" +#include "llvm/Support/Threading.h" #include using namespace lldb_private; @@ -69,40 +70,34 @@ struct UserArea { #include "RegisterInfos_x86_64.h" #undef DECLARE_REGISTER_INFOS_X86_64_STRUCT -static std::vector &GetSharedRegisterInfoVector() { - static std::vector register_infos; - return register_infos; -} - -static const RegisterInfo * -GetRegisterInfo_i386(const lldb_private::ArchSpec &arch) { - static std::vector g_register_infos( - GetSharedRegisterInfoVector()); - - // Allocate RegisterInfo only once - if (g_register_infos.empty()) { - // Copy the register information from base class - std::unique_ptr reg_interface( - new RegisterContextFreeBSD_i386(arch)); - const RegisterInfo *base_info = reg_interface->GetRegisterInfo(); - g_register_infos.insert(g_register_infos.end(), &base_info[0], - &base_info[k_num_registers_i386]); +static std::vector & +GetSharedRegisterInfoVector_i386(const lldb_private::ArchSpec &arch) { + static std::vector g_register_infos; + static llvm::once_flag g_initialized; + llvm::call_once(g_initialized, [&]() { + if (g_register_infos.empty()) { + // Copy the register information from base class + std::unique_ptr reg_interface( + new RegisterContextFreeBSD_i386(arch)); + const RegisterInfo *base_info = reg_interface->GetRegisterInfo(); + g_register_infos.insert(g_register_infos.end(), &base_info[0], + &base_info[k_num_registers_i386]); // Include RegisterInfos_x86_64 to update the g_register_infos structure // with x86_64 offsets. #define UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS #include "RegisterInfos_x86_64.h" #undef UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS - } - - return &g_register_infos[0]; + } + }); + return g_register_infos; } static const RegisterInfo * PrivateGetRegisterInfoPtr(const lldb_private::ArchSpec &target_arch) { switch (target_arch.GetMachine()) { case llvm::Triple::x86: - return GetRegisterInfo_i386(target_arch); + return &GetSharedRegisterInfoVector_i386(target_arch)[0]; case llvm::Triple::x86_64: return g_register_infos_x86_64; default: @@ -116,9 +111,10 @@ PrivateGetRegisterCount(const lldb_private::ArchSpec &target_arch) { switch (target_arch.GetMachine()) { case llvm::Triple::x86: // This vector should have already been filled. - assert(!GetSharedRegisterInfoVector().empty() && + assert(!GetSharedRegisterInfoVector_i386(target_arch).empty() && "i386 register info vector not filled."); - return static_cast(GetSharedRegisterInfoVector().size()); + return static_cast( + GetSharedRegisterInfoVector_i386(target_arch).size()); case llvm::Triple::x86_64: return static_cast(sizeof(g_register_infos_x86_64) / sizeof(g_register_infos_x86_64[0]));