[lldb] Fix crash when completing register names after program exit

Previously the following would crash:
(lldb) run
Process 2594053 launched: '/tmp/test.o' (aarch64)
Process 2594053 exited with status = 0 (0x00000000)
(lldb) register read <tab>

As the completer assumed that the execution context would always
have a register context. After a program has finished, it does not.

Split out the generic parts of the test from the x86 specific tests,
and added "register info" to both.

Reviewed By: JDevlieghere

Differential Revision: https://reviews.llvm.org/D154413
This commit is contained in:
David Spickett 2023-07-04 08:10:59 +00:00
parent ac03e3f51c
commit fd8929904d
2 changed files with 19 additions and 4 deletions

View File

@ -611,6 +611,9 @@ void CommandCompletions::Registers(CommandInterpreter &interpreter,
RegisterContext *reg_ctx =
interpreter.GetExecutionContext().GetRegisterContext();
if (!reg_ctx)
return;
const size_t reg_num = reg_ctx->GetRegisterCount();
for (size_t reg_idx = 0; reg_idx < reg_num; ++reg_idx) {
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_idx);

View File

@ -736,13 +736,25 @@ class CommandLineCompletionTestCase(TestBase):
self.runCmd("type synthetic add -x Hoo -l test")
self.complete_from_to("type synthetic delete ", ["Hoo"])
@skipIf(archs=no_match(["x86_64"]))
def test_register_read_and_write_on_x86(self):
"""Test the completion of the commands register read and write on x86"""
def test_register_no_complete(self):
# The tab completion for "register read/write" won't work without a running process.
self.complete_from_to("register read ", "register read ")
self.complete_from_to("register write ", "register write ")
self.complete_from_to("register info ", "register info ")
self.build()
self.runCmd("target create {}".format(self.getBuildArtifact("a.out")))
self.runCmd("run")
# Once a program has finished you have an execution context but no register
# context so completion cannot work.
self.complete_from_to("register read ", "register read ")
self.complete_from_to("register write ", "register write ")
self.complete_from_to("register info ", "register info ")
@skipIf(archs=no_match(["x86_64"]))
def test_register_read_and_write_on_x86(self):
"""Test the completion of the commands register read and write on x86"""
self.build()
self.main_source_spec = lldb.SBFileSpec("main.cpp")