[Lldb-commits] [lldb] 81cd5b6 - [lldb] Convert generic register names in a case insensitive way (#213001)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Jul 31 02:28:41 PDT 2026
Author: David Spickett
Date: 2026-07-31T10:28:36+01:00
New Revision: 81cd5b6217f12ada97e0f1791ba8545120c13230
URL: https://github.com/llvm/llvm-project/commit/81cd5b6217f12ada97e0f1791ba8545120c13230
DIFF: https://github.com/llvm/llvm-project/commit/81cd5b6217f12ada97e0f1791ba8545120c13230.diff
LOG: [lldb] Convert generic register names in a case insensitive way (#213001)
Part of #212778.
There are 3 types of register name:
* The primary name, displayed by default.
* An optional alias, for example AArch64 "lr" is also "x30".
* Generic convenience names like "sp", "ra" and so on.
The first two types are handled case insensitively, but generic names
were not. For example:
(lldb) register read RA
error: Invalid register name 'RA'
(lldb) register read ra
lr = 0x0000fffff7e27400
In this change I've fixed that.
This does close a workaround for #212778, where you could get to the
actual x86_64 "sp" by using "sP". However, this is only known to work on
Linux, and other architectures are negatively impacted by the bug so I'm
fixing it.
Added:
Modified:
lldb/source/Utility/Args.cpp
lldb/test/API/commands/register/register_command/TestRegisters.py
Removed:
################################################################################
diff --git a/lldb/source/Utility/Args.cpp b/lldb/source/Utility/Args.cpp
index 2d43798b3ca9c..f538fa4618ee6 100644
--- a/lldb/source/Utility/Args.cpp
+++ b/lldb/source/Utility/Args.cpp
@@ -441,7 +441,7 @@ lldb::Encoding Args::StringToEncoding(llvm::StringRef s,
uint32_t Args::StringToGenericRegister(llvm::StringRef s) {
if (s.empty())
return LLDB_INVALID_REGNUM;
- uint32_t result = llvm::StringSwitch<uint32_t>(s)
+ uint32_t result = llvm::StringSwitch<uint32_t>(s.lower())
.Case("pc", LLDB_REGNUM_GENERIC_PC)
.Case("sp", LLDB_REGNUM_GENERIC_SP)
.Case("fp", LLDB_REGNUM_GENERIC_FP)
diff --git a/lldb/test/API/commands/register/register_command/TestRegisters.py b/lldb/test/API/commands/register/register_command/TestRegisters.py
index 8707d59675cf1..5a2ac7b0ebbf3 100644
--- a/lldb/test/API/commands/register/register_command/TestRegisters.py
+++ b/lldb/test/API/commands/register/register_command/TestRegisters.py
@@ -716,3 +716,32 @@ def test_process_must_be_stopped(self):
self.expect("register read pc", substrs=[err_msg], error=True)
self.expect("register write pc 0", substrs=[err_msg], error=True)
self.expect("register info pc", substrs=[err_msg], error=True)
+
+ def test_case_insensitivity(self):
+ """
+ Register names, their aliases and any generic names like "sp" and "ra"
+ should be looked up case insensitively.
+ """
+
+ def setup():
+ self.build()
+ self.common_setup()
+
+ expected = "0x1122334455667788"
+
+ if self.getArchitecture() in ["amd64", "x86_64"]:
+ setup()
+ self.runCmd(f"register write rsp {expected}")
+ # This checks a primary name (rsp) and a generic name (sp)
+ # (and no registers have an alias).
+ for name in ["rsp", "RSP", "sp", "SP"]:
+ self.expect(f"register read {name}", substrs=[expected])
+ elif self.isAArch64():
+ setup()
+ self.runCmd(f"register write x30 {expected}")
+ # This checks a primary name (lr), an alias (x30), and
+ # a generic name (ra).
+ for name in ["x30", "X30", "lr", "LR", "ra", "RA"]:
+ self.expect(f"register read {name}", substrs=[expected])
+ else:
+ self.skipTest("Unsupported architecture.")
More information about the lldb-commits
mailing list