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 <[email protected]>
Date: Fri, 12 Jun 2026 11:28:22 +0100
Subject: [PATCH 1/5] [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 <[email protected]>
Date: Fri, 12 Jun 2026 14:30:45 +0100
Subject: [PATCH 2/5] 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 <[email protected]>
Date: Fri, 12 Jun 2026 15:18:12 +0100
Subject: [PATCH 3/5] 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.

>From 5add4f11a4d86b1393d8d88a37302d2c7e8b8104 Mon Sep 17 00:00:00 2001
From: Charles Zablit <[email protected]>
Date: Mon, 22 Jun 2026 16:35:14 +0100
Subject: [PATCH 4/5] defer BuildDynamicRegisterInfo call

---
 lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp 
b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 4b879c23ce119..99bdb7111bc0c 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -1002,7 +1002,6 @@ Status 
ProcessGDBRemote::ConnectToDebugserver(llvm::StringRef connect_url) {
 
 void ProcessGDBRemote::DidLaunchOrAttach(ArchSpec &process_arch) {
   Log *log = GetLog(GDBRLog::Process);
-  BuildDynamicRegisterInfo(false);
 
   // See if the GDB server supports qHostInfo or qProcessInfo packets. Prefer
   // qProcessInfo as it will be more specific to our process.
@@ -1081,6 +1080,8 @@ void ProcessGDBRemote::DidLaunchOrAttach(ArchSpec 
&process_arch) {
     }
   }
 
+  BuildDynamicRegisterInfo(false);
+
   // Target and Process are reasonably initailized;
   // load any binaries we have metadata for / set load address.
   LoadStubBinaries();
@@ -5505,9 +5506,6 @@ 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.

>From 4022af859212842797f6a90e230c99cca1897aa2 Mon Sep 17 00:00:00 2001
From: Charles Zablit <[email protected]>
Date: Wed, 24 Jun 2026 15:03:00 +0100
Subject: [PATCH 5/5] fixup! [lldb] Infer GPR base size from registers when
 target arch is unset

---
 lldb/source/Plugins/ABI/X86/ABIX86.cpp                      | 5 ++---
 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 +++
 lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 3 +--
 5 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/lldb/source/Plugins/ABI/X86/ABIX86.cpp 
b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
index db170700d3f65..de7eefab58d1b 100644
--- a/lldb/source/Plugins/ABI/X86/ABIX86.cpp
+++ b/lldb/source/Plugins/ABI/X86/ABIX86.cpp
@@ -205,11 +205,10 @@ void ABIX86::AugmentRegisterInfo(
   if (!process_sp)
     return;
 
-  uint32_t gpr_base_size =
-      process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
+  uint32_t 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;
 };
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp 
b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 99bdb7111bc0c..2fc6dbb546f79 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -1002,6 +1002,7 @@ Status 
ProcessGDBRemote::ConnectToDebugserver(llvm::StringRef connect_url) {
 
 void ProcessGDBRemote::DidLaunchOrAttach(ArchSpec &process_arch) {
   Log *log = GetLog(GDBRLog::Process);
+  BuildDynamicRegisterInfo(false);
 
   // See if the GDB server supports qHostInfo or qProcessInfo packets. Prefer
   // qProcessInfo as it will be more specific to our process.
@@ -1080,8 +1081,6 @@ void ProcessGDBRemote::DidLaunchOrAttach(ArchSpec 
&process_arch) {
     }
   }
 
-  BuildDynamicRegisterInfo(false);
-
   // Target and Process are reasonably initailized;
   // load any binaries we have metadata for / set load address.
   LoadStubBinaries();

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to