@@ -955,6 +955,72 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
955955 ValueObjectSP m_is_running_sp;
956956};
957957
958+ class UnsafeContinuationSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
959+ public:
960+ UnsafeContinuationSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp)
961+ : SyntheticChildrenFrontEnd(*valobj_sp.get()) {
962+ if (auto target_sp = m_backend.GetTargetSP ()) {
963+ if (auto ts_or_err =
964+ target_sp->GetScratchTypeSystemForLanguage (eLanguageTypeSwift)) {
965+ if (auto *ts = llvm::dyn_cast_or_null<TypeSystemSwiftTypeRef>(
966+ ts_or_err->get ()))
967+ // TypeMangling for "Swift.UnsafeCurrentTask"
968+ m_task_type = ts->GetTypeFromMangledTypename (ConstString (" $sSctD" ));
969+ } else {
970+ LLDB_LOG_ERROR (GetLog (LLDBLog::DataFormatters | LLDBLog::Types),
971+ ts_or_err.takeError (),
972+ " could not get Swift type system for UnsafeContinuation "
973+ " synthetic provider: {0}" );
974+ }
975+ }
976+ }
977+
978+ llvm::Expected<uint32_t > CalculateNumChildren () override {
979+ if (!m_task_sp)
980+ return m_backend.GetNumChildren ();
981+
982+ return 1 ;
983+ }
984+
985+ bool MightHaveChildren () override { return true ; }
986+
987+ lldb::ValueObjectSP GetChildAtIndex (uint32_t idx) override {
988+ if (!m_task_sp)
989+ return m_backend.GetChildAtIndex (idx);
990+
991+ if (idx == 0 )
992+ return m_task_sp;
993+
994+ return {};
995+ }
996+
997+ size_t GetIndexOfChildWithName (ConstString name) override {
998+ if (!m_task_sp)
999+ return m_backend.GetIndexOfChildWithName (name);
1000+
1001+ if (name == " task" )
1002+ return 0 ;
1003+
1004+ return UINT32_MAX;
1005+ }
1006+
1007+ lldb::ChildCacheState Update () override {
1008+ if (auto context_sp = m_backend.GetChildMemberWithName (" context" ))
1009+ if (addr_t task_addr = context_sp->GetValueAsUnsigned (0 )) {
1010+ m_task_sp = ValueObject::CreateValueObjectFromAddress (
1011+ " task" , task_addr, m_backend.GetExecutionContextRef (), m_task_type,
1012+ false );
1013+ if (auto synthetic_sp = m_task_sp->GetSyntheticValue ())
1014+ m_task_sp = synthetic_sp;
1015+ }
1016+ return ChildCacheState::eRefetch;
1017+ }
1018+
1019+ private:
1020+ CompilerType m_task_type;
1021+ ValueObjectSP m_task_sp;
1022+ };
1023+
9581024class TaskGroupSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
9591025public:
9601026 TaskGroupSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp)
@@ -1202,6 +1268,14 @@ lldb_private::formatters::swift::TaskSyntheticFrontEndCreator(
12021268 return new TaskSyntheticFrontEnd (valobj_sp);
12031269}
12041270
1271+ SyntheticChildrenFrontEnd *
1272+ lldb_private::formatters::swift::UnsafeContinuationSyntheticFrontEndCreator (
1273+ CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
1274+ if (!valobj_sp)
1275+ return nullptr ;
1276+ return new UnsafeContinuationSyntheticFrontEnd (valobj_sp);
1277+ }
1278+
12051279SyntheticChildrenFrontEnd *
12061280lldb_private::formatters::swift::TaskGroupSyntheticFrontEndCreator (
12071281 CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
0 commit comments