https://github.com/mchoo7 updated https://github.com/llvm/llvm-project/pull/180222
>From cdb644c0f10eed626480e434366b0d78d16d8d17 Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Fri, 6 Feb 2026 11:15:14 -0500 Subject: [PATCH 1/3] [lldb][Process/FreeBSDKernel] Fix broken debugging on aarch64 Signed-off-by: Minsoo Choo <[email protected]> --- .../RegisterContextFreeBSDKernel_arm64.cpp | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp index 11843ddc82d97..f8e7570548053 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp @@ -43,9 +43,9 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister( return false; struct { - llvm::support::ulittle64_t x[30]; - llvm::support::ulittle64_t lr; - llvm::support::ulittle64_t _reserved; +#define PCB_FP 10 +#define PCB_LR 11 + llvm::support::ulittle64_t x[12]; llvm::support::ulittle64_t sp; } pcb; @@ -57,25 +57,6 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister( uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; switch (reg) { - case gpr_x0_arm64: - case gpr_x1_arm64: - case gpr_x2_arm64: - case gpr_x3_arm64: - case gpr_x4_arm64: - case gpr_x5_arm64: - case gpr_x6_arm64: - case gpr_x7_arm64: - case gpr_x8_arm64: - case gpr_x9_arm64: - case gpr_x10_arm64: - case gpr_x11_arm64: - case gpr_x12_arm64: - case gpr_x13_arm64: - case gpr_x14_arm64: - case gpr_x15_arm64: - case gpr_x16_arm64: - case gpr_x17_arm64: - case gpr_x18_arm64: case gpr_x19_arm64: case gpr_x20_arm64: case gpr_x21_arm64: @@ -87,16 +68,19 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister( case gpr_x27_arm64: case gpr_x28_arm64: case gpr_fp_arm64: - static_assert(gpr_fp_arm64 - gpr_x0_arm64 == 29, + static_assert(gpr_fp_arm64 - gpr_x19_arm64 == PCB_FP, "nonconsecutive arm64 register numbers"); - value = pcb.x[reg - gpr_x0_arm64]; - break; - case gpr_sp_arm64: - value = pcb.sp; + value = pcb.x[reg - gpr_x19_arm64]; break; + case gpr_lr_arm64: case gpr_pc_arm64: // The pc of crashing thread is stored in lr. - value = pcb.lr; + static_assert(gpr_lr_arm64 - gpr_x19_arm64 == PCB_LR, + "nonconsecutive arm64 register numbers"); + value = pcb.x[reg - gpr_x19_arm64]; + break; + case gpr_sp_arm64: + value = pcb.sp; break; default: return false; >From 11882f4502b7bd9aee3d7f8f21e39d10305244ca Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Fri, 6 Feb 2026 13:43:31 -0500 Subject: [PATCH 2/3] fixup! [lldb][Process/FreeBSDKernel] Fix broken debugging on aarch64 Signed-off-by: Minsoo Choo <[email protected]> --- .../RegisterContextFreeBSDKernel_arm64.cpp | 163 ++++++++++++++---- .../RegisterContextFreeBSDKernel_arm64.h | 4 + 2 files changed, 134 insertions(+), 33 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp index f8e7570548053..9be283a4fa208 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp @@ -9,7 +9,9 @@ #include "RegisterContextFreeBSDKernel_arm64.h" #include "Plugins/Process/Utility/lldb-arm64-register-enums.h" +#include "lldb/Symbol/Symbol.h" #include "lldb/Target/Process.h" +#include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" #include "lldb/Utility/RegisterValue.h" #include "llvm/Support/Endian.h" @@ -49,41 +51,104 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister( llvm::support::ulittle64_t sp; } pcb; + struct { + llvm::support::ulittle64_t x[30]; + llvm::support::ulittle64_t lr; + llvm::support::ulittle64_t _reserved; + llvm::support::ulittle64_t sp; + } pcb13; + Status error; - size_t rd = - m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error); - if (rd != sizeof(pcb)) - return false; - uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; - switch (reg) { - case gpr_x19_arm64: - case gpr_x20_arm64: - case gpr_x21_arm64: - case gpr_x22_arm64: - case gpr_x23_arm64: - case gpr_x24_arm64: - case gpr_x25_arm64: - case gpr_x26_arm64: - case gpr_x27_arm64: - case gpr_x28_arm64: - case gpr_fp_arm64: - static_assert(gpr_fp_arm64 - gpr_x19_arm64 == PCB_FP, - "nonconsecutive arm64 register numbers"); - value = pcb.x[reg - gpr_x19_arm64]; - break; - case gpr_lr_arm64: - case gpr_pc_arm64: - // The pc of crashing thread is stored in lr. - static_assert(gpr_lr_arm64 - gpr_x19_arm64 == PCB_LR, - "nonconsecutive arm64 register numbers"); - value = pcb.x[reg - gpr_x19_arm64]; - break; - case gpr_sp_arm64: - value = pcb.sp; - break; - default: - return false; + // TODO: LLVM 24: Remove FreeBSD 13 support + if (GetOsreldate() > 1400084) { + size_t rd = + m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error); + if (rd != sizeof(pcb)) + return false; + + uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; + switch (reg) { + case gpr_x19_arm64: + case gpr_x20_arm64: + case gpr_x21_arm64: + case gpr_x22_arm64: + case gpr_x23_arm64: + case gpr_x24_arm64: + case gpr_x25_arm64: + case gpr_x26_arm64: + case gpr_x27_arm64: + case gpr_x28_arm64: + case gpr_fp_arm64: + static_assert(gpr_fp_arm64 - gpr_x19_arm64 == PCB_FP, + "nonconsecutive arm64 register numbers"); + value = pcb.x[reg - gpr_x19_arm64]; + break; + case gpr_lr_arm64: + case gpr_pc_arm64: + // The pc of crashing thread is stored in lr. + static_assert(gpr_lr_arm64 - gpr_x19_arm64 == PCB_LR, + "nonconsecutive arm64 register numbers"); + value = pcb.x[reg - gpr_x19_arm64]; + break; + case gpr_sp_arm64: + value = pcb.sp; + break; + default: + return false; + } + } else { + size_t rd = m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb13, + sizeof(pcb13), error); + if (rd != sizeof(pcb13)) + return false; + + uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; + switch (reg) { + case gpr_x0_arm64: + case gpr_x1_arm64: + case gpr_x2_arm64: + case gpr_x3_arm64: + case gpr_x4_arm64: + case gpr_x5_arm64: + case gpr_x6_arm64: + case gpr_x7_arm64: + case gpr_x8_arm64: + case gpr_x9_arm64: + case gpr_x10_arm64: + case gpr_x11_arm64: + case gpr_x12_arm64: + case gpr_x13_arm64: + case gpr_x14_arm64: + case gpr_x15_arm64: + case gpr_x16_arm64: + case gpr_x17_arm64: + case gpr_x18_arm64: + case gpr_x19_arm64: + case gpr_x20_arm64: + case gpr_x21_arm64: + case gpr_x22_arm64: + case gpr_x23_arm64: + case gpr_x24_arm64: + case gpr_x25_arm64: + case gpr_x26_arm64: + case gpr_x27_arm64: + case gpr_x28_arm64: + case gpr_fp_arm64: + static_assert(gpr_fp_arm64 - gpr_x0_arm64 == 29, + "nonconsecutive arm64 register numbers"); + value = pcb13.x[reg - gpr_x0_arm64]; + break; + case gpr_sp_arm64: + value = pcb13.sp; + break; + case gpr_pc_arm64: + // The pc of crashing thread is stored in lr. + value = pcb13.lr; + break; + default: + return false; + } } return true; } @@ -92,3 +157,35 @@ bool RegisterContextFreeBSDKernel_arm64::WriteRegister( const RegisterInfo *reg_info, const RegisterValue &value) { return false; } + +int64_t RegisterContextFreeBSDKernel_arm64::GetOsreldate() { + ProcessSP process_sp = m_thread.GetProcess(); + if (!process_sp) + return 0; + + Target &target = process_sp->GetTarget(); + + SymbolContextList sc_list; + target.GetImages().FindSymbolsWithNameAndType(ConstString("osreldate"), + lldb::eSymbolTypeData, sc_list); + + if (sc_list.GetSize() > 0) { + SymbolContext sc; + sc_list.GetContextAtIndex(0, sc); + + if (sc.symbol) { + lldb::addr_t addr = sc.symbol->GetLoadAddress(&target); + if (addr != LLDB_INVALID_ADDRESS) { + Status error; + int64_t osreldate = 0; + size_t bytes_read = + process_sp->ReadMemory(addr, &osreldate, sizeof(osreldate), error); + if (bytes_read == sizeof(osreldate) && error.Success()) { + return osreldate; + } + } + } + } + + return 0; +} diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h index 155dda6e748f5..6763bec1ba686 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h @@ -12,6 +12,8 @@ #include "Plugins/Process/Utility/RegisterContextPOSIX_arm64.h" #include "Plugins/Process/elf-core/RegisterUtilities.h" +#include "lldb/Target/Target.h" + class RegisterContextFreeBSDKernel_arm64 : public RegisterContextPOSIX_arm64 { public: RegisterContextFreeBSDKernel_arm64( @@ -36,6 +38,8 @@ class RegisterContextFreeBSDKernel_arm64 : public RegisterContextPOSIX_arm64 { private: lldb::addr_t m_pcb_addr; + + int64_t GetOsreldate(); }; #endif // LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_ARM64_H >From 1f04ae02ac02867bf9cde60662a0eb0d14860e7b Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Mon, 9 Feb 2026 10:01:12 -0500 Subject: [PATCH 3/3] fixup! [lldb][Process/FreeBSDKernel] Fix broken debugging on aarch64 Signed-off-by: Minsoo Choo <[email protected]> --- .../RegisterContextFreeBSDKernel_arm64.cpp | 40 +++++++++++-------- .../RegisterContextFreeBSDKernel_arm64.h | 4 +- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp index 9be283a4fa208..334b74bd9afc6 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.cpp @@ -13,12 +13,16 @@ #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" +#include "lldb/Utility/LLDBLog.h" +#include "lldb/Utility/Log.h" #include "lldb/Utility/RegisterValue.h" #include "llvm/Support/Endian.h" using namespace lldb; using namespace lldb_private; +#define FBSD14 1400084 + RegisterContextFreeBSDKernel_arm64::RegisterContextFreeBSDKernel_arm64( Thread &thread, std::unique_ptr<RegisterInfoPOSIX_arm64> register_info_up, lldb::addr_t pcb_addr) @@ -61,7 +65,7 @@ bool RegisterContextFreeBSDKernel_arm64::ReadRegister( Status error; // TODO: LLVM 24: Remove FreeBSD 13 support - if (GetOsreldate() > 1400084) { + if (GetOsreldate() >= FBSD14) { size_t rd = m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error); if (rd != sizeof(pcb)) @@ -158,7 +162,7 @@ bool RegisterContextFreeBSDKernel_arm64::WriteRegister( return false; } -int64_t RegisterContextFreeBSDKernel_arm64::GetOsreldate() { +int RegisterContextFreeBSDKernel_arm64::GetOsreldate() { ProcessSP process_sp = m_thread.GetProcess(); if (!process_sp) return 0; @@ -169,20 +173,24 @@ int64_t RegisterContextFreeBSDKernel_arm64::GetOsreldate() { target.GetImages().FindSymbolsWithNameAndType(ConstString("osreldate"), lldb::eSymbolTypeData, sc_list); - if (sc_list.GetSize() > 0) { - SymbolContext sc; - sc_list.GetContextAtIndex(0, sc); - - if (sc.symbol) { - lldb::addr_t addr = sc.symbol->GetLoadAddress(&target); - if (addr != LLDB_INVALID_ADDRESS) { - Status error; - int64_t osreldate = 0; - size_t bytes_read = - process_sp->ReadMemory(addr, &osreldate, sizeof(osreldate), error); - if (bytes_read == sizeof(osreldate) && error.Success()) { - return osreldate; - } + if (sc_list.GetSize() == 0) { + LLDB_LOGF(GetLog(LLDBLog::Object), + "Cannot find osreldate. Defaulting to {0}.", FBSD14); + return FBSD14; + } + + SymbolContext sc; + sc_list.GetContextAtIndex(0, sc); + + if (sc.symbol) { + lldb::addr_t addr = sc.symbol->GetLoadAddress(&target); + if (addr != LLDB_INVALID_ADDRESS) { + Status error; + int64_t osreldate = 0; + size_t bytes_read = + process_sp->ReadMemory(addr, &osreldate, sizeof(osreldate), error); + if (bytes_read == sizeof(osreldate) && error.Success()) { + return osreldate; } } } diff --git a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h index 6763bec1ba686..25b2767ee5b9f 100644 --- a/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h +++ b/lldb/source/Plugins/Process/FreeBSDKernel/RegisterContextFreeBSDKernel_arm64.h @@ -12,8 +12,6 @@ #include "Plugins/Process/Utility/RegisterContextPOSIX_arm64.h" #include "Plugins/Process/elf-core/RegisterUtilities.h" -#include "lldb/Target/Target.h" - class RegisterContextFreeBSDKernel_arm64 : public RegisterContextPOSIX_arm64 { public: RegisterContextFreeBSDKernel_arm64( @@ -39,7 +37,7 @@ class RegisterContextFreeBSDKernel_arm64 : public RegisterContextPOSIX_arm64 { private: lldb::addr_t m_pcb_addr; - int64_t GetOsreldate(); + int GetOsreldate(); }; #endif // LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNEL_ARM64_H _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
