From 761ac92cc187e21ac6150b6e91f1929907ffcf52 Mon Sep 17 00:00:00 2001 From: Felipe de Azevedo Piovezan Date: Thu, 11 Sep 2025 07:04:18 -0700 Subject: [PATCH 1/2] [lldb] Make TestSwiftAsyncFrameVarMultipleFrames consider stripped pointers By always stripping pointers in the test driver, the test will work regardless of architecture. --- .../TestSwiftAsyncFrameVarMultipleFrames.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lldb/test/API/lang/swift/async/frame/variables_multiple_frames/TestSwiftAsyncFrameVarMultipleFrames.py b/lldb/test/API/lang/swift/async/frame/variables_multiple_frames/TestSwiftAsyncFrameVarMultipleFrames.py index 6a8daf44db31f..37805ebe4eee0 100644 --- a/lldb/test/API/lang/swift/async/frame/variables_multiple_frames/TestSwiftAsyncFrameVarMultipleFrames.py +++ b/lldb/test/API/lang/swift/async/frame/variables_multiple_frames/TestSwiftAsyncFrameVarMultipleFrames.py @@ -17,11 +17,14 @@ def read_ptr_from_memory(self, process, addr): # Check that the CFA chain is correctly built def check_cfas(self, async_frames, process): - async_cfas = list(map(lambda frame: frame.GetCFA(), async_frames)) + async_cfas = list( + map(lambda frame: process.FixAddress(frame.GetCFA()), async_frames) + ) expected_cfas = [async_cfas[0]] # The CFA chain ends in nullptr. while expected_cfas[-1] != 0: - expected_cfas.append(self.read_ptr_from_memory(process, expected_cfas[-1])) + indirect_ctx = self.read_ptr_from_memory(process, expected_cfas[-1]) + expected_cfas.append(process.FixAddress(indirect_ctx)) self.assertEqual(async_cfas, expected_cfas[:-1]) @@ -43,13 +46,10 @@ def check_async_regs_one_frame(self, frame, process): cfa = frame.GetCFA() is_indirect = "await resume" in frame.GetFunctionName() - async_register = frame.FindRegister(async_reg_name).GetValueAsUnsigned() - + async_ctx = frame.FindRegister(async_reg_name).GetValueAsUnsigned() if is_indirect: - deref_async_reg = self.read_ptr_from_memory(process, async_register) - self.assertEqual(deref_async_reg, cfa) - else: - self.assertEqual(async_register, cfa) + async_ctx = self.read_ptr_from_memory(process, async_ctx) + self.assertEqual(process.FixAddress(async_ctx), process.FixAddress(cfa)) def check_async_regs(self, async_frames, process): for frame in async_frames: From 92fb650a6fee587fe70bf84fcf56d3f2e83242e7 Mon Sep 17 00:00:00 2001 From: Felipe de Azevedo Piovezan Date: Thu, 11 Sep 2025 11:24:56 -0700 Subject: [PATCH 2/2] [lldb] Strip pointer metadata when in Swift Task formatters This is mostly a cosmetic choice (and also to fix test expectations). Users don't need the metadata when running `task` commands that expect a pointer. --- lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp b/lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp index 197cd135739fb..ad41ab658a02a 100644 --- a/lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp +++ b/lldb/source/Plugins/Language/Swift/SwiftFormatters.cpp @@ -863,6 +863,8 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd { m_ts->GetTypeFromMangledTypename(ConstString("$sSVD")); addr_t value = m_task_ptr; + if (auto process_sp = m_backend.GetProcessSP()) + value = process_sp->FixDataAddress(value); DataExtractor data{reinterpret_cast(&value), sizeof(value), endian::InlHostByteOrder(), sizeof(void *)}; @@ -903,7 +905,7 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd { parent_addr = 0; } - addr_t value = parent_addr; + addr_t value = process_sp->FixDataAddress(parent_addr); DataExtractor data{reinterpret_cast(&value), sizeof(value), endian::InlHostByteOrder(), sizeof(void *)};