[Lldb-commits] [lldb] [LLDB] Expose enumerator for separate-debug-info in SBModule (PR #144119)

Jacob Lalonde via lldb-commits lldb-commits at lists.llvm.org
Mon Sep 8 14:51:22 PDT 2025


https://github.com/Jlalond updated https://github.com/llvm/llvm-project/pull/144119

>From f5ba6674f18c5ed32d1f0579f88a464d35962964 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
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<Module>,
   }
 
   const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; }
+  
+  const llvm::StringMap<FileSpec> 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 <mutex>
@@ -496,6 +497,19 @@ class SymbolFile : public PluginInterface {
   ///     symbol file doesn't support DWO files, both counts will be 0.
   virtual std::pair<uint32_t, uint32_t> 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<lldb_private::FileSpec> GetSeparateDebugInfoFiles() {
+    return {};
+  }
+
   virtual lldb::TypeSP
   MakeType(lldb::user_id_t uid, ConstString name,
            std::optional<uint64_t> 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<lldb_private::FileSpec> 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<lldb_private::FileSpec> SymbolFileDWARF::GetSeparateDebugInfoFiles() {
+  DWARFDebugInfo &info = DebugInfo();
+  const size_t num_cus = info.GetNumUnits();
+  llvm::StringMap<lldb_private::FileSpec> 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<DWARFCompileUnit>(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<lldb_private::FileSpec> 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<lldb_private::FileSpec> SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() {
+  const uint32_t cu_count = GetNumCompileUnits();
+  llvm::StringMap<lldb_private::FileSpec> 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<lldb_private::FileSpec> 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 <future>
 
 using namespace lldb_private;

>From 73a0c6fec09ea626fac5253dcb8ce100e1a92071 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
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<lldb_private::FileSpec> 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<lldb_private::FileSpec> 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 <jalalonde at fb.com>
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<Module>,
   }
 
   const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; }
-  
+
   const llvm::StringMap<FileSpec> 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<lldb_private::FileSpec> 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<lldb_private::FileSpec> debug_info_files = module_sp->GetSeparateDebugInfoFiles();
+    llvm::StringMap<lldb_private::FileSpec> 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<lldb_private::FileSpec> Module::GetSeparateDebugInfoFiles() {
+const llvm::StringMap<lldb_private::FileSpec>
+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<lldb_private::FileSpec> SymbolFileDWARF::GetSeparateDebugInfoFiles() {
+llvm::StringMap<lldb_private::FileSpec>
+SymbolFileDWARF::GetSeparateDebugInfoFiles() {
   DWARFDebugInfo &info = DebugInfo();
   const size_t num_cus = info.GetNumUnits();
   llvm::StringMap<lldb_private::FileSpec> symbolfile_map;
@@ -4232,14 +4233,14 @@ llvm::StringMap<lldb_private::FileSpec> 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<lldb_private::FileSpec> SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() {
+llvm::StringMap<lldb_private::FileSpec>
+SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() {
   const uint32_t cu_count = GetNumCompileUnits();
   llvm::StringMap<lldb_private::FileSpec> cu_map;
   for (uint32_t cu_idx = 0; cu_idx < cu_count; ++cu_idx) {
@@ -1286,7 +1287,8 @@ llvm::StringMap<lldb_private::FileSpec> 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 <jalalonde at fb.com>
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 <jalalonde at fb.com>
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 <jalalonde at fb.com>
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<Module>,
 
   const FileSpec &GetSymbolFileFileSpec() const { return m_symfile_spec; }
 
-  const llvm::StringMap<FileSpec> 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<lldb_private::FileSpec> 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<uint64_t> 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<lldb_private::FileSpec> 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<lldb_private::FileSpec>
-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<lldb_private::FileSpec>
-SymbolFileDWARF::GetSeparateDebugInfoFiles() {
+lldb_private::FileSpecList SymbolFileDWARF::GetSeparateDebugInfoFiles() {
   DWARFDebugInfo &info = DebugInfo();
   const size_t num_cus = info.GetNumUnits();
-  llvm::StringMap<lldb_private::FileSpec> 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<DWARFCompileUnit>(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<lldb_private::FileSpec> 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::FileSpec>
+lldb_private::FileSpecList
 SymbolFileDWARFDebugMap::GetSeparateDebugInfoFiles() {
   const uint32_t cu_count = GetNumCompileUnits();
-  llvm::StringMap<lldb_private::FileSpec> 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<lldb_private::FileSpec> 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 <jalalonde at fb.com>
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<lldb_private::ModuleSpecList> 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<Module>,
 
   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 <mutex>
@@ -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<DWARFCompileUnit>(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 <future>
 
 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"))



More information about the lldb-commits mailing list