17
17
#include " Plugins/TypeSystem/Clang/TypeSystemClang.h"
18
18
#include " lldb/DataFormatters/FormattersHelpers.h"
19
19
#include " lldb/DataFormatters/StringPrinter.h"
20
+ #include " lldb/Symbol/CompilerType.h"
20
21
#include " lldb/Target/Process.h"
21
22
#include " lldb/Utility/ConstString.h"
22
23
#include " lldb/Utility/DataBufferHeap.h"
@@ -755,12 +756,33 @@ class EnumSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
755
756
class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
756
757
public:
757
758
TaskSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp)
758
- : SyntheticChildrenFrontEnd(*valobj_sp.get()) {}
759
+ : SyntheticChildrenFrontEnd(*valobj_sp.get()) {
760
+ auto target_sp = m_backend.GetTargetSP ();
761
+ auto ts_or_err =
762
+ target_sp->GetScratchTypeSystemForLanguage (eLanguageTypeSwift);
763
+ 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)));
768
+ return ;
769
+ }
770
+ m_ts = llvm::dyn_cast_or_null<TypeSystemSwiftTypeRef>(ts_or_err->get ());
771
+ }
759
772
760
773
constexpr static StringLiteral TaskChildren[] = {
761
- " isChildTask" , " isFuture" , " isGroupChildTask" ,
762
- " isAsyncLetTask" , " isCancelled" , " isStatusRecordLocked" ,
763
- " isEscalated" , " isEnqueued" , " isRunning" ,
774
+ " id" ,
775
+ " kind" ,
776
+ " enqueuPriority" ,
777
+ " isChildTask" ,
778
+ " isFuture" ,
779
+ " isGroupChildTask" ,
780
+ " isAsyncLetTask" ,
781
+ " isCancelled" ,
782
+ " isStatusRecordLocked" ,
783
+ " isEscalated" ,
784
+ " isEnqueued" ,
785
+ " isRunning" ,
764
786
};
765
787
766
788
llvm::Expected<uint32_t > CalculateNumChildren () override {
@@ -770,31 +792,53 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
770
792
771
793
lldb::ValueObjectSP GetChildAtIndex (uint32_t idx) override {
772
794
auto target_sp = m_backend.GetTargetSP ();
773
- #define RETURN_CHILD (FIELD, NAME ) \
774
- if (!FIELD) \
775
- FIELD = ValueObject::CreateValueObjectFromBool (target_sp, \
776
- m_task_info.NAME , #NAME); \
777
- return FIELD
795
+
796
+ // TypeMangling for "Swift.Bool"
797
+ CompilerType bool_type =
798
+ m_ts->GetTypeFromMangledTypename (ConstString (" $sSbD" ));
799
+ // TypeMangling for "Swift.UInt32"
800
+ CompilerType uint32_type =
801
+ m_ts->GetTypeFromMangledTypename (ConstString (" $ss6UInt32VD" ));
802
+ // TypeMangling for "Swift.UInt64"
803
+ CompilerType uint64_type =
804
+ m_ts->GetTypeFromMangledTypename (ConstString (" $ss6UInt64VD" ));
805
+
806
+ #define RETURN_CHILD (FIELD, NAME, TYPE ) \
807
+ if (!FIELD) { \
808
+ auto value = m_task_info.NAME ; \
809
+ DataExtractor data{reinterpret_cast <const void *>(&value), sizeof (value), \
810
+ endian::InlHostByteOrder (), sizeof (void *)}; \
811
+ FIELD = ValueObject::CreateValueObjectFromData ( \
812
+ #NAME, data, m_backend.GetExecutionContextRef (), TYPE); \
813
+ } \
814
+ return FIELD;
778
815
779
816
switch (idx) {
780
817
case 0 :
781
- RETURN_CHILD (m_is_child_task_sp, isChildTask );
818
+ RETURN_CHILD (m_id_sp, id, uint64_type );
782
819
case 1 :
783
- RETURN_CHILD (m_is_future_sp, isFuture );
820
+ RETURN_CHILD (m_kind_sp, kind, uint32_type );
784
821
case 2 :
785
- RETURN_CHILD (m_is_group_child_task_sp, isGroupChildTask );
822
+ RETURN_CHILD (m_enqueue_priority_sp, enqueuePriority, uint32_type );
786
823
case 3 :
787
- RETURN_CHILD (m_is_async_let_task_sp, isAsyncLetTask );
824
+ RETURN_CHILD (m_is_child_task_sp, isChildTask, bool_type );
788
825
case 4 :
789
- RETURN_CHILD (m_is_cancelled_sp, isCancelled );
826
+ RETURN_CHILD (m_is_future_sp, isFuture, bool_type );
790
827
case 5 :
791
- RETURN_CHILD (m_is_status_record_locked_sp, isStatusRecordLocked );
828
+ RETURN_CHILD (m_is_group_child_task_sp, isGroupChildTask, bool_type );
792
829
case 6 :
793
- RETURN_CHILD (m_is_escalated_sp, isEscalated );
830
+ RETURN_CHILD (m_is_async_let_task_sp, isAsyncLetTask, bool_type );
794
831
case 7 :
795
- RETURN_CHILD (m_is_enqueued_sp, isEnqueued );
832
+ RETURN_CHILD (m_is_cancelled_sp, isCancelled, bool_type );
796
833
case 8 :
797
- RETURN_CHILD (m_is_running_sp, isRunning);
834
+ RETURN_CHILD (m_is_status_record_locked_sp, isStatusRecordLocked,
835
+ bool_type);
836
+ case 9 :
837
+ RETURN_CHILD (m_is_escalated_sp, isEscalated, bool_type);
838
+ case 10 :
839
+ RETURN_CHILD (m_is_enqueued_sp, isEnqueued, bool_type);
840
+ case 11 :
841
+ RETURN_CHILD (m_is_running_sp, isRunning, bool_type);
798
842
default :
799
843
return {};
800
844
}
@@ -820,7 +864,8 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
820
864
} else {
821
865
m_task_info = *task_info;
822
866
for (auto child :
823
- {m_is_child_task_sp, m_is_future_sp, m_is_group_child_task_sp,
867
+ {m_id_sp, m_kind_sp, m_enqueue_priority_sp, m_is_child_task_sp,
868
+ m_is_future_sp, m_is_group_child_task_sp,
824
869
m_is_async_let_task_sp, m_is_cancelled_sp,
825
870
m_is_status_record_locked_sp, m_is_escalated_sp,
826
871
m_is_enqueued_sp, m_is_running_sp})
@@ -835,14 +880,18 @@ class TaskSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
835
880
836
881
size_t GetIndexOfChildWithName (ConstString name) override {
837
882
ArrayRef children = TaskChildren;
838
- auto it = llvm::find (children, name);
883
+ const auto * it = llvm::find (children, name);
839
884
if (it == children.end ())
840
885
return UINT32_MAX;
841
886
return std::distance (children.begin (), it);
842
887
}
843
888
844
889
private:
890
+ TypeSystemSwiftTypeRef *m_ts = nullptr ;
845
891
ReflectionContextInterface::AsyncTaskInfo m_task_info;
892
+ ValueObjectSP m_id_sp;
893
+ ValueObjectSP m_kind_sp;
894
+ ValueObjectSP m_enqueue_priority_sp;
846
895
ValueObjectSP m_is_child_task_sp;
847
896
ValueObjectSP m_is_future_sp;
848
897
ValueObjectSP m_is_group_child_task_sp;
0 commit comments