Skip to content

Commit 01e2e0f

Browse files
committed
[lldb] Accept optional Task address in "task info" command
(cherry-picked from commit 6956cf6)
1 parent b0812f6 commit 01e2e0f

File tree

2 files changed

+50
-12
lines changed

2 files changed

+50
-12
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,21 +2260,41 @@ class CommandObjectLanguageSwiftTaskInfo final : public CommandObjectParsed {
22602260
public:
22612261
CommandObjectLanguageSwiftTaskInfo(CommandInterpreter &interpreter)
22622262
: CommandObjectParsed(interpreter, "info",
2263-
"Print the Task being run on the current thread.") {
2263+
"Print info about the Task being run on the "
2264+
"current thread or the Task at the given address."
2265+
"language swift task info [<address>]") {
2266+
AddSimpleArgumentList(eArgTypeAddress, eArgRepeatOptional);
22642267
}
22652268

22662269
private:
22672270
void DoExecute(Args &command, CommandReturnObject &result) override {
2268-
if (!m_exe_ctx.GetThreadPtr()) {
2269-
result.AppendError("must be run from a running process and valid thread");
2270-
return;
2271+
addr_t task_addr = LLDB_INVALID_ADDRESS;
2272+
StringRef task_name = "current_task";
2273+
2274+
if (command.GetArgumentCount() == 1) {
2275+
StringRef addr_arg = command.GetArgumentAtIndex(0);
2276+
if (addr_arg.getAsInteger(0, task_addr)) {
2277+
result.AppendErrorWithFormatv("invalid address format: {0}", addr_arg);
2278+
return;
2279+
}
2280+
task_name = "task";
22712281
}
22722282

2273-
auto task_addr_or_err =
2274-
GetTaskAddrFromThreadLocalStorage(m_exe_ctx.GetThreadRef());
2275-
if (auto error = task_addr_or_err.takeError()) {
2276-
result.AppendError(toString(std::move(error)));
2277-
return;
2283+
if (task_addr == LLDB_INVALID_ADDRESS) {
2284+
if (!m_exe_ctx.GetThreadPtr()) {
2285+
result.AppendError(
2286+
"must be run from a running process and valid thread");
2287+
return;
2288+
}
2289+
2290+
auto task_addr_or_err =
2291+
GetTaskAddrFromThreadLocalStorage(m_exe_ctx.GetThreadRef());
2292+
if (auto error = task_addr_or_err.takeError()) {
2293+
result.AppendError(toString(std::move(error)));
2294+
return;
2295+
}
2296+
2297+
task_addr = task_addr_or_err.get();
22782298
}
22792299

22802300
auto ts_or_err = m_exe_ctx.GetTargetRef().GetScratchTypeSystemForLanguage(
@@ -2291,12 +2311,11 @@ class CommandObjectLanguageSwiftTaskInfo final : public CommandObjectParsed {
22912311
return;
22922312
}
22932313

2294-
addr_t task_addr = task_addr_or_err.get();
22952314
// TypeMangling for "Swift.UnsafeCurrentTask"
22962315
CompilerType task_type =
22972316
ts->GetTypeFromMangledTypename(ConstString("$sSctD"));
22982317
auto task_sp = ValueObject::CreateValueObjectFromAddress(
2299-
"current_task", task_addr, m_exe_ctx, task_type, false);
2318+
task_name, task_addr, m_exe_ctx, task_type, false);
23002319
if (auto synthetic_sp = task_sp->GetSyntheticValue())
23012320
task_sp = synthetic_sp;
23022321

lldb/test/API/lang/swift/async/tasks/info/TestSwiftTaskInfo.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ def _tail(output):
1515
class TestCase(TestBase):
1616

1717
@skipUnlessDarwin
18-
def test(self):
18+
def test_compare_printed_task_variable_to_task_info(self):
19+
"""Compare the output of a printed Task to the output of `task info`."""
1920
self.build()
2021
lldbutil.run_to_source_breakpoint(
2122
self, "break here", lldb.SBFileSpec("main.swift")
@@ -25,3 +26,21 @@ def test(self):
2526
self.runCmd("language swift task info")
2627
task_info_output = self.res.GetOutput()
2728
self.assertEqual(_tail(task_info_output), _tail(frame_variable_output))
29+
30+
@skipUnlessDarwin
31+
def test_compare_printed_task_variable_to_task_info_with_address(self):
32+
"""Compare the output of a printed Task to the output of `task info <address>`."""
33+
self.build()
34+
_, _, thread, _ = lldbutil.run_to_source_breakpoint(
35+
self, "break here", lldb.SBFileSpec("main.swift")
36+
)
37+
38+
frame = thread.frames[0]
39+
task = frame.FindVariable("task")
40+
task_addr = task.GetChildMemberWithName("address").unsigned
41+
42+
self.runCmd("frame variable task")
43+
frame_variable_output = self.res.GetOutput()
44+
self.runCmd(f"language swift task info {task_addr}")
45+
task_info_output = self.res.GetOutput()
46+
self.assertEqual(_tail(task_info_output), _tail(frame_variable_output))

0 commit comments

Comments
 (0)