From 0ac8dfd0587a1a95e8ed464bc59741837aae9c1f Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Fri, 10 Feb 2023 11:55:02 -0800 Subject: [PATCH] [lldb] Add an SB API to get progress events as SBStructuredData 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 | 2 ++ lldb/include/lldb/API/SBDebugger.h | 3 +++ lldb/include/lldb/Core/DebuggerEvents.h | 4 ++++ lldb/source/API/SBDebugger.cpp | 15 +++++++++++++++ lldb/source/Core/DebuggerEvents.cpp | 19 +++++++++++++++++++ .../progress_reporting/TestProgressReporting.py | 11 +++++++++++ 6 files changed, 54 insertions(+) diff --git a/lldb/bindings/interface/SBDebugger.i b/lldb/bindings/interface/SBDebugger.i index e82ce2a..7132902 100644 --- a/lldb/bindings/interface/SBDebugger.i +++ b/lldb/bindings/interface/SBDebugger.i @@ -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(); diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h index 950e8e2..0aee6b7 100644 --- a/lldb/include/lldb/API/SBDebugger.h +++ b/lldb/include/lldb/API/SBDebugger.h @@ -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); diff --git a/lldb/include/lldb/Core/DebuggerEvents.h b/lldb/include/lldb/Core/DebuggerEvents.h index 7d22574..0dade0f 100644 --- a/lldb/include/lldb/Core/DebuggerEvents.h +++ b/lldb/include/lldb/Core/DebuggerEvents.h @@ -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; } diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index be86078..2fa93e4 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -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); diff --git a/lldb/source/Core/DebuggerEvents.cpp b/lldb/source/Core/DebuggerEvents.cpp index 6e47da7..fd459f8 100644 --- a/lldb/source/Core/DebuggerEvents.cpp +++ b/lldb/source/Core/DebuggerEvents.cpp @@ -49,6 +49,25 @@ ProgressEventData::GetEventDataFromEvent(const Event *event_ptr) { return GetEventDataFromEventImpl(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(); + 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: diff --git a/lldb/test/API/functionalities/progress_reporting/TestProgressReporting.py b/lldb/test/API/functionalities/progress_reporting/TestProgressReporting.py index 164ccbf..8d1821e 100644 --- a/lldb/test/API/functionalities/progress_reporting/TestProgressReporting.py +++ b/lldb/test/API/functionalities/progress_reporting/TestProgressReporting.py @@ -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) -- 2.7.4