@@ -1021,6 +1021,92 @@ class UnsafeContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
10211021 ValueObjectSP m_task_sp;
10221022};
10231023
1024+ class CheckedContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
1025+ public:
1026+ CheckedContinuationSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp)
1027+ : SyntheticChildrenFrontEnd(*valobj_sp.get()) {
1028+ bool is_64bit = false ;
1029+ if (auto target_sp = m_backend.GetTargetSP ())
1030+ is_64bit = target_sp->GetArchitecture ().GetTriple ().isArch64Bit ();
1031+
1032+ std::optional<uint32_t > concurrency_version;
1033+ if (auto process_sp = m_backend.GetProcessSP ())
1034+ concurrency_version =
1035+ SwiftLanguageRuntime::FindConcurrencyDebugVersion (*process_sp);
1036+
1037+ bool is_supported_target = is_64bit && concurrency_version.value_or (0 ) == 1 ;
1038+ if (!is_supported_target)
1039+ return ;
1040+
1041+ if (auto target_sp = m_backend.GetTargetSP ()) {
1042+ if (auto ts_or_err =
1043+ target_sp->GetScratchTypeSystemForLanguage (eLanguageTypeSwift)) {
1044+ if (auto *ts = llvm::dyn_cast_or_null<TypeSystemSwiftTypeRef>(
1045+ ts_or_err->get ()))
1046+ // TypeMangling for "Swift.UnsafeCurrentTask"
1047+ m_task_type = ts->GetTypeFromMangledTypename (ConstString (" $sSctD" ));
1048+ } else {
1049+ LLDB_LOG_ERROR (
1050+ GetLog (LLDBLog::DataFormatters | LLDBLog::Types),
1051+ ts_or_err.takeError (),
1052+ " could not get Swift type system for CheckedContinuation "
1053+ " synthetic provider: {0}" );
1054+ }
1055+ }
1056+ }
1057+
1058+ llvm::Expected<uint32_t > CalculateNumChildren () override {
1059+ if (!m_task_sp)
1060+ return m_backend.GetNumChildren ();
1061+
1062+ return 1 ;
1063+ }
1064+
1065+ bool MightHaveChildren () override { return true ; }
1066+
1067+ lldb::ValueObjectSP GetChildAtIndex (uint32_t idx) override {
1068+ if (!m_task_sp)
1069+ return m_backend.GetChildAtIndex (idx);
1070+
1071+ if (idx == 0 )
1072+ return m_task_sp;
1073+
1074+ return {};
1075+ }
1076+
1077+ size_t GetIndexOfChildWithName (ConstString name) override {
1078+ if (!m_task_sp)
1079+ return m_backend.GetIndexOfChildWithName (name);
1080+
1081+ if (name == " task" )
1082+ return 0 ;
1083+
1084+ return UINT32_MAX;
1085+ }
1086+
1087+ lldb::ChildCacheState Update () override {
1088+ if (!m_task_type)
1089+ return ChildCacheState::eReuse;
1090+
1091+ size_t canary_task_offset = 0x10 ;
1092+ Status status;
1093+ if (auto canary_sp = m_backend.GetChildMemberWithName (" canary" ))
1094+ if (addr_t canary_addr = canary_sp->GetValueAsUnsigned (0 ))
1095+ if (addr_t task_addr = m_backend.GetProcessSP ()->ReadPointerFromMemory (
1096+ canary_addr + canary_task_offset, status))
1097+ m_task_sp = ValueObject::CreateValueObjectFromAddress (
1098+ " task" , task_addr, m_backend.GetExecutionContextRef (),
1099+ m_task_type, false );
1100+ if (auto synthetic_sp = m_task_sp->GetSyntheticValue ())
1101+ m_task_sp = synthetic_sp;
1102+ return ChildCacheState::eRefetch;
1103+ }
1104+
1105+ private:
1106+ CompilerType m_task_type;
1107+ ValueObjectSP m_task_sp;
1108+ };
1109+
10241110class TaskGroupSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
10251111public:
10261112 TaskGroupSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp)
@@ -1276,6 +1362,14 @@ lldb_private::formatters::swift::UnsafeContinuationSyntheticFrontEndCreator(
12761362 return new UnsafeContinuationSyntheticFrontEnd (valobj_sp);
12771363}
12781364
1365+ SyntheticChildrenFrontEnd *
1366+ lldb_private::formatters::swift::CheckedContinuationSyntheticFrontEndCreator (
1367+ CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
1368+ if (!valobj_sp)
1369+ return nullptr ;
1370+ return new CheckedContinuationSyntheticFrontEnd (valobj_sp);
1371+ }
1372+
12791373SyntheticChildrenFrontEnd *
12801374lldb_private::formatters::swift::TaskGroupSyntheticFrontEndCreator (
12811375 CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
0 commit comments