[Lldb-commits] [lldb] [lldb] Infer GPR base size from registers when target arch is unset (PR #203498)

Charles Zablit via lldb-commits lldb-commits at lists.llvm.org
Fri Jun 12 07:18:27 PDT 2026


https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/203498

>From a3c29c43098bcd8ff36938d837a7bc977b3ad835 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Fri, 12 Jun 2026 11:28:22 +0100
Subject: [PATCH 1/3] [lldb] Infer GPR base size from registers when target
 arch is unset

---
 lldb/source/Plugins/ABI/X86/ABIX86.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lldb/source/Plugins/ABI/X86/ABIX86.cpp b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
index db170700d3f65..e905aed21d1af 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86.cpp
+++ b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
@@ -207,6 +207,20 @@ void ABIX86::AugmentRegisterInfo(
 
   uint32_t gpr_base_size =
       process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
+  // Determine the GPR base size. Prefer the target architecture, but fall
+  // back to the register list itself when the target arch isn't set yet
+  if (gpr_base_size == 0) {
+    for (const auto &reg : regs) {
+      if (reg.name == "rax" || reg.name == "rsp" || reg.name == "rip") {
+        gpr_base_size = 8;
+        break;
+      }
+      if (reg.name == "eax" || reg.name == "esp" || reg.name == "eip") {
+        gpr_base_size = 4;
+        break;
+      }
+    }
+  }
 
   // primary map from a base register to its subregisters
   BaseRegToRegsMap base_reg_map = makeBaseRegMap(gpr_base_size == 8);

>From 5606a90fe4cfcde9c706da9f81d1028668704d84 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Fri, 12 Jun 2026 14:30:45 +0100
Subject: [PATCH 2/3] fixup! [lldb] Infer GPR base size from registers when
 target arch is unset

---
 lldb/source/Plugins/ABI/X86/ABIX86.cpp    | 17 ++++-------------
 lldb/source/Plugins/ABI/X86/ABIX86.h      |  2 ++
 lldb/source/Plugins/ABI/X86/ABIX86_64.h   |  2 ++
 lldb/source/Plugins/ABI/X86/ABIX86_i386.h |  3 +++
 4 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/lldb/source/Plugins/ABI/X86/ABIX86.cpp b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
index e905aed21d1af..8e96e4193f795 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86.cpp
+++ b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
@@ -209,21 +209,12 @@ void ABIX86::AugmentRegisterInfo(
       process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
   // Determine the GPR base size. Prefer the target architecture, but fall
   // back to the register list itself when the target arch isn't set yet
-  if (gpr_base_size == 0) {
-    for (const auto &reg : regs) {
-      if (reg.name == "rax" || reg.name == "rsp" || reg.name == "rip") {
-        gpr_base_size = 8;
-        break;
-      }
-      if (reg.name == "eax" || reg.name == "esp" || reg.name == "eip") {
-        gpr_base_size = 4;
-        break;
-      }
-    }
-  }
+  bool is64bit = gpr_base_size == 8 || (gpr_base_size == 0 && Is64Bit());
+  if (gpr_base_size == 0)
+    gpr_base_size = is64bit ? 8 : 4;
 
   // primary map from a base register to its subregisters
-  BaseRegToRegsMap base_reg_map = makeBaseRegMap(gpr_base_size == 8);
+  BaseRegToRegsMap base_reg_map = makeBaseRegMap(is64bit);
   // set used for fast matching of register names to subregisters
   llvm::SmallDenseSet<llvm::StringRef, 64> subreg_name_set;
   // convenience array providing access to all subregisters of given kind,
diff --git a/lldb/source/Plugins/ABI/X86/ABIX86.h b/lldb/source/Plugins/ABI/X86/ABIX86.h
index 1114084fbc5d8..05985c9e1f5b1 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86.h
+++ b/lldb/source/Plugins/ABI/X86/ABIX86.h
@@ -21,6 +21,8 @@ class ABIX86 : public lldb_private::MCBasedABI {
   void AugmentRegisterInfo(
       std::vector<lldb_private::DynamicRegisterInfo::Register> &regs) override;
 
+  virtual bool Is64Bit() const = 0;
+
 private:
   using lldb_private::MCBasedABI::MCBasedABI;
 };
diff --git a/lldb/source/Plugins/ABI/X86/ABIX86_64.h b/lldb/source/Plugins/ABI/X86/ABIX86_64.h
index 8fc98507adeeb..761f0670bc860 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86_64.h
+++ b/lldb/source/Plugins/ABI/X86/ABIX86_64.h
@@ -18,6 +18,8 @@ class ABIX86_64 : public ABIX86 {
     return name;
   }
 
+  bool Is64Bit() const override { return true; }
+
 private:
   using ABIX86::ABIX86;
 };
diff --git a/lldb/source/Plugins/ABI/X86/ABIX86_i386.h b/lldb/source/Plugins/ABI/X86/ABIX86_i386.h
index cb3baa5150fc3..feb92dbc6d5e1 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86_i386.h
+++ b/lldb/source/Plugins/ABI/X86/ABIX86_i386.h
@@ -15,6 +15,9 @@ class ABIX86_i386 : public ABIX86 {
 public:
   uint32_t GetGenericNum(llvm::StringRef name) override;
 
+protected:
+  bool Is64Bit() const override { return false; }
+
 private:
   using ABIX86::ABIX86;
 };

>From bcefa11a5ceeb6fc11ad1e7186ce46516852e282 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Fri, 12 Jun 2026 15:18:12 +0100
Subject: [PATCH 3/3] fixup! [lldb] Infer GPR base size from registers when
 target arch is unset

---
 lldb/source/Plugins/ABI/X86/ABIX86.cpp                     | 7 +------
 lldb/source/Plugins/ABI/X86/ABIX86.h                       | 2 --
 lldb/source/Plugins/ABI/X86/ABIX86_64.h                    | 2 --
 lldb/source/Plugins/ABI/X86/ABIX86_i386.h                  | 3 ---
 .../source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 3 +++
 5 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/lldb/source/Plugins/ABI/X86/ABIX86.cpp b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
index 8e96e4193f795..db170700d3f65 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86.cpp
+++ b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
@@ -207,14 +207,9 @@ void ABIX86::AugmentRegisterInfo(
 
   uint32_t gpr_base_size =
       process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
-  // Determine the GPR base size. Prefer the target architecture, but fall
-  // back to the register list itself when the target arch isn't set yet
-  bool is64bit = gpr_base_size == 8 || (gpr_base_size == 0 && Is64Bit());
-  if (gpr_base_size == 0)
-    gpr_base_size = is64bit ? 8 : 4;
 
   // primary map from a base register to its subregisters
-  BaseRegToRegsMap base_reg_map = makeBaseRegMap(is64bit);
+  BaseRegToRegsMap base_reg_map = makeBaseRegMap(gpr_base_size == 8);
   // set used for fast matching of register names to subregisters
   llvm::SmallDenseSet<llvm::StringRef, 64> subreg_name_set;
   // convenience array providing access to all subregisters of given kind,
diff --git a/lldb/source/Plugins/ABI/X86/ABIX86.h b/lldb/source/Plugins/ABI/X86/ABIX86.h
index 05985c9e1f5b1..1114084fbc5d8 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86.h
+++ b/lldb/source/Plugins/ABI/X86/ABIX86.h
@@ -21,8 +21,6 @@ class ABIX86 : public lldb_private::MCBasedABI {
   void AugmentRegisterInfo(
       std::vector<lldb_private::DynamicRegisterInfo::Register> &regs) override;
 
-  virtual bool Is64Bit() const = 0;
-
 private:
   using lldb_private::MCBasedABI::MCBasedABI;
 };
diff --git a/lldb/source/Plugins/ABI/X86/ABIX86_64.h b/lldb/source/Plugins/ABI/X86/ABIX86_64.h
index 761f0670bc860..8fc98507adeeb 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86_64.h
+++ b/lldb/source/Plugins/ABI/X86/ABIX86_64.h
@@ -18,8 +18,6 @@ class ABIX86_64 : public ABIX86 {
     return name;
   }
 
-  bool Is64Bit() const override { return true; }
-
 private:
   using ABIX86::ABIX86;
 };
diff --git a/lldb/source/Plugins/ABI/X86/ABIX86_i386.h b/lldb/source/Plugins/ABI/X86/ABIX86_i386.h
index feb92dbc6d5e1..cb3baa5150fc3 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86_i386.h
+++ b/lldb/source/Plugins/ABI/X86/ABIX86_i386.h
@@ -15,9 +15,6 @@ class ABIX86_i386 : public ABIX86 {
 public:
   uint32_t GetGenericNum(llvm::StringRef name) override;
 
-protected:
-  bool Is64Bit() const override { return false; }
-
 private:
   using ABIX86::ABIX86;
 };
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 2fc6dbb546f79..4b879c23ce119 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -5505,6 +5505,9 @@ void ProcessGDBRemote::AddRemoteRegisters(
                     remote_reg_info.invalidate_regs.begin(), proc_to_lldb);
   }
 
+  if (!GetTarget().GetArchitecture().IsValid() && arch_to_use.IsValid())
+    GetTarget().SetArchitecture(arch_to_use);
+
   // Don't use Process::GetABI, this code gets called from DidAttach, and
   // in that context we haven't set the Target's architecture yet, so the
   // ABI is also potentially incorrect.



More information about the lldb-commits mailing list