1515#include " Plugins/LanguageRuntime/Swift/ReflectionContextInterface.h"
1616#include " Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.h"
1717#include " Plugins/TypeSystem/Clang/TypeSystemClang.h"
18+ #include " Plugins/TypeSystem/Swift/SwiftDemangle.h"
1819#include " lldb/DataFormatters/FormattersHelpers.h"
1920#include " lldb/DataFormatters/StringPrinter.h"
2021#include " lldb/Symbol/CompilerType.h"
2829#include " lldb/ValueObject/ValueObject.h"
2930#include " lldb/lldb-enumerations.h"
3031#include " swift/AST/Types.h"
32+ #include " swift/Demangling/Demangle.h"
3133#include " swift/Demangling/ManglingMacros.h"
3234#include " llvm/ADT/STLExtras.h"
3335#include " llvm/ADT/StringRef.h"
@@ -761,10 +763,10 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
761763 auto ts_or_err =
762764 target_sp->GetScratchTypeSystemForLanguage (eLanguageTypeSwift);
763765 if (auto err = ts_or_err.takeError ()) {
764- LLDB_LOG (
765- GetLog (LLDBLog::DataFormatters | LLDBLog::Types ),
766- " could not get Swift type system for Task synthetic provider: {0} " ,
767- fmt_consume ( std::move (err)) );
766+ LLDB_LOG_ERROR ( GetLog (LLDBLog::DataFormatters | LLDBLog::Types),
767+ std::move (err ),
768+ " could not get Swift type system for Task synthetic "
769+ " provider: {0} " );
768770 return ;
769771 }
770772 m_ts = llvm::dyn_cast_or_null<TypeSystemSwiftTypeRef>(ts_or_err->get ());
@@ -782,6 +784,7 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
782784 " isStatusRecordLocked" ,
783785 " isEscalated" ,
784786 " isEnqueued" ,
787+ " children" ,
785788 " isRunning" ,
786789 };
787790
@@ -837,7 +840,22 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
837840 RETURN_CHILD (m_is_escalated_sp, isEscalated, bool_type);
838841 case 10 :
839842 RETURN_CHILD (m_is_enqueued_sp, isEnqueued, bool_type);
840- case 11 :
843+ case 11 : {
844+ if (!m_child_tasks_sp) {
845+ const auto &tasks = m_task_info.childTasks ;
846+ std::string mangled_typename =
847+ mangledTypenameForTasksTuple (tasks.size ());
848+ CompilerType tasks_tuple_type =
849+ m_ts->GetTypeFromMangledTypename (ConstString (mangled_typename));
850+ DataExtractor data{tasks.data (), tasks.size () * sizeof (tasks[0 ]),
851+ endian::InlHostByteOrder (), sizeof (void *)};
852+ m_child_tasks_sp = ValueObject::CreateValueObjectFromData (
853+ " children" , data, m_backend.GetExecutionContextRef (),
854+ tasks_tuple_type);
855+ }
856+ return m_child_tasks_sp;
857+ }
858+ case 12 :
841859 RETURN_CHILD (m_is_running_sp, isRunning, bool_type);
842860 default :
843861 return {};
@@ -858,17 +876,17 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
858876 llvm::Expected<ReflectionContextInterface::AsyncTaskInfo> task_info =
859877 reflection_ctx->asyncTaskInfo (task_ptr);
860878 if (auto err = task_info.takeError ()) {
861- LLDB_LOG ( GetLog (LLDBLog::DataFormatters | LLDBLog::Types),
862- " could not get info for async task {0:x}: {1} " , task_ptr ,
863- fmt_consume ( std::move (err)) );
879+ LLDB_LOG_ERROR (
880+ GetLog (LLDBLog::DataFormatters | LLDBLog::Types), std::move (err) ,
881+ " could not get info for async task {0:x}: {1} " , task_ptr );
864882 } else {
865883 m_task_info = *task_info;
866884 for (auto child :
867885 {m_id_sp, m_kind_sp, m_enqueue_priority_sp, m_is_child_task_sp,
868886 m_is_future_sp, m_is_group_child_task_sp,
869887 m_is_async_let_task_sp, m_is_cancelled_sp,
870888 m_is_status_record_locked_sp, m_is_escalated_sp,
871- m_is_enqueued_sp, m_is_running_sp})
889+ m_is_enqueued_sp, m_child_tasks_sp, m_is_running_sp})
872890 child.reset ();
873891 }
874892 }
@@ -886,6 +904,35 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
886904 return std::distance (children.begin (), it);
887905 }
888906
907+ private:
908+ std::string mangledTypenameForTasksTuple (size_t count) {
909+ /*
910+ Global > TypeMangling > Type > Tuple
911+ TupleElement > Type > Structure
912+ Module, text="Swift"
913+ Identifier, text="UnsafeCurrentTask"
914+ */
915+ using namespace ::swift::Demangle;
916+ using Kind = Node::Kind;
917+ NodeFactory factory;
918+ auto [root, tuple] = swift_demangle::MakeNodeChain (
919+ {Kind::TypeMangling, Kind::Type, Kind::Tuple}, factory);
920+
921+ // Make a TupleElement subtree N times, where N is the number of subtasks.
922+ for (size_t i = 0 ; i < count; ++i) {
923+ auto *structure = swift_demangle::MakeNodeChain (
924+ tuple, {Kind::TupleElement, Kind::Type, Kind::Structure}, factory);
925+ if (structure) {
926+ structure->addChild (
927+ factory.createNode (Kind::Module, ::swift::STDLIB_NAME), factory);
928+ structure->addChild (
929+ factory.createNode (Kind::Identifier, " UnsafeCurrentTask" ), factory);
930+ }
931+ }
932+
933+ return mangleNode (root).result ();
934+ }
935+
889936private:
890937 TypeSystemSwiftTypeRef *m_ts = nullptr ;
891938 ReflectionContextInterface::AsyncTaskInfo m_task_info;
@@ -900,6 +947,7 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
900947 ValueObjectSP m_is_status_record_locked_sp;
901948 ValueObjectSP m_is_escalated_sp;
902949 ValueObjectSP m_is_enqueued_sp;
950+ ValueObjectSP m_child_tasks_sp;
903951 ValueObjectSP m_is_running_sp;
904952};
905953}
0 commit comments