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