Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
5 changes: 5 additions & 0 deletions lldb/include/lldb/Symbol/SymbolFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,11 @@ class SymbolFile : public PluginInterface {
/// Reset the statistics for the symbol file.
virtual void ResetStatistics() {}

/// Get the number of loaded DWO files for this symbol file.
/// This is used for statistics gathering and will return 0 for most
/// symbol file implementations except DWARF symbol files.
virtual uint32_t GetLoadedDwoFileCount() const { return 0; }
Copy link
Contributor

Choose a reason for hiding this comment

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

There is a GetSeparateDebugInfo member function that returns info about separate debug info (which dwo is one type). Looking here it looks like we could use it to find all the dwos that were loaded.

I wonder if it would be better to use this existing function when generating the stats instead of adding a new overload here.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thanks for the reference! In GetSeparateDebugInfo here, the call to GetDwoSymbolFile ends up loading all DWO files (even if they weren't already loaded). I think it'd work if we set the load_all_debug_info to false in the call and do GetDwoSymbolFile(false), in which case we'd have to add an extra load_all_debug_info argument to GetSeparateDebugInfo as well so that other existing use cases for GetSeparateDebugInfo don't get effected. I can try that instead of adding the new overload.


/// Get the additional modules that this symbol file uses to parse debug info.
///
/// Some debug info is stored in stand alone object files that are represented
Expand Down
25 changes: 18 additions & 7 deletions lldb/packages/Python/lldbsuite/test/builders/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,13 +247,24 @@ def getLLDBObjRoot(self):
def _getDebugInfoArgs(self, debug_info):
if debug_info is None:
return []
if debug_info == "dwarf":
return ["MAKE_DSYM=NO"]
if debug_info == "dwo":
return ["MAKE_DSYM=NO", "MAKE_DWO=YES"]
if debug_info == "gmodules":
return ["MAKE_DSYM=NO", "MAKE_GMODULES=YES"]
return None

debug_options = debug_info if isinstance(debug_info, list) else [debug_info]
option_flags = {
"dwarf": {"MAKE_DSYM": "NO"},
"dwo": {"MAKE_DSYM": "NO", "MAKE_DWO": "YES"},
"gmodules": {"MAKE_DSYM": "NO", "MAKE_GMODULES": "YES"},
"debug_names": {"MAKE_DEBUG_NAMES": "YES"},
}

# Collect all flags, with later options overriding earlier ones
flags = {}

for option in debug_options:
if not option or option not in option_flags:
return None # Invalid options
flags.update(option_flags[option])

return [f"{key}={value}" for key, value in flags.items()]

def getBuildCommand(
self,
Expand Down
4 changes: 4 additions & 0 deletions lldb/packages/Python/lldbsuite/test/make/Makefile.rules
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,10 @@ ifeq "$(MAKE_DWO)" "YES"
CFLAGS += -gsplit-dwarf
endif

ifeq "$(MAKE_DEBUG_NAMES)" "YES"
CFLAGS += -gpubnames
endif

ifeq "$(USE_PRIVATE_MODULE_CACHE)" "YES"
THE_CLANG_MODULE_CACHE_DIR := $(BUILDDIR)/private-module-cache
else
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4358,6 +4358,7 @@ StatsDuration::Duration SymbolFileDWARF::GetDebugInfoIndexTime() {

void SymbolFileDWARF::ResetStatistics() {
m_parse_time.reset();
m_loaded_dwo_file_count = 0;
if (m_index)
return m_index->ResetStatistics();
}
Expand Down
9 changes: 9 additions & 0 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,11 @@ class SymbolFileDWARF : public SymbolFileCommon {

void ResetStatistics() override;

/// Get the number of loaded DWO files for this symbol file
uint32_t GetLoadedDwoFileCount() const override {
return m_loaded_dwo_file_count;
}

virtual lldb::offset_t
GetVendorDWARFOpcodeSize(const DataExtractor &data,
const lldb::offset_t data_offset,
Expand Down Expand Up @@ -497,6 +502,8 @@ class SymbolFileDWARF : public SymbolFileCommon {

void InitializeFirstCodeAddress();

void IncrementLoadedDwoFileCount() { m_loaded_dwo_file_count++; }

void
GetCompileOptions(std::unordered_map<lldb::CompUnitSP, Args> &args) override;

Expand Down Expand Up @@ -550,6 +557,8 @@ class SymbolFileDWARF : public SymbolFileCommon {
/// valid value that can be used in DIERef objects which will contain
/// an index that identifies the .DWO or .o file.
std::optional<uint64_t> m_file_index;
/// Count of loaded DWO files for this symbol file
uint32_t m_loaded_dwo_file_count = 0;
};
} // namespace dwarf
} // namespace lldb_private::plugin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ SymbolFileDWARFDwo::SymbolFileDWARFDwo(SymbolFileDWARF &base_symbol_file,
/*update_module_section_list*/ false)),
m_base_symbol_file(base_symbol_file) {
SetFileIndex(id);

m_base_symbol_file.IncrementLoadedDwoFileCount();
// Parsing of the dwarf unit index is not thread-safe, so we need to prime it
// to enable subsequent concurrent lookups.
m_context.GetAsLLVM().getCUIndex();
Expand Down
5 changes: 5 additions & 0 deletions lldb/source/Target/Statistics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ llvm::json::Value DebuggerStats::ReportStatistics(
uint32_t num_modules_with_incomplete_types = 0;
uint32_t num_stripped_modules = 0;
uint32_t symtab_symbol_count = 0;
uint32_t total_loaded_dwo_file_count = 0;
for (size_t image_idx = 0; image_idx < num_modules; ++image_idx) {
Module *module = target != nullptr
? target->GetImages().GetModuleAtIndex(image_idx).get()
Expand Down Expand Up @@ -353,6 +354,9 @@ llvm::json::Value DebuggerStats::ReportStatistics(
for (const auto &symbol_module : symbol_modules.Modules())
module_stat.symfile_modules.push_back((intptr_t)symbol_module.get());
}
// Add DWO file count from this symbol file (will be 0 for non-DWARF
// symbol files)
total_loaded_dwo_file_count += sym_file->GetLoadedDwoFileCount();
module_stat.debug_info_index_loaded_from_cache =
sym_file->GetDebugInfoIndexWasLoadedFromCache();
if (module_stat.debug_info_index_loaded_from_cache)
Expand Down Expand Up @@ -427,6 +431,7 @@ llvm::json::Value DebuggerStats::ReportStatistics(
{"totalDebugInfoEnabled", num_debug_info_enabled_modules},
{"totalSymbolTableStripped", num_stripped_modules},
{"totalSymbolTableSymbolCount", symtab_symbol_count},
{"totalLoadedDwoFileCount", total_loaded_dwo_file_count},
};

if (include_targets) {
Expand Down
31 changes: 31 additions & 0 deletions lldb/test/API/commands/statistics/basic/TestStats.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ def test_default_no_run(self):
"totalDebugInfoIndexLoadedFromCache",
"totalDebugInfoIndexSavedToCache",
"totalDebugInfoParseTime",
"totalLoadedDwoFileCount",
]
self.verify_keys(debug_stats, '"debug_stats"', debug_stat_keys, None)
if self.getPlatform() != "windows":
Expand Down Expand Up @@ -287,6 +288,7 @@ def test_default_with_run(self):
"totalDebugInfoIndexLoadedFromCache",
"totalDebugInfoIndexSavedToCache",
"totalDebugInfoParseTime",
"totalLoadedDwoFileCount",
]
self.verify_keys(debug_stats, '"debug_stats"', debug_stat_keys, None)
stats = debug_stats["targets"][0]
Expand Down Expand Up @@ -325,6 +327,7 @@ def test_memory(self):
"totalDebugInfoIndexLoadedFromCache",
"totalDebugInfoIndexSavedToCache",
"totalDebugInfoByteSize",
"totalLoadedDwoFileCount",
]
self.verify_keys(debug_stats, '"debug_stats"', debug_stat_keys, None)

Expand Down Expand Up @@ -377,6 +380,7 @@ def test_modules(self):
"totalDebugInfoIndexLoadedFromCache",
"totalDebugInfoIndexSavedToCache",
"totalDebugInfoByteSize",
"totalLoadedDwoFileCount",
]
self.verify_keys(debug_stats, '"debug_stats"', debug_stat_keys, None)
stats = debug_stats["targets"][0]
Expand Down Expand Up @@ -485,6 +489,7 @@ def test_breakpoints(self):
"totalDebugInfoIndexLoadedFromCache",
"totalDebugInfoIndexSavedToCache",
"totalDebugInfoByteSize",
"totalLoadedDwoFileCount",
]
self.verify_keys(debug_stats, '"debug_stats"', debug_stat_keys, None)
target_stats = debug_stats["targets"][0]
Expand Down Expand Up @@ -512,6 +517,32 @@ def test_breakpoints(self):
self.verify_keys(
breakpoint, 'target_stats["breakpoints"]', bp_keys_exist, None
)

def test_loaded_dwo_file_count(self):
"""
Test "statistics dump" and the loaded dwo file count.
Builds a binary w/ separate .dwo files and debug_names, and then
verifies the loaded dwo file count is the expected count after running
various commands
"""
da = {"CXX_SOURCES": "third.cpp baz.cpp", "EXE": self.getBuildArtifact("a.out")}
self.build(dictionary=da, debug_info=["dwo", "debug_names"])
self.addTearDownCleanup(dictionary=da)
exe = self.getBuildArtifact("a.out")
target = self.createTestTarget(file_path=exe)
debug_stats = self.get_stats()

self.assertIn("totalLoadedDwoFileCount", debug_stats)
self.assertEqual(debug_stats["totalLoadedDwoFileCount"], 0)

self.runCmd("b main")
debug_stats_after_main = self.get_stats()
self.assertEqual(debug_stats_after_main["totalLoadedDwoFileCount"], 1)

self.runCmd("type lookup Baz")
debug_stats_after_type_lookup = self.get_stats()
self.assertEqual(debug_stats_after_type_lookup["totalLoadedDwoFileCount"], 2)


@skipUnlessDarwin
@no_debug_info_test
Expand Down
12 changes: 12 additions & 0 deletions lldb/test/API/commands/statistics/basic/baz.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Helper that the lldb command `statistics dump` works in split-dwarf mode.

struct Baz {
int x;
bool y;
};

void baz() {
Baz b;
b.x = 1;
b.y = true;
}
7 changes: 7 additions & 0 deletions lldb/test/API/commands/statistics/basic/third.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Test that the lldb command `statistics dump` works.

void baz();
int main(void) {
baz();
return 0;
}