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 = ePropertyClangModulesCachePath;
127 const uint32_t idx = ePropertyClangModulesCachePath;
132 const uint32_t idx = ePropertyLLDBIndexCachePath;
137 const uint32_t idx = ePropertyLLDBIndexCachePath;
142 const uint32_t idx = ePropertyEnableLLDBIndexCache;
144 idx, g_modulelist_properties[idx].default_uint_value != 0);
152 const uint32_t idx = ePropertyLLDBIndexCacheMaxByteSize;
154 idx, g_modulelist_properties[idx].default_uint_value);
158 const uint32_t idx = ePropertyLLDBIndexCacheMaxPercent;
160 idx, g_modulelist_properties[idx].default_uint_value);
164 const uint32_t idx = ePropertyLLDBIndexCacheExpirationDays;
166 idx, g_modulelist_properties[idx].default_uint_value);
173 const bool notify =
false;
175 for (
auto symlink : list) {
189 const uint32_t idx = ePropertyLoadSymbolOnDemand;
191 idx, g_modulelist_properties[idx].default_uint_value != 0);
236 const bool elem_zero_is_executable =
237 m_modules[0]->GetObjectFile()->GetType() ==
240 if (!elem_zero_is_executable && obj &&
251 m_notifier->NotifyModuleAdded(*
this, module_sp);
266 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
267 module_sp->GetArchitecture());
269 module_sp->GetPlatformFileSpec();
274 if (test_module_sp->MatchesModuleSpec(equivalent_module_spec)) {
276 old_modules->push_back(test_module_sp);
291 if (module_sp.get() == new_module.get())
295 Append(new_module, notify);
318 collection::iterator pos, end =
m_modules.end();
319 for (pos =
m_modules.begin(); pos != end; ++pos) {
320 if (pos->get() == module_sp.get()) {
323 m_notifier->NotifyModuleRemoved(*
this, module_sp);
331ModuleList::collection::iterator
335 collection::iterator retval =
m_modules.erase(pos);
351 m_notifier->NotifyModuleUpdated(*
this, old_module_sp, new_module_sp);
356 if (
auto module_sp = module_wp.lock()) {
358 collection::iterator pos, end =
m_modules.end();
359 for (pos =
m_modules.begin(); pos != end; ++pos) {
360 if (pos->get() == module_sp.get()) {
364 if (pos->use_count() == kUseCountOrphaned) {
376 std::unique_lock<std::recursive_mutex> lock(
m_modules_mutex, std::defer_lock);
382 if (!lock.try_lock())
385 size_t remove_count = 0;
389 bool made_progress =
true;
390 while (made_progress) {
392 made_progress =
false;
393 collection::iterator pos =
m_modules.begin();
399 made_progress =
true;
410 size_t num_removed = 0;
411 collection::iterator pos, end = module_list.
m_modules.end();
412 for (pos = module_list.
m_modules.begin(); pos != end; ++pos) {
417 m_notifier->NotifyModulesRemoved(module_list);
452 FunctionNameType name_type_mask,
455 if (name_type_mask & eFunctionNameTypeAuto) {
456 std::vector<Module::LookupInfo> lookup_infos =
460 for (
const auto &lookup_info : lookup_infos) {
461 const size_t old_size = sc_list.
GetSize();
467 const size_t new_size = sc_list.
GetSize();
468 if (old_size < new_size)
469 lookup_info.Prune(sc_list, old_size);
474 module_sp->FindFunctions(name, CompilerDeclContext(), name_type_mask,
481 lldb::FunctionNameType name_type_mask,
483 if (name_type_mask & eFunctionNameTypeAuto) {
484 std::vector<Module::LookupInfo> lookup_infos =
489 for (
const auto &lookup_info : lookup_infos) {
490 const size_t old_size = sc_list.
GetSize();
492 module_sp->FindFunctionSymbols(lookup_info.GetLookupName(),
493 lookup_info.GetNameTypeMask(), sc_list);
496 const size_t new_size = sc_list.
GetSize();
498 if (old_size < new_size)
499 lookup_info.Prune(sc_list, old_size);
504 module_sp->FindFunctionSymbols(name, name_type_mask, sc_list);
514 module_sp->FindFunctions(name, options, sc_list);
521 module_sp->FindCompileUnits(path, sc_list);
538 module_sp->FindGlobalVariables(regex, max_matches, variable_list);
546 module_sp->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
554 module_sp->FindSymbolsMatchingRegExAndType(regex, symbol_type, sc_list);
561 if (module_sp->MatchesModuleSpec(module_spec))
562 matching_module_list.
Append(module_sp);
572 collection::const_iterator pos, end =
m_modules.end();
574 for (pos =
m_modules.begin(); pos != end; ++pos) {
575 if ((*pos).get() == module_ptr) {
589 collection::const_iterator pos, end =
m_modules.end();
591 for (pos =
m_modules.begin(); pos != end; ++pos) {
592 if ((*pos)->GetUUID() == uuid) {
604 if (m->GetID() == uid) {
620 if (results.
Done(query))
623 for (
const auto &module_sp :
m_modules) {
624 if (search_first != module_sp.get()) {
625 module_sp->FindTypes(query, results);
626 if (results.
Done(query))
636 if (module_sp->FindSourceFile(orig_spec, new_spec))
643 const FileSpec &file, uint32_t line,
645 std::vector<Address> &output_local,
646 std::vector<Address> &output_extern) {
649 module_sp->FindAddressesForLine(target_sp, file, line, function,
650 output_local, output_extern);
657 collection::const_iterator pos, end =
m_modules.end();
658 for (pos =
m_modules.begin(); pos != end; ++pos) {
660 if (module_sp->MatchesModuleSpec(module_spec))
682 if (log !=
nullptr) {
684 collection::const_iterator pos, begin =
m_modules.begin(),
686 for (pos = begin; pos != end; ++pos) {
687 Module *module = pos->get();
688 const FileSpec &module_file_spec =
module->GetFileSpec();
689 LLDB_LOGF(log,
"%s[%u] %s (%s) \"%s\"", prefix_cstr ? prefix_cstr :
"",
690 (uint32_t)std::distance(begin, pos),
693 module_file_spec.
GetPath().c_str());
702 if (module_sp->ResolveFileAddress(vm_addr, so_addr))
711 SymbolContextItem resolve_scope,
714 uint32_t resolved_flags = 0;
718 module_sp->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
721 collection::const_iterator pos, end =
m_modules.end();
722 for (pos =
m_modules.begin(); pos != end; ++pos) {
724 (*pos)->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
725 if (resolved_flags != 0)
730 return resolved_flags;
734 const char *file_path, uint32_t line,
bool check_inlines,
738 resolve_scope, sc_list);
742 const FileSpec &file_spec, uint32_t line,
bool check_inlines,
746 module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
747 resolve_scope, sc_list);
756 collection::const_iterator pos;
757 collection::const_iterator begin =
m_modules.begin();
758 collection::const_iterator end =
m_modules.end();
759 for (pos = begin; pos != end; ++pos) {
760 if ((*pos).get() == module)
761 return std::distance(begin, pos);
770class SharedModuleList {
774 void FindModules(
const ModuleSpec &module_spec,
776 std::lock_guard<std::recursive_mutex> guard(GetMutex());
779 FindModulesInMap(module_spec, matching_module_list);
780 if (!matching_module_list.
IsEmpty())
782 m_list.FindModules(module_spec, matching_module_list);
787 assert((matching_module_list.
IsEmpty() ||
793 "Search by name not found in SharedModuleList's map");
798 std::lock_guard<std::recursive_mutex> guard(GetMutex());
799 if (
ModuleSP result = FindModuleInMap(module))
801 return m_list.FindModule(&module);
805 ModuleSP FindModule(
const UUID &uuid)
const {
806 return m_list.FindModule(uuid);
809 void Append(
const ModuleSP &module_sp,
bool use_notifier) {
812 std::lock_guard<std::recursive_mutex> guard(GetMutex());
813 m_list.Append(module_sp, use_notifier);
817 size_t RemoveOrphans(
bool mandatory) {
818 std::unique_lock<std::recursive_mutex> lock(GetMutex(), std::defer_lock);
822 if (!lock.try_lock())
825 size_t total_count = 0;
831 run_count = RemoveOrphansFromMapAndList();
832 run_count += m_list.RemoveOrphans(mandatory);
833 total_count += run_count;
836 }
while (run_count != 0);
841 bool Remove(
const ModuleSP &module_sp,
bool use_notifier =
true) {
844 std::lock_guard<std::recursive_mutex> guard(GetMutex());
845 RemoveFromMap(module_sp);
846 return m_list.Remove(module_sp, use_notifier);
849 void ReplaceEquivalent(
const ModuleSP &module_sp,
850 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules) {
851 std::lock_guard<std::recursive_mutex> guard(GetMutex());
852 m_list.ReplaceEquivalent(module_sp, old_modules);
853 ReplaceEquivalentInMap(module_sp);
856 bool RemoveIfOrphaned(
const ModuleWP module_wp) {
857 std::lock_guard<std::recursive_mutex> guard(GetMutex());
858 RemoveFromMap(module_wp,
true);
859 return m_list.RemoveIfOrphaned(module_wp);
862 std::recursive_mutex &GetMutex()
const {
return m_list.GetMutex(); }
868 ConstString name =
module.GetFileSpec().GetFilename();
869 auto it = m_name_to_modules.find(name);
870 if (it == m_name_to_modules.end())
872 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
873 for (
const ModuleSP &module_sp : vector) {
874 if (module_sp.get() == &module)
880 void FindModulesInMap(
const ModuleSpec &module_spec,
881 ModuleList &matching_module_list)
const {
883 if (it == m_name_to_modules.end())
885 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
886 for (
const ModuleSP &module_sp : vector) {
887 if (module_sp->MatchesModuleSpec(module_spec))
888 matching_module_list.
Append(module_sp);
892 void AddToMap(
const ModuleSP &module_sp) {
893 ConstString name = module_sp->GetFileSpec().GetFilename();
896 m_name_to_modules[name].push_back(module_sp);
899 void RemoveFromMap(
const ModuleWP module_wp,
bool if_orphaned =
false) {
900 if (
auto module_sp = module_wp.lock()) {
901 ConstString name = module_sp->GetFileSpec().GetFilename();
902 if (!m_name_to_modules.contains(name))
904 llvm::SmallVectorImpl<ModuleSP> &vec = m_name_to_modules[name];
905 for (
auto *it = vec.begin(); it != vec.end(); ++it) {
906 if (it->get() == module_sp.get()) {
909 constexpr long kUseCountOrphaned =
910 kUseCountSharedModuleListOrphaned + 1;
911 if (!if_orphaned || it->use_count() == kUseCountOrphaned) {
920 void ReplaceEquivalentInMap(
const ModuleSP &module_sp) {
921 RemoveEquivalentModulesFromMap(module_sp);
925 void RemoveEquivalentModulesFromMap(
const ModuleSP &module_sp) {
926 ConstString name = module_sp->GetFileSpec().GetFilename();
930 auto it = m_name_to_modules.find(name);
931 if (it == m_name_to_modules.end())
936 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
937 module_sp->GetArchitecture());
938 equivalent_module_spec.GetPlatformFileSpec() =
939 module_sp->GetPlatformFileSpec();
941 llvm::SmallVectorImpl<ModuleSP> &vec = it->second;
942 llvm::erase_if(vec, [&equivalent_module_spec](
ModuleSP &element) {
943 return element->MatchesModuleSpec(equivalent_module_spec);
948 ModuleList RemoveOrphansFromVector(llvm::SmallVectorImpl<ModuleSP> &vec) {
951 auto *to_remove_start = llvm::remove_if(vec, [](
const ModuleSP &module) {
952 return module.use_count() == kUseCountSharedModuleListOrphaned;
955 ModuleList to_remove;
956 for (
ModuleSP *it = to_remove_start; it != vec.end(); ++it)
957 to_remove.Append(*it);
959 vec.erase(to_remove_start, vec.end());
967 int RemoveOrphansFromMapAndList() {
971 int remove_count = 0;
972 int previous_remove_count;
974 previous_remove_count = remove_count;
975 for (
auto &[name, vec] : m_name_to_modules) {
978 ModuleList to_remove = RemoveOrphansFromVector(vec);
979 remove_count += to_remove.
GetSize();
980 m_list.Remove(to_remove);
983 }
while (previous_remove_count != remove_count);
992 llvm::DenseMap<ConstString, llvm::SmallVector<ModuleSP, 1>> m_name_to_modules;
995 static constexpr long kUseCountSharedModuleListOrphaned = 2;
998struct SharedModuleListInfo {
999 SharedModuleList module_list;
1000 ModuleListProperties module_list_properties;
1005 static SharedModuleListInfo *g_shared_module_list_info =
nullptr;
1006 static llvm::once_flag g_once_flag;
1007 llvm::call_once(g_once_flag, []() {
1011 if (g_shared_module_list_info ==
nullptr)
1012 g_shared_module_list_info =
new SharedModuleListInfo();
1014 return *g_shared_module_list_info;
1028 return shared_module_list.FindModule(*module_ptr).get() !=
nullptr;
1049 bool *did_create_ptr,
bool invoke_locate_callback) {
1051 std::lock_guard<std::recursive_mutex> guard(shared_module_list.GetMutex());
1059 *did_create_ptr =
false;
1070 shared_module_list.FindModules(module_spec, matching_module_list);
1071 const size_t num_matching_modules = matching_module_list.
GetSize();
1073 if (num_matching_modules > 0) {
1074 for (
size_t module_idx = 0; module_idx < num_matching_modules;
1079 if (module_sp->FileHasChanged()) {
1081 old_modules->push_back(module_sp);
1086 log,
"%p '%s' module changed: removing from global module list",
1087 static_cast<void *
>(module_sp.get()),
1088 module_sp->GetFileSpec().GetFilename().GetCString());
1090 shared_module_list.Remove(module_sp);
1108 if (invoke_locate_callback) {
1111 if (target_sp->IsValid())
1112 platform_sp = target_sp->GetPlatform();
1119 platform_sp->CallLocateModuleCallbackIfSet(
1120 module_spec, module_sp, symbol_file_spec, did_create_ptr);
1128 module_sp = std::make_shared<Module>(module_spec);
1132 if (module_sp->GetObjectFile()) {
1135 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1138 if (module_sp->GetObjectFile() &&
1139 module_sp->GetObjectFile()->GetType() ==
1143 if (did_create_ptr) {
1144 *did_create_ptr =
true;
1147 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1159 module_search_paths = target_sp->GetExecutableSearchPaths();
1161 if (!module_search_paths.
IsEmpty()) {
1162 const auto num_directories = module_search_paths.
GetSize();
1163 for (
size_t idx = 0; idx < num_directories; ++idx) {
1166 namespace fs = llvm::sys::fs;
1169 search_path_spec.AppendPathComponent(
1174 auto resolved_module_spec(module_spec);
1175 resolved_module_spec.GetFileSpec() = search_path_spec;
1176 module_sp = std::make_shared<Module>(resolved_module_spec);
1177 if (module_sp->GetObjectFile()) {
1180 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1183 if (module_sp->GetObjectFile()->GetType() ==
1188 *did_create_ptr =
true;
1190 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1209 module_spec, symbol_locator_map);
1212 if (located_binary_modulespec.
GetFileSpec() != module_file_spec) {
1216 if (path[0] ==
'\0')
1217 module_file_spec.
GetPath(path,
sizeof(path));
1222 std::string uuid_str;
1223 if (uuid_ptr && uuid_ptr->
IsValid())
1227 if (!uuid_str.empty())
1229 "'%s' does not contain the %s architecture and UUID %s", path,
1233 "'%s' does not contain the %s architecture.", path,
1247 ModuleSpec platform_module_spec(module_spec);
1255 shared_module_list.FindModules(platform_module_spec, matching_module_list);
1256 if (!matching_module_list.
IsEmpty()) {
1261 if (platform_module_spec.
GetUUIDPtr() ==
nullptr) {
1264 if (file_spec_mod_time != llvm::sys::TimePoint<>()) {
1265 if (file_spec_mod_time != module_sp->GetModificationTime()) {
1267 old_modules->push_back(module_sp);
1268 shared_module_list.Remove(module_sp);
1276 module_sp = std::make_shared<Module>(platform_module_spec);
1281 if (module_sp && module_sp->GetObjectFile()) {
1282 module_sp->GetSymbolLocatorStatistics().merge(symbol_locator_map);
1283 if (module_sp->GetObjectFile()->GetType() ==
1288 *did_create_ptr =
true;
1290 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1298 "unable to open %s architecture in '%s'",
1304 std::string uuid_str;
1305 if (uuid_ptr && uuid_ptr->
IsValid())
1308 if (!uuid_str.empty())
1310 "cannot locate a module for UUID '%s'", uuid_str.c_str());
1330 std::list<Status> &errors,
1332 bool continue_on_error) {
1345 if (!module->LoadScriptingResourceInTarget(target,
error,
1349 "unable to load scripting data for "
1350 "module %s - error reported was %s",
1351 module->GetFileSpec()
1352 .GetFileNameStrippingExtension()
1355 errors.push_back(std::move(
error));
1356 if (!continue_on_error)
1362 return errors.empty();
1369 for (
const auto &module_sp :
m_modules) {
1370 assert(module_sp !=
nullptr);
1380 for (
const auto &module_sp :
m_modules) {
1381 assert(module_sp !=
nullptr);
1382 if (callback(*module_sp))
1392 std::scoped_lock<std::recursive_mutex, std::recursive_mutex> lock(
1402 module_sp->PreloadSymbols();
1408 task_group.async([module_sp] {
1410 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
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.