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);
243 const bool elem_zero_is_executable =
244 m_modules[0]->GetObjectFile()->GetType() ==
247 if (!elem_zero_is_executable && obj &&
258 m_notifier->NotifyModuleAdded(*
this, module_sp);
273 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
274 module_sp->GetArchitecture());
276 module_sp->GetPlatformFileSpec();
281 if (test_module_sp->MatchesModuleSpec(equivalent_module_spec)) {
283 old_modules->push_back(test_module_sp);
298 if (module_sp.get() == new_module.get())
302 Append(new_module, notify);
325 collection::iterator pos, end =
m_modules.end();
326 for (pos =
m_modules.begin(); pos != end; ++pos) {
327 if (pos->get() == module_sp.get()) {
330 m_notifier->NotifyModuleRemoved(*
this, module_sp);
338ModuleList::collection::iterator
342 collection::iterator retval =
m_modules.erase(pos);
358 m_notifier->NotifyModuleUpdated(*
this, old_module_sp, new_module_sp);
363 if (
auto module_sp = module_wp.lock()) {
365 collection::iterator pos, end =
m_modules.end();
366 for (pos =
m_modules.begin(); pos != end; ++pos) {
367 if (pos->get() == module_sp.get()) {
371 if (pos->use_count() == kUseCountOrphaned) {
383 std::unique_lock<std::recursive_mutex> lock(
m_modules_mutex, std::defer_lock);
389 if (!lock.try_lock())
392 size_t remove_count = 0;
396 bool made_progress =
true;
397 while (made_progress) {
399 made_progress =
false;
400 collection::iterator pos =
m_modules.begin();
406 made_progress =
true;
417 size_t num_removed = 0;
418 collection::iterator pos, end = module_list.
m_modules.end();
419 for (pos = module_list.
m_modules.begin(); pos != end; ++pos) {
424 m_notifier->NotifyModulesRemoved(module_list);
459 FunctionNameType name_type_mask,
462 if (name_type_mask & eFunctionNameTypeAuto) {
463 std::vector<Module::LookupInfo> lookup_infos =
467 for (
const auto &lookup_info : lookup_infos) {
468 const size_t old_size = sc_list.
GetSize();
474 const size_t new_size = sc_list.
GetSize();
475 if (old_size < new_size)
476 lookup_info.Prune(sc_list, old_size);
481 module_sp->FindFunctions(name, CompilerDeclContext(), name_type_mask,
488 lldb::FunctionNameType name_type_mask,
490 if (name_type_mask & eFunctionNameTypeAuto) {
491 std::vector<Module::LookupInfo> lookup_infos =
496 for (
const auto &lookup_info : lookup_infos) {
497 const size_t old_size = sc_list.
GetSize();
499 module_sp->FindFunctionSymbols(lookup_info.GetLookupName(),
500 lookup_info.GetNameTypeMask(), sc_list);
503 const size_t new_size = sc_list.
GetSize();
505 if (old_size < new_size)
506 lookup_info.Prune(sc_list, old_size);
511 module_sp->FindFunctionSymbols(name, name_type_mask, sc_list);
521 module_sp->FindFunctions(name, options, sc_list);
528 module_sp->FindCompileUnits(path, sc_list);
545 module_sp->FindGlobalVariables(regex, max_matches, variable_list);
553 module_sp->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
561 module_sp->FindSymbolsMatchingRegExAndType(regex, symbol_type, sc_list);
568 if (module_sp->MatchesModuleSpec(module_spec))
569 matching_module_list.
Append(module_sp);
579 collection::const_iterator pos, end =
m_modules.end();
581 for (pos =
m_modules.begin(); pos != end; ++pos) {
582 if ((*pos).get() == module_ptr) {
596 collection::const_iterator pos, end =
m_modules.end();
598 for (pos =
m_modules.begin(); pos != end; ++pos) {
599 if ((*pos)->GetUUID() == uuid) {
611 if (m->GetID() == uid) {
627 if (results.
Done(query))
630 for (
const auto &module_sp :
m_modules) {
631 if (search_first != module_sp.get()) {
632 module_sp->FindTypes(query, results);
633 if (results.
Done(query))
643 if (module_sp->FindSourceFile(orig_spec, new_spec))
650 const FileSpec &file, uint32_t line,
652 std::vector<Address> &output_local,
653 std::vector<Address> &output_extern) {
656 module_sp->FindAddressesForLine(target_sp, file, line, function,
657 output_local, output_extern);
664 collection::const_iterator pos, end =
m_modules.end();
665 for (pos =
m_modules.begin(); pos != end; ++pos) {
667 if (module_sp->MatchesModuleSpec(module_spec))
689 if (log !=
nullptr) {
691 collection::const_iterator pos, begin =
m_modules.begin(),
693 for (pos = begin; pos != end; ++pos) {
694 Module *module = pos->get();
695 const FileSpec &module_file_spec =
module->GetFileSpec();
696 LLDB_LOGF(log,
"%s[%u] %s (%s) \"%s\"", prefix_cstr ? prefix_cstr :
"",
697 (uint32_t)std::distance(begin, pos),
700 module_file_spec.
GetPath().c_str());
709 if (module_sp->ResolveFileAddress(vm_addr, so_addr))
718 SymbolContextItem resolve_scope,
721 uint32_t resolved_flags = 0;
725 module_sp->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
728 collection::const_iterator pos, end =
m_modules.end();
729 for (pos =
m_modules.begin(); pos != end; ++pos) {
731 (*pos)->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
732 if (resolved_flags != 0)
737 return resolved_flags;
741 const char *file_path, uint32_t line,
bool check_inlines,
745 resolve_scope, sc_list);
749 const FileSpec &file_spec, uint32_t line,
bool check_inlines,
753 module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
754 resolve_scope, sc_list);
763 collection::const_iterator pos;
764 collection::const_iterator begin =
m_modules.begin();
765 collection::const_iterator end =
m_modules.end();
766 for (pos = begin; pos != end; ++pos) {
767 if ((*pos).get() == module)
768 return std::distance(begin, pos);
777class SharedModuleList {
781 void FindModules(
const ModuleSpec &module_spec,
783 std::lock_guard<std::recursive_mutex> guard(GetMutex());
786 FindModulesInMap(module_spec, matching_module_list);
787 if (!matching_module_list.
IsEmpty())
789 m_list.FindModules(module_spec, matching_module_list);
794 assert((matching_module_list.
IsEmpty() ||
800 "Search by name not found in SharedModuleList's map");
805 std::lock_guard<std::recursive_mutex> guard(GetMutex());
806 if (
ModuleSP result = FindModuleInMap(module))
808 return m_list.FindModule(&module);
812 ModuleSP FindModule(
const UUID &uuid)
const {
813 return m_list.FindModule(uuid);
816 void Append(
const ModuleSP &module_sp,
bool use_notifier) {
819 std::lock_guard<std::recursive_mutex> guard(GetMutex());
820 m_list.Append(module_sp, use_notifier);
824 size_t RemoveOrphans(
bool mandatory) {
825 std::unique_lock<std::recursive_mutex> lock(GetMutex(), std::defer_lock);
829 if (!lock.try_lock())
832 size_t total_count = 0;
838 run_count = RemoveOrphansFromMapAndList();
839 run_count += m_list.RemoveOrphans(mandatory);
840 total_count += run_count;
843 }
while (run_count != 0);
848 bool Remove(
const ModuleSP &module_sp,
bool use_notifier =
true) {
851 std::lock_guard<std::recursive_mutex> guard(GetMutex());
852 RemoveFromMap(module_sp);
853 return m_list.Remove(module_sp, use_notifier);
856 void ReplaceEquivalent(
const ModuleSP &module_sp,
857 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules) {
858 std::lock_guard<std::recursive_mutex> guard(GetMutex());
859 m_list.ReplaceEquivalent(module_sp, old_modules);
860 ReplaceEquivalentInMap(module_sp);
863 bool RemoveIfOrphaned(
const ModuleWP module_wp) {
864 std::lock_guard<std::recursive_mutex> guard(GetMutex());
865 RemoveFromMap(module_wp,
true);
866 return m_list.RemoveIfOrphaned(module_wp);
869 std::recursive_mutex &GetMutex()
const {
return m_list.GetMutex(); }
875 ConstString name =
module.GetFileSpec().GetFilename();
876 auto it = m_name_to_modules.find(name);
877 if (it == m_name_to_modules.end())
879 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
880 for (
const ModuleSP &module_sp : vector) {
881 if (module_sp.get() == &module)
887 void FindModulesInMap(
const ModuleSpec &module_spec,
888 ModuleList &matching_module_list)
const {
890 if (it == m_name_to_modules.end())
892 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
893 for (
const ModuleSP &module_sp : vector) {
894 if (module_sp->MatchesModuleSpec(module_spec))
895 matching_module_list.
Append(module_sp);
899 void AddToMap(
const ModuleSP &module_sp) {
900 ConstString name = module_sp->GetFileSpec().GetFilename();
903 m_name_to_modules[name].push_back(module_sp);
906 void RemoveFromMap(
const ModuleWP module_wp,
bool if_orphaned =
false) {
907 if (
auto module_sp = module_wp.lock()) {
908 ConstString name = module_sp->GetFileSpec().GetFilename();
909 if (!m_name_to_modules.contains(name))
911 llvm::SmallVectorImpl<ModuleSP> &vec = m_name_to_modules[name];
912 for (
auto *it = vec.begin(); it != vec.end(); ++it) {
913 if (it->get() == module_sp.get()) {
916 constexpr long kUseCountOrphaned =
917 kUseCountSharedModuleListOrphaned + 1;
918 if (!if_orphaned || it->use_count() == kUseCountOrphaned) {
927 void ReplaceEquivalentInMap(
const ModuleSP &module_sp) {
928 RemoveEquivalentModulesFromMap(module_sp);
932 void RemoveEquivalentModulesFromMap(
const ModuleSP &module_sp) {
933 ConstString name = module_sp->GetFileSpec().GetFilename();
937 auto it = m_name_to_modules.find(name);
938 if (it == m_name_to_modules.end())
943 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
944 module_sp->GetArchitecture());
945 equivalent_module_spec.GetPlatformFileSpec() =
946 module_sp->GetPlatformFileSpec();
948 llvm::SmallVectorImpl<ModuleSP> &vec = it->second;
949 llvm::erase_if(vec, [&equivalent_module_spec](
ModuleSP &element) {
950 return element->MatchesModuleSpec(equivalent_module_spec);
955 ModuleList RemoveOrphansFromVector(llvm::SmallVectorImpl<ModuleSP> &vec) {
958 auto *to_remove_start = llvm::remove_if(vec, [](
const ModuleSP &module) {
959 return module.use_count() == kUseCountSharedModuleListOrphaned;
962 ModuleList to_remove;
963 for (
ModuleSP *it = to_remove_start; it != vec.end(); ++it)
964 to_remove.Append(*it);
966 vec.erase(to_remove_start, vec.end());
974 int RemoveOrphansFromMapAndList() {
978 int remove_count = 0;
979 int previous_remove_count;
981 previous_remove_count = remove_count;
982 for (
auto &[name, vec] : m_name_to_modules) {
985 ModuleList to_remove = RemoveOrphansFromVector(vec);
986 remove_count += to_remove.
GetSize();
987 m_list.Remove(to_remove);
990 }
while (previous_remove_count != remove_count);
999 llvm::DenseMap<ConstString, llvm::SmallVector<ModuleSP, 1>> m_name_to_modules;
1002 static constexpr long kUseCountSharedModuleListOrphaned = 2;
1005struct SharedModuleListInfo {
1006 SharedModuleList module_list;
1007 ModuleListProperties module_list_properties;
1012 static SharedModuleListInfo *g_shared_module_list_info =
nullptr;
1013 static llvm::once_flag g_once_flag;
1014 llvm::call_once(g_once_flag, []() {
1018 if (g_shared_module_list_info ==
nullptr)
1019 g_shared_module_list_info =
new SharedModuleListInfo();
1021 return *g_shared_module_list_info;
1035 return shared_module_list.FindModule(*module_ptr).get() !=
nullptr;
1056 bool *did_create_ptr,
bool invoke_locate_callback) {
1058 std::lock_guard<std::recursive_mutex> guard(shared_module_list.GetMutex());
1066 *did_create_ptr =
false;
1077 shared_module_list.FindModules(module_spec, matching_module_list);
1078 const size_t num_matching_modules = matching_module_list.
GetSize();
1080 if (num_matching_modules > 0) {
1081 for (
size_t module_idx = 0; module_idx < num_matching_modules;
1086 if (module_sp->FileHasChanged()) {
1088 old_modules->push_back(module_sp);
1093 log,
"%p '%s' module changed: removing from global module list",
1094 static_cast<void *
>(module_sp.get()),
1095 module_sp->GetFileSpec().GetFilename().GetCString());
1097 shared_module_list.Remove(module_sp);
1115 if (invoke_locate_callback) {
1118 if (target_sp->IsValid())
1119 platform_sp = target_sp->GetPlatform();
1126 platform_sp->CallLocateModuleCallbackIfSet(
1127 module_spec, module_sp, symbol_file_spec, did_create_ptr);
1135 module_sp = std::make_shared<Module>(module_spec);
1139 if (module_sp->GetObjectFile()) {
1142 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1145 if (module_sp->GetObjectFile() &&
1146 module_sp->GetObjectFile()->GetType() ==
1150 if (did_create_ptr) {
1151 *did_create_ptr =
true;
1154 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1166 module_search_paths = target_sp->GetExecutableSearchPaths();
1168 if (!module_search_paths.
IsEmpty()) {
1169 const auto num_directories = module_search_paths.
GetSize();
1170 for (
size_t idx = 0; idx < num_directories; ++idx) {
1173 namespace fs = llvm::sys::fs;
1176 search_path_spec.AppendPathComponent(
1181 auto resolved_module_spec(module_spec);
1182 resolved_module_spec.GetFileSpec() = search_path_spec;
1183 module_sp = std::make_shared<Module>(resolved_module_spec);
1184 if (module_sp->GetObjectFile()) {
1187 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1190 if (module_sp->GetObjectFile()->GetType() ==
1195 *did_create_ptr =
true;
1197 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1216 module_spec, symbol_locator_map);
1219 if (located_binary_modulespec.
GetFileSpec() != module_file_spec) {
1223 if (path[0] ==
'\0')
1224 module_file_spec.
GetPath(path,
sizeof(path));
1229 std::string uuid_str;
1230 if (uuid_ptr && uuid_ptr->
IsValid())
1234 if (!uuid_str.empty())
1236 "'%s' does not contain the %s architecture and UUID %s", path,
1240 "'%s' does not contain the %s architecture.", path,
1254 ModuleSpec platform_module_spec(module_spec);
1262 shared_module_list.FindModules(platform_module_spec, matching_module_list);
1263 if (!matching_module_list.
IsEmpty()) {
1268 if (platform_module_spec.
GetUUIDPtr() ==
nullptr) {
1271 if (file_spec_mod_time != llvm::sys::TimePoint<>()) {
1272 if (file_spec_mod_time != module_sp->GetModificationTime()) {
1274 old_modules->push_back(module_sp);
1275 shared_module_list.Remove(module_sp);
1283 module_sp = std::make_shared<Module>(platform_module_spec);
1288 if (module_sp && module_sp->GetObjectFile()) {
1289 module_sp->GetSymbolLocatorStatistics().merge(symbol_locator_map);
1290 if (module_sp->GetObjectFile()->GetType() ==
1295 *did_create_ptr =
true;
1297 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1305 "unable to open %s architecture in '%s'",
1311 std::string uuid_str;
1312 if (uuid_ptr && uuid_ptr->
IsValid())
1315 if (!uuid_str.empty())
1317 "cannot locate a module for UUID '%s'", uuid_str.c_str());
1337 std::list<Status> &errors,
1339 bool continue_on_error) {
1352 if (!module->LoadScriptingResourceInTarget(target,
error,
1356 "unable to load scripting data for "
1357 "module %s - error reported was %s",
1358 module->GetFileSpec()
1359 .GetFileNameStrippingExtension()
1362 errors.push_back(std::move(
error));
1363 if (!continue_on_error)
1369 return errors.empty();
1376 for (
const auto &module_sp :
m_modules) {
1377 assert(module_sp !=
nullptr);
1387 for (
const auto &module_sp :
m_modules) {
1388 assert(module_sp !=
nullptr);
1389 if (callback(*module_sp))
1399 std::scoped_lock<std::recursive_mutex, std::recursive_mutex> lock(
1409 module_sp->PreloadSymbols();
1415 task_group.async([module_sp] {
1417 module_sp->PreloadSymbols();
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
static SharedModuleListInfo & GetSharedModuleListInfo()
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.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
static llvm::ThreadPoolInterface & GetThreadPool()
Shared thread pool. Use only with ThreadPoolTaskGroup.
const FileSpec & GetFileSpecAtIndex(size_t idx) const
Get file at index.
size_t GetSize() const
Get the number of files in the file list.
const ConstString & 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.
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)
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.
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)
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,...
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)
bool LoadScriptingResourcesInTarget(Target *target, std::list< Status > &errors, Stream &feedback_stream, bool continue_on_error=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)
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
A class to count time for plugins.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Success() const
Test for success condition.
A stream class that can stream formatted output to a file.
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.
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.
IterationAction
Useful for callbacks whose return type indicates whether to continue iteration or short-circuit.
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.