aprantl created this revision.
aprantl added reviewers: jingham, jasonmolenda, teemperor, friss.
Herald added a reviewer: jdoerfert.

For Swift LLDB (but potentially also for module support in Clang-land) I need a 
way to accumulate the path remappings produced by `Module::RegisterXcodeSDK()`. 
 Unfortunately there is no way to go from an executable's Module to the 
auxiliary modules that represent the individual OSO object files of a 
SymbolFileDWARFDebugMap.

Here is a proposed API that would allow me to do this. Does this look 
reasonable?


https://reviews.llvm.org/D79384

Files:
  lldb/include/lldb/Symbol/SymbolFile.h
  lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
  lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h


Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -67,6 +67,8 @@
   bool ForEachExternalModule(
       lldb_private::CompileUnit &, llvm::DenseSet<lldb_private::SymbolFile *> 
&,
       llvm::function_ref<bool(lldb_private::Module &)>) override;
+  bool ForEachAuxiliaryModule(
+      llvm::function_ref<bool(lldb_private::Module &)>) override;
 
   bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit,
                          lldb_private::FileSpecList &support_files) override;
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -663,6 +663,19 @@
   return false;
 }
 
+bool SymbolFileDWARFDebugMap::ForEachAuxiliaryModule(
+    llvm::function_ref<bool(Module &)> f) {
+  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
+  ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+    if (oso_dwarf)
+      if (auto *obj = oso_dwarf->GetObjectFile())
+        if (ModuleSP module_sp = obj->GetModule())
+          return f(*module_sp);
+    return false;
+  });
+  return false;
+}
+
 bool SymbolFileDWARFDebugMap::ParseSupportFiles(CompileUnit &comp_unit,
                                                 FileSpecList &support_files) {
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Index: lldb/include/lldb/Symbol/SymbolFile.h
===================================================================
--- lldb/include/lldb/Symbol/SymbolFile.h
+++ lldb/include/lldb/Symbol/SymbolFile.h
@@ -164,6 +164,25 @@
       llvm::function_ref<bool(Module &)> lambda) {
     return false;
   }
+
+  /// Apply a lambda to each auxiliary lldb::Module referenced by this
+  /// \p comp_unit.
+  ///
+  /// This function can be used to traverse all OSO modules in a
+  /// SymbolFileDWARFDebugMap.
+  ///
+  /// \param[in] lambda
+  ///     The lambda that should be applied to every function. The lambda can
+  ///     return true if the iteration should be aborted earlier.
+  ///
+  /// \return
+  ///     If the lambda early-exited, this function returns true to
+  ///     propagate the early exit.
+  virtual bool
+  ForEachAuxiliaryModule(llvm::function_ref<bool(Module &)> lambda) {
+    return false;
+  }
+
   virtual bool ParseSupportFiles(CompileUnit &comp_unit,
                                  FileSpecList &support_files) = 0;
   virtual size_t ParseTypes(CompileUnit &comp_unit) = 0;


Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -67,6 +67,8 @@
   bool ForEachExternalModule(
       lldb_private::CompileUnit &, llvm::DenseSet<lldb_private::SymbolFile *> &,
       llvm::function_ref<bool(lldb_private::Module &)>) override;
+  bool ForEachAuxiliaryModule(
+      llvm::function_ref<bool(lldb_private::Module &)>) override;
 
   bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit,
                          lldb_private::FileSpecList &support_files) override;
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -663,6 +663,19 @@
   return false;
 }
 
+bool SymbolFileDWARFDebugMap::ForEachAuxiliaryModule(
+    llvm::function_ref<bool(Module &)> f) {
+  std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
+  ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
+    if (oso_dwarf)
+      if (auto *obj = oso_dwarf->GetObjectFile())
+        if (ModuleSP module_sp = obj->GetModule())
+          return f(*module_sp);
+    return false;
+  });
+  return false;
+}
+
 bool SymbolFileDWARFDebugMap::ParseSupportFiles(CompileUnit &comp_unit,
                                                 FileSpecList &support_files) {
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
Index: lldb/include/lldb/Symbol/SymbolFile.h
===================================================================
--- lldb/include/lldb/Symbol/SymbolFile.h
+++ lldb/include/lldb/Symbol/SymbolFile.h
@@ -164,6 +164,25 @@
       llvm::function_ref<bool(Module &)> lambda) {
     return false;
   }
+
+  /// Apply a lambda to each auxiliary lldb::Module referenced by this
+  /// \p comp_unit.
+  ///
+  /// This function can be used to traverse all OSO modules in a
+  /// SymbolFileDWARFDebugMap.
+  ///
+  /// \param[in] lambda
+  ///     The lambda that should be applied to every function. The lambda can
+  ///     return true if the iteration should be aborted earlier.
+  ///
+  /// \return
+  ///     If the lambda early-exited, this function returns true to
+  ///     propagate the early exit.
+  virtual bool
+  ForEachAuxiliaryModule(llvm::function_ref<bool(Module &)> lambda) {
+    return false;
+  }
+
   virtual bool ParseSupportFiles(CompileUnit &comp_unit,
                                  FileSpecList &support_files) = 0;
   virtual size_t ParseTypes(CompileUnit &comp_unit) = 0;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to