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/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 <[email protected]> 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 <[email protected]> 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. _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
