[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 ® : 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 ® : 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> ®s) 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> ®s) 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