Skip to content

[lldb][Progress] Separate title and details #77547

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions lldb/include/lldb/Core/DebuggerEvents.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ class Stream;

class ProgressEventData : public EventData {
public:
ProgressEventData(uint64_t progress_id, std::string title, std::string update,
uint64_t completed, uint64_t total, bool debugger_specific)
: m_title(std::move(title)), m_details(std::move(update)),
ProgressEventData(uint64_t progress_id, std::string title,
std::string details, uint64_t completed, uint64_t total,
bool debugger_specific)
: m_title(std::move(title)), m_details(std::move(details)),
m_id(progress_id), m_completed(completed), m_total(total),
m_debugger_specific(debugger_specific) {}

Expand Down
16 changes: 10 additions & 6 deletions lldb/include/lldb/Core/Progress.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,13 @@ class Progress {
/// @param [in] title The title of this progress activity.
///
/// @param [in] total The total units of work to be done if specified, if
/// set to UINT64_MAX then an indeterminate progress indicator should be
/// set to std::nullopt then an indeterminate progress indicator should be
/// displayed.
///
/// @param [in] debugger An optional debugger pointer to specify that this
/// progress is to be reported only to specific debuggers.
Progress(std::string title, uint64_t total = UINT64_MAX,
Progress(std::string title, std::string details = {},
std::optional<uint64_t> total = std::nullopt,
lldb_private::Debugger *debugger = nullptr);

/// Destroy the progress object.
Expand All @@ -89,20 +90,23 @@ class Progress {
/// @param [in] amount The amount to increment m_completed by.
///
/// @param [in] an optional message associated with this update.
void Increment(uint64_t amount = 1, std::string update = {});
void Increment(uint64_t amount = 1,
std::optional<std::string> updated_detail = {});
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated_detail is still kept as an empty string by default, though I'm unsure if the empty string or std::nullopt is preferred here


private:
void ReportProgress(std::string update = {});
void ReportProgress();
static std::atomic<uint64_t> g_id;
/// The title of the progress activity.
std::string m_title;
std::string m_details;
std::mutex m_mutex;
/// A unique integer identifier for progress reporting.
const uint64_t m_id;
/// How much work ([0...m_total]) that has been completed.
uint64_t m_completed;
/// Total amount of work, UINT64_MAX for non deterministic progress.
const uint64_t m_total;
/// Total amount of work, use a std::nullopt in the constructor for non
/// deterministic progress.
uint64_t m_total;
/// The optional debugger ID to report progress to. If this has no value then
/// all debuggers will receive this event.
std::optional<lldb::user_id_t> m_debugger_id;
Expand Down
30 changes: 20 additions & 10 deletions lldb/source/Core/Progress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,22 @@
#include "lldb/Core/Debugger.h"
#include "lldb/Utility/StreamString.h"

#include <optional>

using namespace lldb;
using namespace lldb_private;

std::atomic<uint64_t> Progress::g_id(0);

Progress::Progress(std::string title, uint64_t total,
Progress::Progress(std::string title, std::string details,
std::optional<uint64_t> total,
lldb_private::Debugger *debugger)
: m_title(title), m_id(++g_id), m_completed(0), m_total(total) {
assert(total > 0);
: m_title(title), m_details(details), m_id(++g_id), m_completed(0),
m_total(1) {
assert(total == std::nullopt || total > 0);
if (total)
m_total = *total;

if (debugger)
m_debugger_id = debugger->GetID();
std::lock_guard<std::mutex> guard(m_mutex);
Expand All @@ -35,25 +42,28 @@ Progress::~Progress() {
ReportProgress();
}

void Progress::Increment(uint64_t amount, std::string update) {
void Progress::Increment(uint64_t amount,
std::optional<std::string> updated_detail) {
if (amount > 0) {
std::lock_guard<std::mutex> guard(m_mutex);
if (updated_detail)
m_details = std::move(updated_detail.value());
// Watch out for unsigned overflow and make sure we don't increment too
// much and exceed m_total.
if (amount > (m_total - m_completed))
if (m_total && (amount > (m_total - m_completed)))
m_completed = m_total;
else
m_completed += amount;
ReportProgress(update);
ReportProgress();
}
}

void Progress::ReportProgress(std::string update) {
void Progress::ReportProgress() {
if (!m_complete) {
// Make sure we only send one notification that indicates the progress is
// complete.
// complete
m_complete = m_completed == m_total;
Debugger::ReportProgress(m_id, m_title, std::move(update), m_completed,
m_total, m_debugger_id);
Debugger::ReportProgress(m_id, m_title, m_details, m_completed, m_total,
m_debugger_id);
}
}
5 changes: 2 additions & 3 deletions lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2897,9 +2897,8 @@ void ObjectFileELF::ParseSymtab(Symtab &lldb_symtab) {
if (!module_sp)
return;

Progress progress(
llvm::formatv("Parsing symbol table for {0}",
m_file.GetFilename().AsCString("<Unknown>")));
Progress progress("Parsing symbol table",
m_file.GetFilename().AsCString("<Unknown>"));
ElapsedTime elapsed(module_sp->GetSymtabParseTime());

// We always want to use the main object file so we (hopefully) only have one
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2225,7 +2225,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
const char *file_name = file.GetFilename().AsCString("<Unknown>");
LLDB_SCOPED_TIMERF("ObjectFileMachO::ParseSymtab () module = %s", file_name);
LLDB_LOG(log, "Parsing symbol table for {0}", file_name);
Progress progress(llvm::formatv("Parsing symbol table for {0}", file_name));
Progress progress("Parsing symbol table", file_name);

llvm::MachO::symtab_command symtab_load_command = {0, 0, 0, 0, 0, 0};
llvm::MachO::linkedit_data_command function_starts_load_command = {0, 0, 0, 0};
Expand Down
5 changes: 2 additions & 3 deletions lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,8 @@ void ManualDWARFIndex::Index() {
// Include 2 passes per unit to index for extracting DIEs from the unit and
// indexing the unit, and then 8 extra entries for finalizing each index set.
const uint64_t total_progress = units_to_index.size() * 2 + 8;
Progress progress(
llvm::formatv("Manually indexing DWARF for {0}", module_desc.GetData()),
total_progress);
Progress progress("Manually indexing DWARF", module_desc.GetData(),
total_progress);

std::vector<IndexSet> sets(units_to_index.size());

Expand Down
5 changes: 1 addition & 4 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -519,8 +519,6 @@ void SymbolFileDWARF::InitializeObject() {

if (apple_names.GetByteSize() > 0 || apple_namespaces.GetByteSize() > 0 ||
apple_types.GetByteSize() > 0 || apple_objc.GetByteSize() > 0) {
Progress progress(llvm::formatv("Loading Apple DWARF index for {0}",
module_desc.GetData()));
m_index = AppleDWARFIndex::Create(
*GetObjectFile()->GetModule(), apple_names, apple_namespaces,
apple_types, apple_objc, m_context.getOrLoadStrData());
Expand All @@ -532,8 +530,7 @@ void SymbolFileDWARF::InitializeObject() {
DWARFDataExtractor debug_names;
LoadSectionData(eSectionTypeDWARFDebugNames, debug_names);
if (debug_names.GetByteSize() > 0) {
Progress progress(
llvm::formatv("Loading DWARF5 index for {0}", module_desc.GetData()));
Progress progress("Loading DWARF5 index", module_desc.GetData());
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DWARF5 on the other hand usually has a single .debug_names table per compile unit, and there can be mixed DWARF5 .debug_names tables along with some compile units that need to be manually indexed, so it might be worth keeping this progress.

llvm::Expected<std::unique_ptr<DebugNamesDWARFIndex>> index_or =
DebugNamesDWARFIndex::Create(*GetObjectFile()->GetModule(),
debug_names,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ std::optional<FileSpec> SymbolLocatorDefault::LocateExecutableSymbolFile(
FileSystem::Instance().Exists(symbol_file_spec))
return symbol_file_spec;

Progress progress(llvm::formatv(
"Locating external symbol file for {0}",
module_spec.GetFileSpec().GetFilename().AsCString("<Unknown>")));
Progress progress(
"Locating external symbol file",
module_spec.GetFileSpec().GetFilename().AsCString("<Unknown>"));

FileSpecList debug_file_search_paths = default_search_paths;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,5 @@ def test_dwarf_symbol_loading_progress_report_structured_data(self):
progress_data = lldb.SBDebugger.GetProgressDataFromEvent(event)
message = progress_data.GetValueForKey("message").GetStringValue(100)
self.assertGreater(len(message), 0)
details = progress_data.GetValueForKey("details").GetStringValue(100)
self.assertGreater(len(details), 0)