32#include "llvm/Support/ThreadPool.h"
38#include "clang/Driver/Driver.h"
39#include "llvm/ADT/StringRef.h"
40#include "llvm/Support/FileSystem.h"
41#include "llvm/Support/Threading.h"
42#include "llvm/Support/raw_ostream.h"
71#define LLDB_PROPERTIES_modulelist
72#include "CoreProperties.inc"
75#define LLDB_PROPERTIES_modulelist
76#include "CorePropertiesEnum.inc"
87 llvm::SmallString<128> path;
88 if (clang::driver::Driver::getDefaultModuleCachePath(path)) {
93 if (llvm::sys::path::cache_directory(path)) {
94 llvm::sys::path::append(path,
"lldb");
95 llvm::sys::path::append(path,
"IndexCache");
101 const uint32_t idx = ePropertyEnableExternalLookup;
103 idx, g_modulelist_properties[idx].default_uint_value != 0);
115 const uint32_t idx = ePropertyAutoDownload;
118 g_modulelist_properties[idx].default_uint_value));
122 const uint32_t idx = ePropertySharedCacheBinaryLoading;
125 g_modulelist_properties[idx].default_uint_value));
129 const uint32_t idx = ePropertyClangModulesCachePath;
134 const uint32_t idx = ePropertyClangModulesCachePath;
139 const uint32_t idx = ePropertyLLDBIndexCachePath;
144 const uint32_t idx = ePropertyLLDBIndexCachePath;
149 const uint32_t idx = ePropertyEnableLLDBIndexCache;
151 idx, g_modulelist_properties[idx].default_uint_value != 0);
159 const uint32_t idx = ePropertyLLDBIndexCacheMaxByteSize;
161 idx, g_modulelist_properties[idx].default_uint_value);
165 const uint32_t idx = ePropertyLLDBIndexCacheMaxPercent;
167 idx, g_modulelist_properties[idx].default_uint_value);
171 const uint32_t idx = ePropertyLLDBIndexCacheExpirationDays;
173 idx, g_modulelist_properties[idx].default_uint_value);
180 const bool notify =
false;
182 for (
auto symlink : list) {
196 const uint32_t idx = ePropertyLoadSymbolOnDemand;
198 idx, g_modulelist_properties[idx].default_uint_value != 0);
244 const bool elem_zero_is_executable =
248 if (!elem_zero_is_executable && obj &&
259 m_notifier->NotifyModuleAdded(*
this, module_sp);
274 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
275 module_sp->GetArchitecture());
277 module_sp->GetPlatformFileSpec();
282 if (test_module_sp->MatchesModuleSpec(equivalent_module_spec)) {
284 old_modules->push_back(test_module_sp);
299 if (module_sp.get() == new_module.get())
303 Append(new_module, notify);
326 collection::iterator pos, end =
m_modules.end();
327 for (pos =
m_modules.begin(); pos != end; ++pos) {
328 if (pos->get() == module_sp.get()) {
331 m_notifier->NotifyModuleRemoved(*
this, module_sp);
339ModuleList::collection::iterator
343 collection::iterator retval =
m_modules.erase(pos);
359 m_notifier->NotifyModuleUpdated(*
this, old_module_sp, new_module_sp);
364 if (
auto module_sp = module_wp.lock()) {
366 collection::iterator pos, end =
m_modules.end();
367 for (pos =
m_modules.begin(); pos != end; ++pos) {
368 if (pos->get() == module_sp.get()) {
372 if (pos->use_count() == kUseCountOrphaned) {
384 std::unique_lock<std::recursive_mutex> lock(
m_modules_mutex, std::defer_lock);
390 if (!lock.try_lock())
393 size_t remove_count = 0;
397 bool made_progress =
true;
398 while (made_progress) {
400 made_progress =
false;
401 collection::iterator pos =
m_modules.begin();
407 made_progress =
true;
418 size_t num_removed = 0;
419 collection::iterator pos, end = module_list.
m_modules.end();
420 for (pos = module_list.
m_modules.begin(); pos != end; ++pos) {
425 m_notifier->NotifyModulesRemoved(module_list);
460 FunctionNameType name_type_mask,
463 if (name_type_mask & eFunctionNameTypeAuto) {
464 std::vector<Module::LookupInfo> lookup_infos =
468 for (
const auto &lookup_info : lookup_infos) {
469 const size_t old_size = sc_list.
GetSize();
475 const size_t new_size = sc_list.
GetSize();
476 if (old_size < new_size)
477 lookup_info.Prune(sc_list, old_size);
482 module_sp->FindFunctions(name, CompilerDeclContext(), name_type_mask,
489 lldb::FunctionNameType name_type_mask,
491 if (name_type_mask & eFunctionNameTypeAuto) {
492 std::vector<Module::LookupInfo> lookup_infos =
497 for (
const auto &lookup_info : lookup_infos) {
498 const size_t old_size = sc_list.
GetSize();
500 module_sp->FindFunctionSymbols(lookup_info.GetLookupName(),
501 lookup_info.GetNameTypeMask(), sc_list);
504 const size_t new_size = sc_list.
GetSize();
506 if (old_size < new_size)
507 lookup_info.Prune(sc_list, old_size);
512 module_sp->FindFunctionSymbols(name, name_type_mask, sc_list);
522 module_sp->FindFunctions(name, options, sc_list);
529 module_sp->FindCompileUnits(path, sc_list);
546 module_sp->FindGlobalVariables(regex, max_matches, variable_list);
554 module_sp->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
562 module_sp->FindSymbolsMatchingRegExAndType(regex, symbol_type, sc_list);
569 if (module_sp->MatchesModuleSpec(module_spec))
570 matching_module_list.
Append(module_sp);
580 collection::const_iterator pos, end =
m_modules.end();
582 for (pos =
m_modules.begin(); pos != end; ++pos) {
583 if ((*pos).get() == module_ptr) {
597 collection::const_iterator pos, end =
m_modules.end();
599 for (pos =
m_modules.begin(); pos != end; ++pos) {
600 if ((*pos)->GetUUID() == uuid) {
612 if (m->GetID() == uid) {
628 if (results.
Done(query))
631 for (
const auto &module_sp :
m_modules) {
632 if (search_first != module_sp.get()) {
633 module_sp->FindTypes(query, results);
634 if (results.
Done(query))
644 if (module_sp->FindSourceFile(orig_spec, new_spec))
651 const FileSpec &file, uint32_t line,
653 std::vector<Address> &output_local,
654 std::vector<Address> &output_extern) {
657 module_sp->FindAddressesForLine(target_sp, file, line, function,
658 output_local, output_extern);
665 collection::const_iterator pos, end =
m_modules.end();
666 for (pos =
m_modules.begin(); pos != end; ++pos) {
668 if (module_sp->MatchesModuleSpec(module_spec))
690 if (log !=
nullptr) {
692 collection::const_iterator pos, begin =
m_modules.begin(),
694 for (pos = begin; pos != end; ++pos) {
695 Module *module = pos->get();
696 const FileSpec &module_file_spec =
module->GetFileSpec();
697 LLDB_LOGF(log,
"%s[%u] %s (%s) \"%s\"", prefix_cstr ? prefix_cstr :
"",
698 (uint32_t)std::distance(begin, pos),
701 module_file_spec.
GetPath().c_str());
710 if (module_sp->ResolveFileAddress(vm_addr, so_addr))
719 SymbolContextItem resolve_scope,
722 uint32_t resolved_flags = 0;
726 module_sp->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
729 collection::const_iterator pos, end =
m_modules.end();
730 for (pos =
m_modules.begin(); pos != end; ++pos) {
732 (*pos)->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
733 if (resolved_flags != 0)
738 return resolved_flags;
742 const char *file_path, uint32_t line,
bool check_inlines,
746 resolve_scope, sc_list);
750 const FileSpec &file_spec, uint32_t line,
bool check_inlines,
754 module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
755 resolve_scope, sc_list);
764 collection::const_iterator pos;
765 collection::const_iterator begin =
m_modules.begin();
766 collection::const_iterator end =
m_modules.end();
767 for (pos = begin; pos != end; ++pos) {
768 if ((*pos).get() == module)
769 return std::distance(begin, pos);
778class SharedModuleList {
782 void FindModules(
const ModuleSpec &module_spec,
784 std::lock_guard<std::recursive_mutex> guard(GetMutex());
787 FindModulesInMap(module_spec, matching_module_list);
788 if (!matching_module_list.
IsEmpty())
790 m_list.FindModules(module_spec, matching_module_list);
795 assert((matching_module_list.
IsEmpty() ||
801 "Search by name not found in SharedModuleList's map");
806 std::lock_guard<std::recursive_mutex> guard(GetMutex());
807 if (
ModuleSP result = FindModuleInMap(module))
809 return m_list.FindModule(&module);
813 ModuleSP FindModule(
const UUID &uuid)
const {
814 return m_list.FindModule(uuid);
817 void Append(
const ModuleSP &module_sp,
bool use_notifier) {
820 std::lock_guard<std::recursive_mutex> guard(GetMutex());
821 m_list.Append(module_sp, use_notifier);
825 size_t RemoveOrphans(
bool mandatory) {
826 std::unique_lock<std::recursive_mutex> lock(GetMutex(), std::defer_lock);
830 if (!lock.try_lock())
833 size_t total_count = 0;
839 run_count = RemoveOrphansFromMapAndList();
840 run_count += m_list.RemoveOrphans(mandatory);
841 total_count += run_count;
844 }
while (run_count != 0);
849 bool Remove(
const ModuleSP &module_sp,
bool use_notifier =
true) {
852 std::lock_guard<std::recursive_mutex> guard(GetMutex());
853 RemoveFromMap(module_sp);
854 return m_list.Remove(module_sp, use_notifier);
857 void ReplaceEquivalent(
const ModuleSP &module_sp,
858 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules) {
859 std::lock_guard<std::recursive_mutex> guard(GetMutex());
860 m_list.ReplaceEquivalent(module_sp, old_modules);
861 ReplaceEquivalentInMap(module_sp);
864 bool RemoveIfOrphaned(
const ModuleWP module_wp) {
865 std::lock_guard<std::recursive_mutex> guard(GetMutex());
866 RemoveFromMap(module_wp,
true);
867 return m_list.RemoveIfOrphaned(module_wp);
870 std::recursive_mutex &GetMutex()
const {
return m_list.GetMutex(); }
876 llvm::StringRef name =
module.GetFileSpec().GetFilename();
877 auto it = m_name_to_modules.find(ConstString(name));
878 if (it == m_name_to_modules.end())
880 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
881 for (
const ModuleSP &module_sp : vector) {
882 if (module_sp.get() == &module)
888 void FindModulesInMap(
const ModuleSpec &module_spec,
889 ModuleList &matching_module_list)
const {
890 auto it = m_name_to_modules.find(
892 if (it == m_name_to_modules.end())
894 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
895 for (
const ModuleSP &module_sp : vector) {
896 if (module_sp->MatchesModuleSpec(module_spec))
897 matching_module_list.
Append(module_sp);
901 void AddToMap(
const ModuleSP &module_sp) {
902 llvm::StringRef name = module_sp->GetFileSpec().GetFilename();
905 m_name_to_modules[ConstString(name)].push_back(module_sp);
908 void RemoveFromMap(
const ModuleWP module_wp,
bool if_orphaned =
false) {
909 if (
auto module_sp = module_wp.lock()) {
910 ConstString name = ConstString(module_sp->GetFileSpec().GetFilename());
911 if (!m_name_to_modules.contains(name))
913 llvm::SmallVectorImpl<ModuleSP> &vec = m_name_to_modules[name];
914 for (
auto *it = vec.begin(); it != vec.end(); ++it) {
915 if (it->get() == module_sp.get()) {
918 constexpr long kUseCountOrphaned =
919 kUseCountSharedModuleListOrphaned + 1;
920 if (!if_orphaned || it->use_count() == kUseCountOrphaned) {
929 void ReplaceEquivalentInMap(
const ModuleSP &module_sp) {
930 RemoveEquivalentModulesFromMap(module_sp);
934 void RemoveEquivalentModulesFromMap(
const ModuleSP &module_sp) {
935 llvm::StringRef name = module_sp->GetFileSpec().GetFilename();
939 auto it = m_name_to_modules.find(ConstString(name));
940 if (it == m_name_to_modules.end())
945 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
946 module_sp->GetArchitecture());
947 equivalent_module_spec.GetPlatformFileSpec() =
948 module_sp->GetPlatformFileSpec();
950 llvm::SmallVectorImpl<ModuleSP> &vec = it->second;
951 llvm::erase_if(vec, [&equivalent_module_spec](
ModuleSP &element) {
952 return element->MatchesModuleSpec(equivalent_module_spec);
957 ModuleList RemoveOrphansFromVector(llvm::SmallVectorImpl<ModuleSP> &vec) {
960 auto *to_remove_start = llvm::remove_if(vec, [](
const ModuleSP &module) {
961 return module.use_count() == kUseCountSharedModuleListOrphaned;
964 ModuleList to_remove;
965 for (
ModuleSP *it = to_remove_start; it != vec.end(); ++it)
966 to_remove.Append(*it);
968 vec.erase(to_remove_start, vec.end());
976 int RemoveOrphansFromMapAndList() {
980 int remove_count = 0;
981 int previous_remove_count;
983 previous_remove_count = remove_count;
984 for (
auto &[name, vec] : m_name_to_modules) {
987 ModuleList to_remove = RemoveOrphansFromVector(vec);
988 remove_count += to_remove.
GetSize();
989 m_list.Remove(to_remove);
992 }
while (previous_remove_count != remove_count);
1001 llvm::DenseMap<ConstString, llvm::SmallVector<ModuleSP, 1>> m_name_to_modules;
1004 static constexpr long kUseCountSharedModuleListOrphaned = 2;
1007struct SharedModuleListInfo {
1008 SharedModuleList module_list;
1009 ModuleListProperties module_list_properties;
1013 static SharedModuleListInfo *g_shared_module_list_info =
nullptr;
1014 static llvm::once_flag g_once_flag;
1015 llvm::call_once(g_once_flag, []() {
1019 if (g_shared_module_list_info ==
nullptr)
1020 g_shared_module_list_info =
new SharedModuleListInfo();
1022 return *g_shared_module_list_info;
1036 return shared_module_list.FindModule(*module_ptr).get() !=
nullptr;
1057 bool *did_create_ptr,
bool invoke_locate_callback,
1058 bool invoke_symbol_locators) {
1060 std::lock_guard<std::recursive_mutex> guard(shared_module_list.GetMutex());
1068 *did_create_ptr =
false;
1079 shared_module_list.FindModules(module_spec, matching_module_list);
1080 const size_t num_matching_modules = matching_module_list.
GetSize();
1082 if (num_matching_modules > 0) {
1083 for (
size_t module_idx = 0; module_idx < num_matching_modules;
1088 if (module_sp->FileHasChanged()) {
1090 old_modules->push_back(module_sp);
1095 "{0:x} '{1}' module changed: removing from global module list",
1096 static_cast<void *
>(module_sp.get()),
1097 module_sp->GetFileSpec().GetFilename());
1099 shared_module_list.Remove(module_sp);
1117 if (invoke_locate_callback) {
1120 if (target_sp->IsValid())
1121 platform_sp = target_sp->GetPlatform();
1128 platform_sp->CallLocateModuleCallbackIfSet(
1129 module_spec, module_sp, symbol_file_spec, did_create_ptr);
1137 module_sp = std::make_shared<Module>(module_spec);
1141 if (module_sp->GetObjectFile()) {
1144 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1147 if (module_sp->GetObjectFile() && module_sp->GetObjectFile()->GetType() ==
1151 if (did_create_ptr) {
1152 *did_create_ptr =
true;
1155 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1167 module_search_paths = target_sp->GetExecutableSearchPaths();
1169 if (!module_search_paths.
IsEmpty()) {
1170 const auto num_directories = module_search_paths.
GetSize();
1171 for (
size_t idx = 0; idx < num_directories; ++idx) {
1174 namespace fs = llvm::sys::fs;
1177 search_path_spec.AppendPathComponent(
1182 auto resolved_module_spec(module_spec);
1183 resolved_module_spec.GetFileSpec() = search_path_spec;
1184 module_sp = std::make_shared<Module>(resolved_module_spec);
1185 if (module_sp->GetObjectFile()) {
1188 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1191 if (module_sp->GetObjectFile()->GetType() ==
1196 *did_create_ptr =
true;
1198 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1211 if (!invoke_symbol_locators) {
1212 std::string uuid_str;
1213 if (uuid_ptr && uuid_ptr->
IsValid())
1215 if (!uuid_str.empty())
1217 "cannot locate module for UUID '{}'", uuid_str);
1226 module_spec, symbol_locator_map);
1229 if (located_binary_modulespec.
GetFileSpec() != module_file_spec) {
1233 if (path[0] ==
'\0')
1234 module_file_spec.
GetPath(path,
sizeof(path));
1239 std::string uuid_str;
1240 if (uuid_ptr && uuid_ptr->
IsValid())
1244 if (!uuid_str.empty())
1246 "'%s' does not contain the %s architecture and UUID %s", path,
1250 "'%s' does not contain the %s architecture.", path,
1264 ModuleSpec platform_module_spec(module_spec);
1272 shared_module_list.FindModules(platform_module_spec, matching_module_list);
1273 if (!matching_module_list.
IsEmpty()) {
1278 if (platform_module_spec.
GetUUIDPtr() ==
nullptr) {
1281 if (file_spec_mod_time != llvm::sys::TimePoint<>()) {
1282 if (file_spec_mod_time != module_sp->GetModificationTime()) {
1284 old_modules->push_back(module_sp);
1285 shared_module_list.Remove(module_sp);
1293 module_sp = std::make_shared<Module>(platform_module_spec);
1298 if (module_sp && module_sp->GetObjectFile()) {
1299 module_sp->GetSymbolLocatorStatistics().merge(symbol_locator_map);
1300 if (module_sp->GetObjectFile()->GetType() ==
1305 *did_create_ptr =
true;
1307 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1315 "unable to open %s architecture in '%s'",
1321 std::string uuid_str;
1322 if (uuid_ptr && uuid_ptr->
IsValid())
1325 if (!uuid_str.empty())
1327 "cannot locate a module for UUID '%s'", uuid_str.c_str());
1349 assert(scripting_fspec);
1356 nullptr, {}, target.shared_from_this());
1370 if (!script_interpreter) {
1382 llvm::SmallDenseMap<FileSpec, LoadScriptFromSymFile> file_specs =
1383 platform_sp->LocateExecutableScriptingResources(&target, module,
1386 if (!feedback_stream.
Empty())
1389 const bool trusted = platform_sp->IsSymbolFileTrusted(module);
1391 for (
const auto &[scripting_fspec, load_style] : file_specs) {
1398 switch (load_style) {
1400 llvm_unreachable(
"case already handled");
1411R
"('{0}' contains {1} debug script. To run this script in this debug session:
1413 command script import "{2}"
1415To run all discovered debug scripts in this session:
1417 settings set target.load-script-from-symbol-file true
1421 trusted ?
"a trusted" :
"an untrusted",
1422 scripting_fspec.GetPath()),
1428 LLDB_LOG(log,
"Auto-loading {0}", scripting_fspec.GetPath());
1432 LLDB_LOG(log,
"Failed to load '{0}'. Remaining scripts won't be loaded.",
1433 scripting_fspec.GetPath());
1442 std::list<Status> &errors,
1443 bool continue_on_error) {
1459 "unable to load scripting data for "
1460 "module {0} - error reported was {1}",
1461 module->GetFileSpec().GetFileNameStrippingExtension(),
1463 errors.push_back(std::move(
error));
1464 if (!continue_on_error)
1470 return errors.empty();
1478 assert(module_sp !=
nullptr);
1488 for (
const auto &module_sp :
m_modules) {
1489 assert(module_sp !=
nullptr);
1490 if (callback(*module_sp))
1499 std::scoped_lock<std::recursive_mutex, std::recursive_mutex> lock(
1515 task_group.async([module_sp] {
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
static SharedModuleListInfo & GetSharedModuleListInfo()
static bool LoadScriptingModule(const FileSpec &scripting_fspec, ScriptInterpreter &script_interpreter, Target &target, Status &error)
static SharedModuleList & GetSharedModuleList()
A section + offset based address class.
lldb::ModuleSP GetModule() const
Get accessor for the module for this address.
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
Represents a generic declaration context in a program.
A uniqued constant string class.
A class to manage flag bits.
static void ReportWarning(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report warning events.
static llvm::ThreadPoolInterface & GetThreadPool()
Shared thread pool. Use only with ThreadPoolTaskGroup.
lldb::ScriptLanguage GetScriptLanguage() const
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
const FileSpec & GetFileSpecAtIndex(size_t idx) const
Get file at index.
size_t GetSize() const
Get the number of files in the file list.
llvm::StringRef GetFileNameStrippingExtension() const
Return the filename without the extension part.
llvm::StringRef GetFilename() const
Filename string const get accessor.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
void Dump(llvm::raw_ostream &s) const
Dump this object to a Stream.
llvm::sys::TimePoint GetModificationTime(const FileSpec &file_spec) const
Returns the modification time of the given file.
Status Readlink(const FileSpec &src, FileSpec &dst)
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
A class that describes a function.
bool GetLoadSymbolOnDemand() const
bool SetClangModulesCachePath(const FileSpec &path)
lldb::SymbolDownload GetSymbolAutoDownload() const
bool GetEnableExternalLookup() const
bool SetLLDBIndexCachePath(const FileSpec &path)
bool GetEnableLLDBIndexCache() const
bool SetEnableExternalLookup(bool new_value)
FileSpec GetLLDBIndexCachePath() const
PathMappingList GetSymlinkMappings() const
lldb::SymbolSharedCacheUse GetSharedCacheBinaryLoading() const
uint64_t GetLLDBIndexCacheMaxByteSize()
PathMappingList m_symlink_paths
FileSpec GetClangModulesCachePath() const
llvm::sys::RWMutex m_symlink_paths_mutex
uint64_t GetLLDBIndexCacheMaxPercent()
void UpdateSymlinkMappings()
bool SetEnableLLDBIndexCache(bool new_value)
uint64_t GetLLDBIndexCacheExpirationDays()
virtual void NotifyModuleRemoved(const ModuleList &module_list, const lldb::ModuleSP &module_sp)=0
A collection class for Module objects.
bool ReplaceModule(const lldb::ModuleSP &old_module_sp, const lldb::ModuleSP &new_module_sp)
collection m_modules
The collection of modules.
void ClearImpl(bool use_notifier=true)
uint32_t ResolveSymbolContextsForFileSpec(const FileSpec &file_spec, uint32_t line, bool check_inlines, lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list) const
Resolve items in the symbol context for a given file and line. (const FileSpec&,...
static bool RemoveSharedModule(lldb::ModuleSP &module_sp)
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool invoke_locate_callback=true, bool invoke_symbol_locators=true)
void FindFunctions(ConstString name, lldb::FunctionNameType name_type_mask, const ModuleFunctionSearchOptions &options, SymbolContextList &sc_list) const
bool FindSourceFile(const FileSpec &orig_spec, FileSpec &new_spec) const
bool AnyOf(std::function< bool(lldb_private::Module &module)> const &callback) const
Returns true if 'callback' returns true for one of the modules in this ModuleList.
ModuleIterableNoLocking ModulesNoLocking() const
static constexpr long kUseCountModuleListOrphaned
An orphaned module that lives only in the ModuleList has a count of 1.
static bool ModuleIsInCache(const Module *module_ptr)
void FindGlobalVariables(ConstString name, size_t max_matches, VariableList &variable_list) const
Find global and static variables by name.
void Swap(ModuleList &other)
Atomically swaps the contents of this module list with other.
size_t GetIndexForModule(const Module *module) const
bool RemoveImpl(const lldb::ModuleSP &module_sp, bool use_notifier=true)
lldb::ModuleSP FindFirstModule(const ModuleSpec &module_spec) const
Finds the first module whose file specification matches module_spec.
void Clear()
Clear the object's state.
ModuleList()
Default constructor.
void Dump(Stream *s) const
Dump the description of each module contained in this list.
void FindTypes(Module *search_first, const TypeQuery &query, lldb_private::TypeResults &results) const
Find types using a type-matching object that contains all search parameters.
uint32_t ResolveSymbolContextForFilePath(const char *file_path, uint32_t line, bool check_inlines, lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list) const
Resolve items in the symbol context for a given file and line. (const char*,uint32_t,...
static bool LoadScriptingResourceInTargetForModule(Module &module, Target &target, Status &error)
lldb::ModuleSP GetModuleAtIndexUnlocked(size_t idx) const
Get the module shared pointer for the module at index idx without acquiring the ModuleList mutex.
static bool RemoveSharedModuleIfOrphaned(const lldb::ModuleWP module_ptr)
void FindCompileUnits(const FileSpec &path, SymbolContextList &sc_list) const
Find compile units by partial or full path.
void PreloadSymbols(bool parallelize) const
For each module in this ModuleList, preload its symbols.
const ModuleList & operator=(const ModuleList &rhs)
Assignment operator.
std::recursive_mutex m_modules_mutex
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
Module * GetModulePointerAtIndex(size_t idx) const
Get the module pointer for the module at index idx.
void FindSymbolsWithNameAndType(ConstString name, lldb::SymbolType symbol_type, SymbolContextList &sc_list) const
static lldb::ModuleSP FindSharedModule(const UUID &uuid)
lldb::ModuleSP FindModule(const Module *module_ptr) const
static ModuleListProperties & GetGlobalModuleListProperties()
void FindModules(const ModuleSpec &module_spec, ModuleList &matching_module_list) const
Finds modules whose file specification matches module_spec.
void FindAddressesForLine(const lldb::TargetSP target_sp, const FileSpec &file, uint32_t line, Function *function, std::vector< Address > &output_local, std::vector< Address > &output_extern)
Find addresses by file/line.
uint32_t ResolveSymbolContextForAddress(const Address &so_addr, lldb::SymbolContextItem resolve_scope, SymbolContext &sc) const
Resolve the symbol context for the given address. (const Address&,uint32_t,SymbolContext&)
bool Remove(const lldb::ModuleSP &module_sp, bool notify=true)
Remove a module from the module list.
size_t RemoveOrphans(bool mandatory)
lldb::ModuleSP GetModuleAtIndex(size_t idx) const
Get the module shared pointer for the module at index idx.
void Append(const lldb::ModuleSP &module_sp, bool notify=true)
Append a module to the module list.
static size_t RemoveOrphanSharedModules(bool mandatory)
void Destroy()
Clear the object's state.
void AppendImpl(const lldb::ModuleSP &module_sp, bool use_notifier=true)
void ReplaceEquivalent(const lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules=nullptr)
Append a module to the module list and remove any equivalent modules.
void FindFunctionSymbols(ConstString name, lldb::FunctionNameType name_type_mask, SymbolContextList &sc_list)
static void FindSharedModules(const ModuleSpec &module_spec, ModuleList &matching_module_list)
bool LoadScriptingResourcesInTarget(Target *target, std::list< Status > &errors, bool continue_on_error=true)
void FindSymbolsMatchingRegExAndType(const RegularExpression ®ex, lldb::SymbolType symbol_type, SymbolContextList &sc_list) const
bool ResolveFileAddress(lldb::addr_t vm_addr, Address &so_addr) const
size_t GetSize() const
Gets the size of the module list.
bool RemoveIfOrphaned(const lldb::ModuleWP module_ptr)
void LogUUIDAndPaths(Log *log, const char *prefix_cstr)
void ForEach(std::function< IterationAction(const lldb::ModuleSP &module_sp)> const &callback) const
Applies 'callback' to each module in this ModuleList.
FileSpec & GetPlatformFileSpec()
lldb::PlatformSP GetPlatformSP() const
ArchSpec & GetArchitecture()
FileSpec & GetSymbolFileSpec()
lldb::TargetSP GetTargetSP() const
static std::vector< LookupInfo > MakeLookupInfos(ConstString name, lldb::FunctionNameType name_type_mask, lldb::LanguageType lang_type, ConstString lookup_name_override={})
Creates a vector of lookup infos for function name resolution.
A class that describes an executable image and its associated object and symbol files.
const lldb_private::UUID & GetUUID()
Get a reference to the UUID value contained in this object.
const ArchSpec & GetArchitecture() const
Get const accessor for the module architecture.
const FileSpec & GetFileSpec() const
Get const accessor for the module file specification.
void FindTypes(const TypeQuery &query, TypeResults &results)
Find types using a type-matching object that contains all search parameters.
A plug-in interface definition class for object file parsers.
@ eTypeExecutable
A normal executable.
@ eTypeStubLibrary
A library that can be linked against but not used for execution.
static ModuleSpec LocateExecutableObjectFile(const ModuleSpec &module_spec, StatisticsMap &map)
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
virtual bool LoadScriptingModule(const char *filename, const LoadScriptOptions &options, lldb_private::Status &error, StructuredData::ObjectSP *module_sp=nullptr, FileSpec extra_search_dir={}, lldb::TargetSP loaded_into_target_sp={})
A class to count time for plugins.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
bool Success() const
Test for success condition.
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
Defines a list of symbol context objects.
uint32_t GetSize() const
Get accessor for a symbol context list size.
Defines a symbol context baton that can be handed other debug core functions.
Provides public interface for all SymbolFiles.
Debugger & GetDebugger() const
lldb::PlatformSP GetPlatform()
A class that contains all state required for type lookups.
This class tracks the state and results of a TypeQuery.
bool Done(const TypeQuery &query) const
Check if the type matching has found all of the matches that it needs.
Represents UUID's of various sizes.
std::string GetAsString(llvm::StringRef separator="-") const
#define LLDB_INVALID_INDEX32
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
@ eLoadScriptFromSymFileTrue
@ eLoadScriptFromSymFileTrusted
@ eLoadScriptFromSymFileFalse
@ eLoadScriptFromSymFileWarn
IterationAction
Useful for callbacks whose return type indicates whether to continue iteration or short-circuit.
ScriptLanguage
Script interpreter types.
std::weak_ptr< lldb_private::Module > ModuleWP
std::shared_ptr< lldb_private::Platform > PlatformSP
@ eLanguageTypeUnknown
Unknown or invalid language value.
std::shared_ptr< lldb_private::Target > TargetSP
@ eSymbolDownloadBackground
std::shared_ptr< lldb_private::Module > ModuleSP
Options used by Module::FindFunctions.
lldb::user_id_t GetID() const
Get accessor for the user ID.