[lldb] Add an SB API to get progress events as SBStructuredData
authorJonas Devlieghere <jonas@devlieghere.com>
Fri, 10 Feb 2023 19:55:02 +0000 (11:55 -0800)
committerJonas Devlieghere <jonas@devlieghere.com>
Sat, 11 Feb 2023 01:18:00 +0000 (17:18 -0800)
This is a preparatory patch to add an SB API to get the progress data as
SBStructuredData. The advantage of using SBStructuredData is that the
dictionary can grow over time with more fields.

This approach is identical to the way this is implemented for diagnostic
events.

Differential revision: https://reviews.llvm.org/D143687

lldb/bindings/interface/SBDebugger.i
lldb/include/lldb/API/SBDebugger.h
lldb/include/lldb/Core/DebuggerEvents.h
lldb/source/API/SBDebugger.cpp
lldb/source/Core/DebuggerEvents.cpp
lldb/test/API/functionalities/progress_reporting/TestProgressReporting.py

index e82ce2a..7132902 100644 (file)
@@ -131,6 +131,8 @@ public:
                                         uint64_t &OUTPUT,
                                         bool &OUTPUT);
 
+    static lldb::SBStructuredData GetProgressDataFromEvent(const lldb::SBEvent &event);
+
     static lldb::SBStructuredData GetDiagnosticFromEvent(const lldb::SBEvent &event);
 
     SBBroadcaster GetBroadcaster();
index 950e8e2..0aee6b7 100644 (file)
@@ -84,6 +84,9 @@ public:
                                           bool &is_debugger_specific);
 
   static lldb::SBStructuredData
+  GetProgressDataFromEvent(const lldb::SBEvent &event);
+
+  static lldb::SBStructuredData
   GetDiagnosticFromEvent(const lldb::SBEvent &event);
 
   lldb::SBDebugger &operator=(const lldb::SBDebugger &rhs);
index 7d22574..0dade0f 100644 (file)
@@ -33,6 +33,10 @@ public:
   void Dump(Stream *s) const override;
 
   static const ProgressEventData *GetEventDataFromEvent(const Event *event_ptr);
+
+  static StructuredData::DictionarySP
+  GetAsStructuredData(const Event *event_ptr);
+
   uint64_t GetID() const { return m_id; }
   bool IsFinite() const { return m_total != UINT64_MAX; }
   uint64_t GetCompleted() const { return m_completed; }
index be86078..2fa93e4 100644 (file)
@@ -169,6 +169,21 @@ const char *SBDebugger::GetProgressFromEvent(const lldb::SBEvent &event,
 }
 
 lldb::SBStructuredData
+SBDebugger::GetProgressDataFromEvent(const lldb::SBEvent &event) {
+  LLDB_INSTRUMENT_VA(event);
+
+  StructuredData::DictionarySP dictionary_sp =
+      ProgressEventData::GetAsStructuredData(event.get());
+
+  if (!dictionary_sp)
+    return {};
+
+  SBStructuredData data;
+  data.m_impl_up->SetObjectSP(std::move(dictionary_sp));
+  return data;
+}
+
+lldb::SBStructuredData
 SBDebugger::GetDiagnosticFromEvent(const lldb::SBEvent &event) {
   LLDB_INSTRUMENT_VA(event);
 
index 6e47da7..fd459f8 100644 (file)
@@ -49,6 +49,25 @@ ProgressEventData::GetEventDataFromEvent(const Event *event_ptr) {
   return GetEventDataFromEventImpl<ProgressEventData>(event_ptr);
 }
 
+StructuredData::DictionarySP
+ProgressEventData::GetAsStructuredData(const Event *event_ptr) {
+  const ProgressEventData *progress_data =
+      ProgressEventData::GetEventDataFromEvent(event_ptr);
+
+  if (!progress_data)
+    return {};
+
+  auto dictionary_sp = std::make_shared<StructuredData::Dictionary>();
+  dictionary_sp->AddStringItem("message", progress_data->GetMessage());
+  dictionary_sp->AddIntegerItem("progress_id", progress_data->GetID());
+  dictionary_sp->AddIntegerItem("completed", progress_data->GetCompleted());
+  dictionary_sp->AddIntegerItem("total", progress_data->GetTotal());
+  dictionary_sp->AddBooleanItem("debugger_specific",
+                                progress_data->IsDebuggerSpecific());
+
+  return dictionary_sp;
+}
+
 llvm::StringRef DiagnosticEventData::GetPrefix() const {
   switch (m_type) {
   case Type::Info:
index 164ccbf..8d1821e 100644 (file)
@@ -28,3 +28,14 @@ class TestProgressReporting(TestBase):
         message = ret_args[0]
         self.assertGreater(len(message), 0)
 
+    def test_dwarf_symbol_loading_progress_report_structured_data(self):
+        """Test that we are able to fetch dwarf symbol loading progress events
+           using the structured data API"""
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(self, 'break here', lldb.SBFileSpec('main.c'))
+
+        event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
+        progress_data = lldb.SBDebugger.GetProgressDataFromEvent(event)
+        message = progress_data.GetValueForKey("message").GetStringValue(100)
+        self.assertGreater(len(message), 0)