From f5ba6674f18c5ed32d1f0579f88a464d35962964 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Thu, 12 Jun 2025 13:57:50 -0700 Subject: [PATCH 1/7] Expose SBModule iterator for all separate debug info modules, and implement in each symbol file --- lldb/include/lldb/API/SBModule.h | 8 ++++++ lldb/include/lldb/Core/Module.h | 2 ++ lldb/include/lldb/Symbol/SymbolFile.h | 14 ++++++++++ lldb/source/API/SBModule.cpp | 5 ++++ lldb/source/Core/Module.cpp | 8 ++++++ .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 26 +++++++++++++++++++ .../SymbolFile/DWARF/SymbolFileDWARF.h | 2 ++ .../DWARF/SymbolFileDWARFDebugMap.cpp | 14 ++++++++++ .../DWARF/SymbolFileDWARFDebugMap.h | 2 ++ lldb/source/Symbol/SymbolFile.cpp | 1 - 10 files changed, 81 insertions(+), 1 deletion(-) diff --git a/lldb/include/lldb/API/SBModule.h b/lldb/include/lldb/API/SBModule.h index 4009ca1461e51..9577bb57005ec 100644 --- a/lldb/include/lldb/API/SBModule.h +++ b/lldb/include/lldb/API/SBModule.h @@ -287,6 +287,14 @@ class LLDB_API SBModule { /// A const reference to the file specification object. lldb::SBFileSpec GetSymbolFileSpec() const; + /// Get a list of filespecs associated with all the separate symbol files + /// associated with this module. + /// + /// \return + /// A list of filespecs associated with all the separate symbol files + /// associated with this module. + lldb::SBFileSpecList GetSeparateDebugInfoFiles(); + lldb::SBAddress GetObjectFileHeaderAddress() const; lldb::SBAddress GetObjectFileEntryPointAddress() const; diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index 8513e147ee523..401c92fa4f540 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -482,6 +482,8 @@ class Module : public std::enable_shared_from_this, } const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; } + + const llvm::StringMap GetSeparateDebugInfoFiles(); void PreloadSymbols(); diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index bbc615d9fdc38..76108342499ad 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -28,6 +28,7 @@ #include "lldb/lldb-private.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/StringMap.h" #include "llvm/Support/Errc.h" #include @@ -496,6 +497,19 @@ class SymbolFile : public PluginInterface { /// symbol file doesn't support DWO files, both counts will be 0. virtual std::pair GetDwoFileCounts() { return {0, 0}; } + /// Return a map of separate debug info files that are loaded. + /// + /// Unlike GetSeparateDebugInfo(), this function will only return the list of + /// files, if there are errors they are simply ignored. This function will + /// always return a valid list, even if it is empty. + /// + /// \return + /// A unique map of all the filespecs, dwos in a dwps would be joined to the dwp path + /// for example. + virtual llvm::StringMap GetSeparateDebugInfoFiles() { + return {}; + } + virtual lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, std::optional byte_size, SymbolContextScope *context, diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index 5a57f45f0d475..ece6e5dfd2ad9 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -633,6 +633,11 @@ lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { return sb_file_spec; } +lldb::SBFileSpecList SBModule::GetSeparateDebugInfoFiles() { + lldb::SBFileSpecList sb_filespeclist; + +} + lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { LLDB_INSTRUMENT_VA(this); diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index f27a95de484df..766b184b70dd0 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1647,3 +1647,11 @@ DataFileCache *Module::GetIndexCache() { .GetPath()); return g_data_file_cache; } + +const llvm::StringMap Module::GetSeparateDebugInfoFiles() { + SymbolFile *symfile = GetSymbolFile(false); + if (!symfile) + return {}; + + return symfile->GetSeparateDebugInfoFiles(); +} diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index b15e0c15fedb8..cc5a4f0cd0463 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4215,6 +4215,32 @@ void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { clang->Dump(s.AsRawOstream(), filter); } +llvm::StringMap SymbolFileDWARF::GetSeparateDebugInfoFiles() { + DWARFDebugInfo &info = DebugInfo(); + const size_t num_cus = info.GetNumUnits(); + llvm::StringMap symbolfile_map; + for (uint32_t cu_idx = 0; cu_idx < num_cus; ++cu_idx) { + DWARFUnit *unit = info.GetUnitAtIndex(cu_idx); + DWARFCompileUnit *dwarf_cu = llvm::dyn_cast(unit); + if (dwarf_cu == nullptr) + continue; + + if (!dwarf_cu->GetDWOId().has_value()) + continue; + + + SymbolFile *dwo_symfile = dwarf_cu->GetDwoSymbolFile(); + if (!dwo_symfile) + continue; + + lldb_private::FileSpec symfile_spec = dwo_symfile->GetObjectFile()->GetFileSpec(); + if (symbolfile_map.find(symfile_spec.GetPath()) == symbolfile_map.end()) + symbolfile_map[symfile_spec.GetPath()] = symfile_spec; + } + return symbolfile_map; +} + + bool SymbolFileDWARF::GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index d7db8a3c0869f..69ce90caada38 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -279,6 +279,8 @@ class SymbolFileDWARF : public SymbolFileCommon { void DumpClangAST(Stream &s, llvm::StringRef filter) override; + llvm::StringMap GetSeparateDebugInfoFiles() override; + /// List separate dwo files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info = false) override; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 9d7452a1988fa..05ec0c8ef43f8 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1277,6 +1277,20 @@ void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter) { }); } +llvm::StringMap SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() { + const uint32_t cu_count = GetNumCompileUnits(); + llvm::StringMap cu_map; + for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) { + const auto &info = m_compile_unit_infos[cu_idx]; + if (info.so_file.GetPath().empty()) + continue; + + if (cu_map.find(info.oso_path) == cu_map.end()) + cu_map[info.oso_path] = info.so_file;; + } + return cu_map; +} + bool SymbolFileDWARFDebugMap::GetSeparateDebugInfo( lldb_private::StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index e1f1df23951c6..d3cb2af464a72 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -131,6 +131,8 @@ class SymbolFileDWARFDebugMap : public SymbolFileCommon { void DumpClangAST(Stream &s, llvm::StringRef filter) override; + llvm::StringMap GetSeparateDebugInfoFiles() override; + /// List separate oso files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info = false) override; diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp index 870d778dca740..9cc2ea7df3fbc 100644 --- a/lldb/source/Symbol/SymbolFile.cpp +++ b/lldb/source/Symbol/SymbolFile.cpp @@ -20,7 +20,6 @@ #include "lldb/Utility/StreamString.h" #include "lldb/Utility/StructuredData.h" #include "lldb/lldb-private.h" - #include using namespace lldb_private; From 73a0c6fec09ea626fac5253dcb8ce100e1a92071 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Thu, 12 Jun 2025 15:11:17 -0700 Subject: [PATCH 2/7] Add new test, and add swig extension to make writing the test easier --- .../interface/SBFileSpecListExtensions.i | 4 ++ lldb/source/API/SBModule.cpp | 10 ++++- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 1 - .../sbmodule/SeperateDebugInfo/Makefile | 3 ++ .../TestSBModuleSeparateDebugInfo.py | 43 +++++++++++++++++++ .../sbmodule/SeperateDebugInfo/main.cpp | 5 +++ 6 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 lldb/test/API/python_api/sbmodule/SeperateDebugInfo/Makefile create mode 100644 lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py create mode 100644 lldb/test/API/python_api/sbmodule/SeperateDebugInfo/main.cpp diff --git a/lldb/bindings/interface/SBFileSpecListExtensions.i b/lldb/bindings/interface/SBFileSpecListExtensions.i index 1e7b897a08d95..f8504e10d4063 100644 --- a/lldb/bindings/interface/SBFileSpecListExtensions.i +++ b/lldb/bindings/interface/SBFileSpecListExtensions.i @@ -10,6 +10,10 @@ STRING_EXTENSION_OUTSIDE(SBFileSpecList) def __iter__(self): '''Iterate over all FileSpecs in a lldb.SBFileSpecList object.''' return lldb_iter(self, 'GetSize', 'GetFileSpecAtIndex') + + def __getitem__(self, index): + '''Get an lldb.SBFileSpec at a given index, an invalid SBFileSpec will be returned if the index is invalid.''' + return self.GetFileSpecAtIndex(index) %} #endif } diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index ece6e5dfd2ad9..6baf5abbdeb1d 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -635,7 +635,15 @@ lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { lldb::SBFileSpecList SBModule::GetSeparateDebugInfoFiles() { lldb::SBFileSpecList sb_filespeclist; - + ModuleSP module_sp(GetSP()); + if (module_sp) { + llvm::StringMap debug_info_files = module_sp->GetSeparateDebugInfoFiles(); + for (auto &&[_, debug_info_file] : debug_info_files) { + sb_filespeclist.Append(debug_info_file); + } + } + + return sb_filespeclist; } lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index cc5a4f0cd0463..8c7405f78df31 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4228,7 +4228,6 @@ llvm::StringMap SymbolFileDWARF::GetSeparateDebugInfoFil if (!dwarf_cu->GetDWOId().has_value()) continue; - SymbolFile *dwo_symfile = dwarf_cu->GetDwoSymbolFile(); if (!dwo_symfile) continue; diff --git a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/Makefile b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/Makefile new file mode 100644 index 0000000000000..99998b20bcb05 --- /dev/null +++ b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py new file mode 100644 index 0000000000000..4aafcd4c166d8 --- /dev/null +++ b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py @@ -0,0 +1,43 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +import os, signal, subprocess + +from lldbsuite.test import lldbutil + + +class SBModuleSeparateDebugInfoCase(TestBase): + def setUp(self): + TestBase.setUp(self) + self.background_pid = None + + def tearDown(self): + TestBase.tearDown(self) + if self.background_pid: + os.kill(self.background_pid, signal.SIGKILL) + + @skipIf(debug_info=no_match("dwo")) + def test_get_separate_debug_info_files_dwo(self): + """Test the SBModule::GetSeparateDebugInfoFiles""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + + # Target should have a DWO + main_module = target.GetModuleAtIndex(0) + file_specs = main_module.GetSeparateDebugInfoFiles() + self.assertEqual(len(file_specs), 1) + self.assertTrue(file_specs[0].GetFilename().endswith(".dwo")) + + @skipIf(debug_info=no_match("oso")) + def test_get_separate_debug_info_files_oso(self): + """Test the SBModule::GetSeparateDebugInfoFiles""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + + # Target should have a DWO + main_module = target.GetModuleAtIndex(0) + file_specs = main_module.GetSeparateDebugInfoFiles() + self.assertEqual(len(file_specs), 1) + self.assertTrue(file_specs[0].GetFilename().endswith(".a")) diff --git a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/main.cpp b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/main.cpp new file mode 100644 index 0000000000000..f54a8087e1dc4 --- /dev/null +++ b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/main.cpp @@ -0,0 +1,5 @@ +int main() { + int x = 40; + x += 2; // break here + return x; +} From 764383251bd226f243a7e4a6df84b3a9f18d5b0b Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Thu, 12 Jun 2025 15:12:21 -0700 Subject: [PATCH 3/7] run GCF --- lldb/include/lldb/Core/Module.h | 2 +- lldb/include/lldb/Symbol/SymbolFile.h | 4 ++-- lldb/source/API/SBModule.cpp | 5 +++-- lldb/source/Core/Module.cpp | 3 ++- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 7 ++++--- .../Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 6 ++++-- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index 401c92fa4f540..458756e3679cd 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -482,7 +482,7 @@ class Module : public std::enable_shared_from_this, } const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; } - + const llvm::StringMap GetSeparateDebugInfoFiles(); void PreloadSymbols(); diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 76108342499ad..9a599ccd87ebf 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -504,8 +504,8 @@ class SymbolFile : public PluginInterface { /// always return a valid list, even if it is empty. /// /// \return - /// A unique map of all the filespecs, dwos in a dwps would be joined to the dwp path - /// for example. + /// A unique map of all the filespecs, dwos in a dwps would be joined to + /// the dwp path for example. virtual llvm::StringMap GetSeparateDebugInfoFiles() { return {}; } diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index 6baf5abbdeb1d..1c4e249d4a431 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -633,11 +633,12 @@ lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { return sb_file_spec; } -lldb::SBFileSpecList SBModule::GetSeparateDebugInfoFiles() { +lldb::SBFileSpecList SBModule::GetSeparateDebugInfoFiles() { lldb::SBFileSpecList sb_filespeclist; ModuleSP module_sp(GetSP()); if (module_sp) { - llvm::StringMap debug_info_files = module_sp->GetSeparateDebugInfoFiles(); + llvm::StringMap debug_info_files = + module_sp->GetSeparateDebugInfoFiles(); for (auto &&[_, debug_info_file] : debug_info_files) { sb_filespeclist.Append(debug_info_file); } diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 766b184b70dd0..a066d92993c3d 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1648,7 +1648,8 @@ DataFileCache *Module::GetIndexCache() { return g_data_file_cache; } -const llvm::StringMap Module::GetSeparateDebugInfoFiles() { +const llvm::StringMap +Module::GetSeparateDebugInfoFiles() { SymbolFile *symfile = GetSymbolFile(false); if (!symfile) return {}; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 8c7405f78df31..85152be8d4edf 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4215,7 +4215,8 @@ void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { clang->Dump(s.AsRawOstream(), filter); } -llvm::StringMap SymbolFileDWARF::GetSeparateDebugInfoFiles() { +llvm::StringMap +SymbolFileDWARF::GetSeparateDebugInfoFiles() { DWARFDebugInfo &info = DebugInfo(); const size_t num_cus = info.GetNumUnits(); llvm::StringMap symbolfile_map; @@ -4232,14 +4233,14 @@ llvm::StringMap SymbolFileDWARF::GetSeparateDebugInfoFil if (!dwo_symfile) continue; - lldb_private::FileSpec symfile_spec = dwo_symfile->GetObjectFile()->GetFileSpec(); + lldb_private::FileSpec symfile_spec = + dwo_symfile->GetObjectFile()->GetFileSpec(); if (symbolfile_map.find(symfile_spec.GetPath()) == symbolfile_map.end()) symbolfile_map[symfile_spec.GetPath()] = symfile_spec; } return symbolfile_map; } - bool SymbolFileDWARF::GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 05ec0c8ef43f8..7e9138749d3b4 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1277,7 +1277,8 @@ void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter) { }); } -llvm::StringMap SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() { +llvm::StringMap +SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() { const uint32_t cu_count = GetNumCompileUnits(); llvm::StringMap cu_map; for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) { @@ -1286,7 +1287,8 @@ llvm::StringMap SymbolFileDWARFDebugMap::GetSeparateDebu continue; if (cu_map.find(info.oso_path) == cu_map.end()) - cu_map[info.oso_path] = info.so_file;; + cu_map[info.oso_path] = info.so_file; + ; } return cu_map; } From c3f5dfdf06f07b2e4f5c872db1d122375afeb828 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Thu, 12 Jun 2025 15:52:19 -0700 Subject: [PATCH 4/7] Change test to dsym --- .../SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py index 4aafcd4c166d8..fc26af71325d7 100644 --- a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py +++ b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py @@ -29,8 +29,8 @@ def test_get_separate_debug_info_files_dwo(self): self.assertEqual(len(file_specs), 1) self.assertTrue(file_specs[0].GetFilename().endswith(".dwo")) - @skipIf(debug_info=no_match("oso")) - def test_get_separate_debug_info_files_oso(self): + @skipIf(debug_info=no_match("dsym")) + def test_get_separate_debug_info_files_dsym(self): """Test the SBModule::GetSeparateDebugInfoFiles""" self.build() exe = self.getBuildArtifact("a.out") From 44e6abfabe9d17a156453f2d248e7b83411068fa Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Fri, 13 Jun 2025 09:44:26 -0700 Subject: [PATCH 5/7] Use the correct 'oso_path' instead of 'so_file'. --- .../Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 3 +-- .../SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 7e9138749d3b4..fc48ccb984b03 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1287,8 +1287,7 @@ SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() { continue; if (cu_map.find(info.oso_path) == cu_map.end()) - cu_map[info.oso_path] = info.so_file; - ; + cu_map[info.oso_path] = lldb_private::FileSpec(info.oso_path); } return cu_map; } diff --git a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py index fc26af71325d7..011928cd0f330 100644 --- a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py +++ b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py @@ -29,8 +29,9 @@ def test_get_separate_debug_info_files_dwo(self): self.assertEqual(len(file_specs), 1) self.assertTrue(file_specs[0].GetFilename().endswith(".dwo")) - @skipIf(debug_info=no_match("dsym")) - def test_get_separate_debug_info_files_dsym(self): + @skipUnlessDarwin + @skipIf(debug_info=no_match("dwarf")) + def test_get_separate_debug_info_files_darwin_dwarf(self): """Test the SBModule::GetSeparateDebugInfoFiles""" self.build() exe = self.getBuildArtifact("a.out") @@ -40,4 +41,4 @@ def test_get_separate_debug_info_files_dsym(self): main_module = target.GetModuleAtIndex(0) file_specs = main_module.GetSeparateDebugInfoFiles() self.assertEqual(len(file_specs), 1) - self.assertTrue(file_specs[0].GetFilename().endswith(".a")) + self.assertTrue(file_specs[0].GetFilename().endswith(".o")) From 68f845f80def00aebe07a6712a6bff1437a3ae7c Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Mon, 16 Jun 2025 10:43:03 -0700 Subject: [PATCH 6/7] Switch to filespeclist --- lldb/include/lldb/API/SBFileSpecList.h | 3 +++ lldb/include/lldb/Core/Module.h | 2 +- lldb/include/lldb/Symbol/SymbolFile.h | 7 ++----- lldb/include/lldb/Symbol/SymbolFileOnDemand.h | 4 ++++ lldb/source/API/SBFileSpecList.cpp | 5 +++++ lldb/source/API/SBModule.cpp | 12 +++--------- lldb/source/Core/Module.cpp | 3 +-- .../Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 10 ++++------ .../Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 2 +- .../SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 9 ++++----- .../SymbolFile/DWARF/SymbolFileDWARFDebugMap.h | 2 +- 11 files changed, 29 insertions(+), 30 deletions(-) diff --git a/lldb/include/lldb/API/SBFileSpecList.h b/lldb/include/lldb/API/SBFileSpecList.h index 1a654865a3079..e55b2a89bc7a3 100644 --- a/lldb/include/lldb/API/SBFileSpecList.h +++ b/lldb/include/lldb/API/SBFileSpecList.h @@ -40,6 +40,9 @@ class LLDB_API SBFileSpecList { private: friend class SBTarget; + friend class SBModule; + + SBFileSpecList(lldb_private::FileSpecList &&list); const lldb_private::FileSpecList *operator->() const; diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index 458756e3679cd..48131235b3a21 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -483,7 +483,7 @@ class Module : public std::enable_shared_from_this, const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; } - const llvm::StringMap GetSeparateDebugInfoFiles(); + FileSpecList GetSeparateDebugInfoFiles(); void PreloadSymbols(); diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 9a599ccd87ebf..7d802bd62263d 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -504,11 +504,8 @@ class SymbolFile : public PluginInterface { /// always return a valid list, even if it is empty. /// /// \return - /// A unique map of all the filespecs, dwos in a dwps would be joined to - /// the dwp path for example. - virtual llvm::StringMap GetSeparateDebugInfoFiles() { - return {}; - } + /// A unique list of all the filespecs, or an empty list. + virtual lldb_private::FileSpecList GetSeparateDebugInfoFiles() { return {}; } virtual lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h index 6e3c2477d1769..d86708bfcda59 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -229,6 +229,10 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { load_all_debug_info); } + lldb_private::FileSpecList GetSeparateDebugInfoFiles() override { + return m_sym_file_impl->GetSeparateDebugInfoFiles(); + } + lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, std::optional byte_size, SymbolContextScope *context, diff --git a/lldb/source/API/SBFileSpecList.cpp b/lldb/source/API/SBFileSpecList.cpp index 74a368a3cabeb..40af7fc81cc83 100644 --- a/lldb/source/API/SBFileSpecList.cpp +++ b/lldb/source/API/SBFileSpecList.cpp @@ -31,6 +31,11 @@ SBFileSpecList::SBFileSpecList(const SBFileSpecList &rhs) { m_opaque_up = clone(rhs.m_opaque_up); } +SBFileSpecList::SBFileSpecList(FileSpecList &&list) + : m_opaque_up(new FileSpecList(std::move(list))) { + LLDB_INSTRUMENT_VA(this); +} + SBFileSpecList::~SBFileSpecList() = default; const SBFileSpecList &SBFileSpecList::operator=(const SBFileSpecList &rhs) { diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index 1c4e249d4a431..e44a0338b8878 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -634,17 +634,11 @@ lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { } lldb::SBFileSpecList SBModule::GetSeparateDebugInfoFiles() { - lldb::SBFileSpecList sb_filespeclist; ModuleSP module_sp(GetSP()); - if (module_sp) { - llvm::StringMap debug_info_files = - module_sp->GetSeparateDebugInfoFiles(); - for (auto &&[_, debug_info_file] : debug_info_files) { - sb_filespeclist.Append(debug_info_file); - } - } + if (module_sp) + return lldb::SBFileSpecList(module_sp->GetSeparateDebugInfoFiles()); - return sb_filespeclist; + return lldb::SBFileSpecList(); } lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index a066d92993c3d..a729ec8eff0d9 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1648,8 +1648,7 @@ DataFileCache *Module::GetIndexCache() { return g_data_file_cache; } -const llvm::StringMap -Module::GetSeparateDebugInfoFiles() { +lldb_private::FileSpecList Module::GetSeparateDebugInfoFiles() { SymbolFile *symfile = GetSymbolFile(false); if (!symfile) return {}; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 85152be8d4edf..3330e42e1e9a5 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4215,11 +4215,10 @@ void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { clang->Dump(s.AsRawOstream(), filter); } -llvm::StringMap -SymbolFileDWARF::GetSeparateDebugInfoFiles() { +lldb_private::FileSpecList SymbolFileDWARF::GetSeparateDebugInfoFiles() { DWARFDebugInfo &info = DebugInfo(); const size_t num_cus = info.GetNumUnits(); - llvm::StringMap symbolfile_map; + lldb_private::FileSpecList spec_list; for (uint32_t cu_idx = 0; cu_idx < num_cus; ++cu_idx) { DWARFUnit *unit = info.GetUnitAtIndex(cu_idx); DWARFCompileUnit *dwarf_cu = llvm::dyn_cast(unit); @@ -4235,10 +4234,9 @@ SymbolFileDWARF::GetSeparateDebugInfoFiles() { lldb_private::FileSpec symfile_spec = dwo_symfile->GetObjectFile()->GetFileSpec(); - if (symbolfile_map.find(symfile_spec.GetPath()) == symbolfile_map.end()) - symbolfile_map[symfile_spec.GetPath()] = symfile_spec; + spec_list.AppendIfUnique(symfile_spec); } - return symbolfile_map; + return spec_list; } bool SymbolFileDWARF::GetSeparateDebugInfo(StructuredData::Dictionary &d, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 69ce90caada38..c2b05fb277903 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -279,7 +279,7 @@ class SymbolFileDWARF : public SymbolFileCommon { void DumpClangAST(Stream &s, llvm::StringRef filter) override; - llvm::StringMap GetSeparateDebugInfoFiles() override; + lldb_private::FileSpecList GetSeparateDebugInfoFiles() override; /// List separate dwo files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index fc48ccb984b03..51720812478d6 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1277,19 +1277,18 @@ void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter) { }); } -llvm::StringMap +lldb_private::FileSpecList SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() { const uint32_t cu_count = GetNumCompileUnits(); - llvm::StringMap cu_map; + lldb_private::FileSpecList spec_list; for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) { const auto &info = m_compile_unit_infos[cu_idx]; if (info.so_file.GetPath().empty()) continue; - if (cu_map.find(info.oso_path) == cu_map.end()) - cu_map[info.oso_path] = lldb_private::FileSpec(info.oso_path); + spec_list.AppendIfUnique(lldb_private::FileSpec(info.oso_path)); } - return cu_map; + return spec_list; } bool SymbolFileDWARFDebugMap::GetSeparateDebugInfo( diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index d3cb2af464a72..de2d70dcbec55 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -131,7 +131,7 @@ class SymbolFileDWARFDebugMap : public SymbolFileCommon { void DumpClangAST(Stream &s, llvm::StringRef filter) override; - llvm::StringMap GetSeparateDebugInfoFiles() override; + lldb_private::FileSpecList GetSeparateDebugInfoFiles() override; /// List separate oso files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, From 6b1618d20df10f8f6d6cdfc0c1f3acf4aeb794a4 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde Date: Mon, 8 Sep 2025 14:30:34 -0700 Subject: [PATCH 7/7] Move to sbmodulespec --- lldb/bindings/interface/SBFileSpecListExtensions.i | 4 ---- lldb/bindings/interface/SBModuleSpecListExtensions.i | 5 ++++- lldb/include/lldb/API/SBFileSpecList.h | 3 --- lldb/include/lldb/API/SBModule.h | 2 +- lldb/include/lldb/API/SBModuleSpec.h | 3 +++ lldb/include/lldb/Core/Module.h | 2 +- lldb/include/lldb/Symbol/SymbolFile.h | 5 +++-- lldb/include/lldb/Symbol/SymbolFileOnDemand.h | 2 +- lldb/source/API/SBFileSpecList.cpp | 5 ----- lldb/source/API/SBModule.cpp | 6 +++--- lldb/source/API/SBModuleSpec.cpp | 5 +++++ lldb/source/Core/Module.cpp | 2 +- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 6 +++--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 2 +- .../Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 6 +++--- .../Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h | 2 +- lldb/source/Symbol/SymbolFile.cpp | 1 + .../SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py | 4 ++-- 18 files changed, 33 insertions(+), 32 deletions(-) diff --git a/lldb/bindings/interface/SBFileSpecListExtensions.i b/lldb/bindings/interface/SBFileSpecListExtensions.i index f8504e10d4063..1e7b897a08d95 100644 --- a/lldb/bindings/interface/SBFileSpecListExtensions.i +++ b/lldb/bindings/interface/SBFileSpecListExtensions.i @@ -10,10 +10,6 @@ STRING_EXTENSION_OUTSIDE(SBFileSpecList) def __iter__(self): '''Iterate over all FileSpecs in a lldb.SBFileSpecList object.''' return lldb_iter(self, 'GetSize', 'GetFileSpecAtIndex') - - def __getitem__(self, index): - '''Get an lldb.SBFileSpec at a given index, an invalid SBFileSpec will be returned if the index is invalid.''' - return self.GetFileSpecAtIndex(index) %} #endif } diff --git a/lldb/bindings/interface/SBModuleSpecListExtensions.i b/lldb/bindings/interface/SBModuleSpecListExtensions.i index ab51dc4498ad8..7d23f5bc940fc 100644 --- a/lldb/bindings/interface/SBModuleSpecListExtensions.i +++ b/lldb/bindings/interface/SBModuleSpecListExtensions.i @@ -10,7 +10,10 @@ STRING_EXTENSION_OUTSIDE(SBModuleSpecList) def __iter__(self): '''Iterate over all ModuleSpecs in a lldb.SBModuleSpecList object.''' return lldb_iter(self, 'GetSize', 'GetSpecAtIndex') + + def __getitem__(self, index): + '''Get an lldb.SBModuleSpec at a given index, an invalid SBModuleSpec will be returned if the index is invalid.''' + return self.GetSpecAtIndex(index) %} #endif } - diff --git a/lldb/include/lldb/API/SBFileSpecList.h b/lldb/include/lldb/API/SBFileSpecList.h index e55b2a89bc7a3..1a654865a3079 100644 --- a/lldb/include/lldb/API/SBFileSpecList.h +++ b/lldb/include/lldb/API/SBFileSpecList.h @@ -40,9 +40,6 @@ class LLDB_API SBFileSpecList { private: friend class SBTarget; - friend class SBModule; - - SBFileSpecList(lldb_private::FileSpecList &&list); const lldb_private::FileSpecList *operator->() const; diff --git a/lldb/include/lldb/API/SBModule.h b/lldb/include/lldb/API/SBModule.h index 9577bb57005ec..2917c5cb5564d 100644 --- a/lldb/include/lldb/API/SBModule.h +++ b/lldb/include/lldb/API/SBModule.h @@ -293,7 +293,7 @@ class LLDB_API SBModule { /// \return /// A list of filespecs associated with all the separate symbol files /// associated with this module. - lldb::SBFileSpecList GetSeparateDebugInfoFiles(); + lldb::SBModuleSpecList GetSeparateDebugInfoFiles(); lldb::SBAddress GetObjectFileHeaderAddress() const; lldb::SBAddress GetObjectFileEntryPointAddress() const; diff --git a/lldb/include/lldb/API/SBModuleSpec.h b/lldb/include/lldb/API/SBModuleSpec.h index 8d1ecfe6e6f8b..0d2987668e406 100644 --- a/lldb/include/lldb/API/SBModuleSpec.h +++ b/lldb/include/lldb/API/SBModuleSpec.h @@ -125,6 +125,9 @@ class SBModuleSpecList { bool GetDescription(lldb::SBStream &description); private: + friend class SBModule; + + SBModuleSpecList(lldb_private::ModuleSpecList &&module_spec_list); std::unique_ptr m_opaque_up; }; diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h index 48131235b3a21..72a4e1808732e 100644 --- a/lldb/include/lldb/Core/Module.h +++ b/lldb/include/lldb/Core/Module.h @@ -483,7 +483,7 @@ class Module : public std::enable_shared_from_this, const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; } - FileSpecList GetSeparateDebugInfoFiles(); + ModuleSpecList GetSeparateDebugInfoFiles(); void PreloadSymbols(); diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 7d802bd62263d..28b5fea0d6796 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -28,7 +28,6 @@ #include "lldb/lldb-private.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallSet.h" -#include "llvm/ADT/StringMap.h" #include "llvm/Support/Errc.h" #include @@ -505,7 +504,9 @@ class SymbolFile : public PluginInterface { /// /// \return /// A unique list of all the filespecs, or an empty list. - virtual lldb_private::FileSpecList GetSeparateDebugInfoFiles() { return {}; } + virtual lldb_private::ModuleSpecList GetSeparateDebugInfoFiles() { + return {}; + } virtual lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h index d86708bfcda59..fbb942df726d0 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -229,7 +229,7 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { load_all_debug_info); } - lldb_private::FileSpecList GetSeparateDebugInfoFiles() override { + lldb_private::ModuleSpecList GetSeparateDebugInfoFiles() override { return m_sym_file_impl->GetSeparateDebugInfoFiles(); } diff --git a/lldb/source/API/SBFileSpecList.cpp b/lldb/source/API/SBFileSpecList.cpp index 40af7fc81cc83..74a368a3cabeb 100644 --- a/lldb/source/API/SBFileSpecList.cpp +++ b/lldb/source/API/SBFileSpecList.cpp @@ -31,11 +31,6 @@ SBFileSpecList::SBFileSpecList(const SBFileSpecList &rhs) { m_opaque_up = clone(rhs.m_opaque_up); } -SBFileSpecList::SBFileSpecList(FileSpecList &&list) - : m_opaque_up(new FileSpecList(std::move(list))) { - LLDB_INSTRUMENT_VA(this); -} - SBFileSpecList::~SBFileSpecList() = default; const SBFileSpecList &SBFileSpecList::operator=(const SBFileSpecList &rhs) { diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index e44a0338b8878..e2db8b46ea274 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -633,12 +633,12 @@ lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { return sb_file_spec; } -lldb::SBFileSpecList SBModule::GetSeparateDebugInfoFiles() { +lldb::SBModuleSpecList SBModule::GetSeparateDebugInfoFiles() { ModuleSP module_sp(GetSP()); if (module_sp) - return lldb::SBFileSpecList(module_sp->GetSeparateDebugInfoFiles()); + return lldb::SBModuleSpecList(module_sp->GetSeparateDebugInfoFiles()); - return lldb::SBFileSpecList(); + return lldb::SBModuleSpecList(); } lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { diff --git a/lldb/source/API/SBModuleSpec.cpp b/lldb/source/API/SBModuleSpec.cpp index fbbcfeac20178..938397cc5c60f 100644 --- a/lldb/source/API/SBModuleSpec.cpp +++ b/lldb/source/API/SBModuleSpec.cpp @@ -183,6 +183,11 @@ SBModuleSpecList::SBModuleSpecList(const SBModuleSpecList &rhs) LLDB_INSTRUMENT_VA(this, rhs); } +SBModuleSpecList::SBModuleSpecList(lldb_private::ModuleSpecList &&module_spec) + : m_opaque_up(new ModuleSpecList(std::move(module_spec))) { + LLDB_INSTRUMENT_VA(this); +} + SBModuleSpecList &SBModuleSpecList::operator=(const SBModuleSpecList &rhs) { LLDB_INSTRUMENT_VA(this, rhs); diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index a729ec8eff0d9..cb95f95857a03 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -1648,7 +1648,7 @@ DataFileCache *Module::GetIndexCache() { return g_data_file_cache; } -lldb_private::FileSpecList Module::GetSeparateDebugInfoFiles() { +lldb_private::ModuleSpecList Module::GetSeparateDebugInfoFiles() { SymbolFile *symfile = GetSymbolFile(false); if (!symfile) return {}; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 3330e42e1e9a5..53460d260f68f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4215,10 +4215,10 @@ void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { clang->Dump(s.AsRawOstream(), filter); } -lldb_private::FileSpecList SymbolFileDWARF::GetSeparateDebugInfoFiles() { +lldb_private::ModuleSpecList SymbolFileDWARF::GetSeparateDebugInfoFiles() { DWARFDebugInfo &info = DebugInfo(); const size_t num_cus = info.GetNumUnits(); - lldb_private::FileSpecList spec_list; + lldb_private::ModuleSpecList spec_list; for (uint32_t cu_idx = 0; cu_idx < num_cus; ++cu_idx) { DWARFUnit *unit = info.GetUnitAtIndex(cu_idx); DWARFCompileUnit *dwarf_cu = llvm::dyn_cast(unit); @@ -4234,7 +4234,7 @@ lldb_private::FileSpecList SymbolFileDWARF::GetSeparateDebugInfoFiles() { lldb_private::FileSpec symfile_spec = dwo_symfile->GetObjectFile()->GetFileSpec(); - spec_list.AppendIfUnique(symfile_spec); + spec_list.Append(symfile_spec); } return spec_list; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index c2b05fb277903..14566de99a7de 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -279,7 +279,7 @@ class SymbolFileDWARF : public SymbolFileCommon { void DumpClangAST(Stream &s, llvm::StringRef filter) override; - lldb_private::FileSpecList GetSeparateDebugInfoFiles() override; + lldb_private::ModuleSpecList GetSeparateDebugInfoFiles() override; /// List separate dwo files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 51720812478d6..0cd1c4e6607ef 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1277,16 +1277,16 @@ void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter) { }); } -lldb_private::FileSpecList +lldb_private::ModuleSpecList SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() { const uint32_t cu_count = GetNumCompileUnits(); - lldb_private::FileSpecList spec_list; + lldb_private::ModuleSpecList spec_list; for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) { const auto &info = m_compile_unit_infos[cu_idx]; if (info.so_file.GetPath().empty()) continue; - spec_list.AppendIfUnique(lldb_private::FileSpec(info.oso_path)); + spec_list.Append(lldb_private::FileSpec(info.oso_path)); } return spec_list; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index de2d70dcbec55..b51dfdd24646f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -131,7 +131,7 @@ class SymbolFileDWARFDebugMap : public SymbolFileCommon { void DumpClangAST(Stream &s, llvm::StringRef filter) override; - lldb_private::FileSpecList GetSeparateDebugInfoFiles() override; + lldb_private::ModuleSpecList GetSeparateDebugInfoFiles() override; /// List separate oso files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp index 9cc2ea7df3fbc..870d778dca740 100644 --- a/lldb/source/Symbol/SymbolFile.cpp +++ b/lldb/source/Symbol/SymbolFile.cpp @@ -20,6 +20,7 @@ #include "lldb/Utility/StreamString.h" #include "lldb/Utility/StructuredData.h" #include "lldb/lldb-private.h" + #include using namespace lldb_private; diff --git a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py index 011928cd0f330..b36bfd009bc2e 100644 --- a/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py +++ b/lldb/test/API/python_api/sbmodule/SeperateDebugInfo/TestSBModuleSeparateDebugInfo.py @@ -27,7 +27,7 @@ def test_get_separate_debug_info_files_dwo(self): main_module = target.GetModuleAtIndex(0) file_specs = main_module.GetSeparateDebugInfoFiles() self.assertEqual(len(file_specs), 1) - self.assertTrue(file_specs[0].GetFilename().endswith(".dwo")) + self.assertTrue(file_specs[0].GetFileSpec().GetFilename().endswith(".dwo")) @skipUnlessDarwin @skipIf(debug_info=no_match("dwarf")) @@ -41,4 +41,4 @@ def test_get_separate_debug_info_files_darwin_dwarf(self): main_module = target.GetModuleAtIndex(0) file_specs = main_module.GetSeparateDebugInfoFiles() self.assertEqual(len(file_specs), 1) - self.assertTrue(file_specs[0].GetFilename().endswith(".o")) + self.assertTrue(file_specs[0].GetFileSpec().GetFilename().endswith(".o"))