@@ -734,6 +734,13 @@ namespace lldb_private {
734
734
namespace formatters {
735
735
namespace swift {
736
736
737
+ namespace {
738
+ // / The size of Swift Tasks. Fragments are tail allocated.
739
+ static constexpr size_t AsyncTaskSize = sizeof (::swift::AsyncTask);
740
+ // / The offset of ChildFragment, which is the first fragment of an AsyncTask.
741
+ static constexpr offset_t ChildFragmentOffset = AsyncTaskSize;
742
+ } // namespace
743
+
737
744
class EnumSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
738
745
public:
739
746
EnumSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
@@ -806,6 +813,7 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
806
813
" address" ,
807
814
" id" ,
808
815
" enqueuePriority" ,
816
+ " parent" ,
809
817
" children" ,
810
818
811
819
// Children below this point are hidden.
@@ -873,6 +881,33 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
873
881
RETURN_CHILD (m_enqueue_priority_sp, enqueuePriority, priority_type);
874
882
}
875
883
case 3 : {
884
+ if (!m_parent_task_sp) {
885
+ // TypeMangling for "Swift.UnsafeRawPointer"
886
+ CompilerType raw_pointer_type =
887
+ m_ts->GetTypeFromMangledTypename (ConstString (" $sSVD" ));
888
+
889
+ addr_t parent_addr = 0 ;
890
+ if (m_task_info.isChildTask ) {
891
+ if (auto process_sp = m_backend.GetProcessSP ()) {
892
+ Status status;
893
+ // Read ChildFragment::Parent, the first field of the ChildFragment.
894
+ parent_addr = process_sp->ReadPointerFromMemory (
895
+ m_task_ptr + ChildFragmentOffset, status);
896
+ if (status.Fail () || parent_addr == LLDB_INVALID_ADDRESS)
897
+ parent_addr = 0 ;
898
+ }
899
+ }
900
+ addr_t value = parent_addr;
901
+ DataExtractor data{reinterpret_cast <const void *>(&value),
902
+ sizeof (value), endian::InlHostByteOrder (),
903
+ sizeof (void *)};
904
+ m_parent_task_sp = ValueObject::CreateValueObjectFromData (
905
+ " parent" , data, m_backend.GetExecutionContextRef (),
906
+ raw_pointer_type);
907
+ }
908
+ return m_parent_task_sp;
909
+ }
910
+ case 4 : {
876
911
if (!m_child_tasks_sp) {
877
912
using task_type = decltype (m_task_info.childTasks )::value_type;
878
913
std::vector<task_type> tasks = m_task_info.childTasks ;
@@ -901,26 +936,26 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
901
936
}
902
937
return m_child_tasks_sp;
903
938
}
904
- case 4 :
905
- RETURN_CHILD (m_is_child_task_sp, isChildTask, bool_type);
906
939
case 5 :
907
- RETURN_CHILD (m_is_future_sp, isFuture , bool_type);
940
+ RETURN_CHILD (m_is_child_task_sp, isChildTask , bool_type);
908
941
case 6 :
909
- RETURN_CHILD (m_is_group_child_task_sp, isGroupChildTask , bool_type);
942
+ RETURN_CHILD (m_is_future_sp, isFuture , bool_type);
910
943
case 7 :
911
- RETURN_CHILD (m_is_async_let_task_sp, isAsyncLetTask , bool_type);
944
+ RETURN_CHILD (m_is_group_child_task_sp, isGroupChildTask , bool_type);
912
945
case 8 :
913
- RETURN_CHILD (m_is_cancelled_sp, isCancelled , bool_type);
946
+ RETURN_CHILD (m_is_async_let_task_sp, isAsyncLetTask , bool_type);
914
947
case 9 :
948
+ RETURN_CHILD (m_is_cancelled_sp, isCancelled, bool_type);
949
+ case 10 :
915
950
RETURN_CHILD (m_is_status_record_locked_sp, isStatusRecordLocked,
916
951
bool_type);
917
- case 10 :
918
- RETURN_CHILD (m_is_escalated_sp, isEscalated, bool_type);
919
952
case 11 :
920
- RETURN_CHILD (m_is_enqueued_sp, isEnqueued , bool_type);
953
+ RETURN_CHILD (m_is_escalated_sp, isEscalated , bool_type);
921
954
case 12 :
955
+ RETURN_CHILD (m_is_enqueued_sp, isEnqueued, bool_type);
956
+ case 13 :
922
957
RETURN_CHILD (m_is_complete_sp, isComplete, bool_type);
923
- case 13 : {
958
+ case 14 : {
924
959
if (m_task_info.hasIsRunning )
925
960
RETURN_CHILD (m_is_running_sp, isRunning, bool_type);
926
961
return {};
@@ -953,8 +988,8 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
953
988
m_is_child_task_sp, m_is_future_sp, m_is_group_child_task_sp,
954
989
m_is_async_let_task_sp, m_is_cancelled_sp,
955
990
m_is_status_record_locked_sp, m_is_escalated_sp,
956
- m_is_enqueued_sp, m_is_complete_sp, m_child_tasks_sp ,
957
- m_is_running_sp})
991
+ m_is_enqueued_sp, m_is_complete_sp, m_parent_task_sp ,
992
+ m_child_tasks_sp, m_is_running_sp})
958
993
child.reset ();
959
994
}
960
995
}
@@ -990,6 +1025,7 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
990
1025
ValueObjectSP m_is_escalated_sp;
991
1026
ValueObjectSP m_is_enqueued_sp;
992
1027
ValueObjectSP m_is_complete_sp;
1028
+ ValueObjectSP m_parent_task_sp;
993
1029
ValueObjectSP m_child_tasks_sp;
994
1030
ValueObjectSP m_is_running_sp;
995
1031
};
@@ -1280,8 +1316,6 @@ class TaskGroupSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
1280
1316
bool operator ==(const Task &other) const { return addr == other.addr ; }
1281
1317
bool operator !=(const Task &other) const { return !(*this == other); }
1282
1318
1283
- static constexpr offset_t AsyncTaskSize = sizeof (::swift::AsyncTask);
1284
- static constexpr offset_t ChildFragmentOffset = AsyncTaskSize;
1285
1319
static constexpr offset_t NextChildOffset = ChildFragmentOffset + 0x8 ;
1286
1320
1287
1321
Task getNextChild (Status &status) {
0 commit comments