Author: David Spickett Date: 2023-07-06T08:35:04Z New Revision: fd8929904d8820629bae940bce5141ef65bcaa11
URL: https://github.com/llvm/llvm-project/commit/fd8929904d8820629bae940bce5141ef65bcaa11 DIFF: https://github.com/llvm/llvm-project/commit/fd8929904d8820629bae940bce5141ef65bcaa11.diff LOG: [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 Added: Modified: lldb/source/Commands/CommandCompletions.cpp lldb/test/API/functionalities/completion/TestCompletion.py Removed: ################################################################################ diff --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp index dad63b6aaa1744..21ffba5fa1f3d8 100644 --- a/lldb/source/Commands/CommandCompletions.cpp +++ b/lldb/source/Commands/CommandCompletions.cpp @@ -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); diff --git a/lldb/test/API/functionalities/completion/TestCompletion.py b/lldb/test/API/functionalities/completion/TestCompletion.py index bc39f18fb225b8..2d83abd7a6573e 100644 --- a/lldb/test/API/functionalities/completion/TestCompletion.py +++ b/lldb/test/API/functionalities/completion/TestCompletion.py @@ -736,13 +736,25 @@ def test_completion_type_formatter_delete(self): 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") _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits