@@ -466,6 +466,48 @@ void ModuleList::FindFunctions(ConstString name,
466466 }
467467}
468468
469+ void ModuleList::FindFunctions (
470+ ConstString name, lldb::FunctionNameType name_type_mask,
471+ const ModuleFunctionSearchOptions &options,
472+ const SymbolContext *search_hint,
473+ llvm::function_ref<IterationAction(const lldb::ModuleSP &module ,
474+ const SymbolContextList &partial_result)>
475+ partial_result_handler) const {
476+ SymbolContextList sc_list_partial{};
477+ auto FindInModule = [&](const ModuleSP &module ) {
478+ if (!module )
479+ return IterationAction::Continue;
480+ module ->FindFunctions (name, CompilerDeclContext (), name_type_mask, options,
481+ sc_list_partial);
482+ if (!sc_list_partial.IsEmpty ()) {
483+ auto iteration_action = partial_result_handler (module , sc_list_partial);
484+ sc_list_partial.Clear ();
485+ return iteration_action;
486+ }
487+ return IterationAction::Continue;
488+ };
489+
490+ std::vector<ModuleSP> modules_copy;
491+ {
492+ std::lock_guard<std::recursive_mutex> guard (m_modules_mutex);
493+ modules_copy = m_modules;
494+ }
495+
496+ auto hinted_module = search_hint ? search_hint->module_sp : nullptr ;
497+ if (hinted_module) {
498+ assert (std::find (modules_copy.begin (), modules_copy.end (), hinted_module) !=
499+ modules_copy.end ());
500+ if (FindInModule (hinted_module) == IterationAction::Stop)
501+ return ;
502+ }
503+ for (const ModuleSP &module_sp : modules_copy) {
504+ if (module_sp != hinted_module) {
505+ if (FindInModule (module_sp) == IterationAction::Stop)
506+ return ;
507+ }
508+ }
509+ }
510+
469511void ModuleList::FindFunctionSymbols (ConstString name,
470512 lldb::FunctionNameType name_type_mask,
471513 SymbolContextList &sc_list) {
@@ -532,6 +574,44 @@ void ModuleList::FindSymbolsWithNameAndType(ConstString name,
532574 module_sp->FindSymbolsWithNameAndType (name, symbol_type, sc_list);
533575}
534576
577+ void ModuleList::FindSymbolsWithNameAndType (
578+ ConstString name, lldb::SymbolType symbol_type,
579+ const SymbolContext *search_hint,
580+ llvm::function_ref<IterationAction(const ModuleSP &,
581+ const SymbolContextList &)>
582+ partial_result_handler) const {
583+ SymbolContextList sc_list_partial{};
584+ auto FindInModule = [&](const ModuleSP &module ) {
585+ module ->FindSymbolsWithNameAndType (name, symbol_type, sc_list_partial);
586+ if (!sc_list_partial.IsEmpty ()) {
587+ auto iteration_action = partial_result_handler (module , sc_list_partial);
588+ sc_list_partial.Clear ();
589+ return iteration_action;
590+ }
591+ return IterationAction::Continue;
592+ };
593+
594+
595+ std::vector<ModuleSP> modules_copy;
596+ {
597+ std::lock_guard<std::recursive_mutex> guard (m_modules_mutex);
598+ modules_copy = m_modules;
599+ }
600+ auto hinted_module = search_hint ? search_hint->module_sp : nullptr ;
601+ if (hinted_module) {
602+ assert (std::find (modules_copy.begin (), modules_copy.end (), hinted_module) !=
603+ modules_copy.end ());
604+ if (FindInModule (hinted_module) == IterationAction::Stop)
605+ return ;
606+ }
607+ for (const ModuleSP &module_sp : modules_copy) {
608+ if (module_sp != hinted_module) {
609+ if (FindInModule (module_sp) == IterationAction::Stop)
610+ return ;
611+ }
612+ }
613+ }
614+
535615void ModuleList::FindSymbolsMatchingRegExAndType (
536616 const RegularExpression ®ex, lldb::SymbolType symbol_type,
537617 SymbolContextList &sc_list) const {
0 commit comments