[Lldb-commits] [lldb] [lldb][Process/FreeBSDKernel] Fix broken debugging on aarch64 (PR #180222)

Minsoo Choo via lldb-commits lldb-commits at lists.llvm.org
Mon Feb 9 07:06:57 PST 2026


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 <minsoochoo0122 at proton.me>
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 <minsoochoo0122 at proton.me>
---
 .../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 <minsoochoo0122 at proton.me>
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 <minsoochoo0122 at proton.me>
---
 .../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 1798331978ba99cb87878ced9d7b7aa5e69810b7 Mon Sep 17 00:00:00 2001
From: Minsoo Choo <minsoochoo0122 at proton.me>
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 <minsoochoo0122 at proton.me>
---
 .../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..1a329f80dfee8 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 %d.", 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



More information about the lldb-commits mailing list