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");
102 const uint32_t idx = ePropertyEnableExternalLookup;
104 idx, g_modulelist_properties[idx].default_uint_value != 0);
116 const uint32_t idx = ePropertyAutoDownload;
119 g_modulelist_properties[idx].default_uint_value));
123 const uint32_t idx = ePropertyClangModulesCachePath;
128 const uint32_t idx = ePropertyClangModulesCachePath;
133 const uint32_t idx = ePropertyLLDBIndexCachePath;
138 const uint32_t idx = ePropertyLLDBIndexCachePath;
143 const uint32_t idx = ePropertyEnableLLDBIndexCache;
145 idx, g_modulelist_properties[idx].default_uint_value != 0);
153 const uint32_t idx = ePropertyLLDBIndexCacheMaxByteSize;
155 idx, g_modulelist_properties[idx].default_uint_value);
159 const uint32_t idx = ePropertyLLDBIndexCacheMaxPercent;
161 idx, g_modulelist_properties[idx].default_uint_value);
165 const uint32_t idx = ePropertyLLDBIndexCacheExpirationDays;
167 idx, g_modulelist_properties[idx].default_uint_value);
174 const bool notify =
false;
176 for (
auto symlink : list) {
190 const uint32_t idx = ePropertyLoadSymbolOnDemand;
192 idx, g_modulelist_properties[idx].default_uint_value != 0);
237 const bool elem_zero_is_executable =
238 m_modules[0]->GetObjectFile()->GetType() ==
241 if (!elem_zero_is_executable && obj &&
252 m_notifier->NotifyModuleAdded(*
this, module_sp);
267 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
268 module_sp->GetArchitecture());
270 module_sp->GetPlatformFileSpec();
275 if (test_module_sp->MatchesModuleSpec(equivalent_module_spec)) {
277 old_modules->push_back(test_module_sp);
292 if (module_sp.get() == new_module.get())
296 Append(new_module, notify);
319 collection::iterator pos, end =
m_modules.end();
320 for (pos =
m_modules.begin(); pos != end; ++pos) {
321 if (pos->get() == module_sp.get()) {
324 m_notifier->NotifyModuleRemoved(*
this, module_sp);
332ModuleList::collection::iterator
336 collection::iterator retval =
m_modules.erase(pos);
352 m_notifier->NotifyModuleUpdated(*
this, old_module_sp, new_module_sp);
357 if (
auto module_sp = module_wp.lock()) {
359 collection::iterator pos, end =
m_modules.end();
360 for (pos =
m_modules.begin(); pos != end; ++pos) {
361 if (pos->get() == module_sp.get()) {
365 if (pos->use_count() == kUseCountOrphaned) {
377 std::unique_lock<std::recursive_mutex> lock(
m_modules_mutex, std::defer_lock);
383 if (!lock.try_lock())
386 size_t remove_count = 0;
390 bool made_progress =
true;
391 while (made_progress) {
393 made_progress =
false;
394 collection::iterator pos =
m_modules.begin();
400 made_progress =
true;
411 size_t num_removed = 0;
412 collection::iterator pos, end = module_list.
m_modules.end();
413 for (pos = module_list.
m_modules.begin(); pos != end; ++pos) {
418 m_notifier->NotifyModulesRemoved(module_list);
453 FunctionNameType name_type_mask,
456 const size_t old_size = sc_list.
GetSize();
458 if (name_type_mask & eFunctionNameTypeAuto) {
467 const size_t new_size = sc_list.
GetSize();
469 if (old_size < new_size)
470 lookup_info.Prune(sc_list, old_size);
474 module_sp->FindFunctions(name, CompilerDeclContext(), name_type_mask,
481 lldb::FunctionNameType name_type_mask,
483 const size_t old_size = sc_list.
GetSize();
485 if (name_type_mask & eFunctionNameTypeAuto) {
494 const size_t new_size = sc_list.
GetSize();
496 if (old_size < new_size)
497 lookup_info.
Prune(sc_list, old_size);
501 module_sp->FindFunctionSymbols(name, name_type_mask, sc_list);
511 module_sp->FindFunctions(name, options, sc_list);
518 module_sp->FindCompileUnits(path, sc_list);
535 module_sp->FindGlobalVariables(regex, max_matches, variable_list);
543 module_sp->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
551 module_sp->FindSymbolsMatchingRegExAndType(regex, symbol_type, sc_list);
558 if (module_sp->MatchesModuleSpec(module_spec))
559 matching_module_list.
Append(module_sp);
569 collection::const_iterator pos, end =
m_modules.end();
571 for (pos =
m_modules.begin(); pos != end; ++pos) {
572 if ((*pos).get() == module_ptr) {
586 collection::const_iterator pos, end =
m_modules.end();
588 for (pos =
m_modules.begin(); pos != end; ++pos) {
589 if ((*pos)->GetUUID() == uuid) {
601 if (m->GetID() == uid) {
617 if (results.
Done(query))
620 for (
const auto &module_sp :
m_modules) {
621 if (search_first != module_sp.get()) {
622 module_sp->FindTypes(query, results);
623 if (results.
Done(query))
633 if (module_sp->FindSourceFile(orig_spec, new_spec))
640 const FileSpec &file, uint32_t line,
642 std::vector<Address> &output_local,
643 std::vector<Address> &output_extern) {
646 module_sp->FindAddressesForLine(target_sp, file, line, function,
647 output_local, output_extern);
654 collection::const_iterator pos, end =
m_modules.end();
655 for (pos =
m_modules.begin(); pos != end; ++pos) {
657 if (module_sp->MatchesModuleSpec(module_spec))
679 if (log !=
nullptr) {
681 collection::const_iterator pos, begin =
m_modules.begin(),
683 for (pos = begin; pos != end; ++pos) {
684 Module *module = pos->get();
685 const FileSpec &module_file_spec =
module->GetFileSpec();
686 LLDB_LOGF(log,
"%s[%u] %s (%s) \"%s\"", prefix_cstr ? prefix_cstr :
"",
687 (uint32_t)std::distance(begin, pos),
690 module_file_spec.
GetPath().c_str());
699 if (module_sp->ResolveFileAddress(vm_addr, so_addr))
708 SymbolContextItem resolve_scope,
711 uint32_t resolved_flags = 0;
715 module_sp->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
718 collection::const_iterator pos, end =
m_modules.end();
719 for (pos =
m_modules.begin(); pos != end; ++pos) {
721 (*pos)->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
722 if (resolved_flags != 0)
727 return resolved_flags;
731 const char *file_path, uint32_t line,
bool check_inlines,
735 resolve_scope, sc_list);
739 const FileSpec &file_spec, uint32_t line,
bool check_inlines,
743 module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
744 resolve_scope, sc_list);
753 collection::const_iterator pos;
754 collection::const_iterator begin =
m_modules.begin();
755 collection::const_iterator end =
m_modules.end();
756 for (pos = begin; pos != end; ++pos) {
757 if ((*pos).get() == module)
758 return std::distance(begin, pos);
767class SharedModuleList {
771 void FindModules(
const ModuleSpec &module_spec,
773 std::lock_guard<std::recursive_mutex> guard(GetMutex());
776 FindModulesInMap(module_spec, matching_module_list);
777 if (!matching_module_list.
IsEmpty())
779 m_list.FindModules(module_spec, matching_module_list);
784 assert((matching_module_list.
IsEmpty() ||
790 "Search by name not found in SharedModuleList's map");
795 std::lock_guard<std::recursive_mutex> guard(GetMutex());
796 if (
ModuleSP result = FindModuleInMap(module))
798 return m_list.FindModule(&module);
802 ModuleSP FindModule(
const UUID &uuid)
const {
803 return m_list.FindModule(uuid);
806 void Append(
const ModuleSP &module_sp,
bool use_notifier) {
809 std::lock_guard<std::recursive_mutex> guard(GetMutex());
810 m_list.Append(module_sp, use_notifier);
814 size_t RemoveOrphans(
bool mandatory) {
815 std::unique_lock<std::recursive_mutex> lock(GetMutex(), std::defer_lock);
819 if (!lock.try_lock())
822 size_t total_count = 0;
828 run_count = RemoveOrphansFromMapAndList();
829 run_count += m_list.RemoveOrphans(mandatory);
830 total_count += run_count;
833 }
while (run_count != 0);
838 bool Remove(
const ModuleSP &module_sp,
bool use_notifier =
true) {
841 std::lock_guard<std::recursive_mutex> guard(GetMutex());
842 RemoveFromMap(module_sp);
843 return m_list.Remove(module_sp, use_notifier);
846 void ReplaceEquivalent(
const ModuleSP &module_sp,
847 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules) {
848 std::lock_guard<std::recursive_mutex> guard(GetMutex());
849 m_list.ReplaceEquivalent(module_sp, old_modules);
850 ReplaceEquivalentInMap(module_sp);
853 bool RemoveIfOrphaned(
const ModuleWP module_wp) {
854 std::lock_guard<std::recursive_mutex> guard(GetMutex());
855 RemoveFromMap(module_wp,
true);
856 return m_list.RemoveIfOrphaned(module_wp);
859 std::recursive_mutex &GetMutex()
const {
return m_list.GetMutex(); }
865 ConstString name =
module.GetFileSpec().GetFilename();
866 auto it = m_name_to_modules.find(name);
867 if (it == m_name_to_modules.end())
869 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
870 for (
const ModuleSP &module_sp : vector) {
871 if (module_sp.get() == &module)
877 void FindModulesInMap(
const ModuleSpec &module_spec,
878 ModuleList &matching_module_list)
const {
880 if (it == m_name_to_modules.end())
882 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
883 for (
const ModuleSP &module_sp : vector) {
884 if (module_sp->MatchesModuleSpec(module_spec))
885 matching_module_list.
Append(module_sp);
889 void AddToMap(
const ModuleSP &module_sp) {
890 ConstString name = module_sp->GetFileSpec().GetFilename();
893 m_name_to_modules[name].push_back(module_sp);
896 void RemoveFromMap(
const ModuleWP module_wp,
bool if_orphaned =
false) {
897 if (
auto module_sp = module_wp.lock()) {
898 ConstString name = module_sp->GetFileSpec().GetFilename();
899 if (!m_name_to_modules.contains(name))
901 llvm::SmallVectorImpl<ModuleSP> &vec = m_name_to_modules[name];
902 for (
auto *it = vec.begin(); it != vec.end(); ++it) {
903 if (it->get() == module_sp.get()) {
906 constexpr long kUseCountOrphaned =
907 kUseCountSharedModuleListOrphaned + 1;
908 if (!if_orphaned || it->use_count() == kUseCountOrphaned) {
917 void ReplaceEquivalentInMap(
const ModuleSP &module_sp) {
918 RemoveEquivalentModulesFromMap(module_sp);
922 void RemoveEquivalentModulesFromMap(
const ModuleSP &module_sp) {
923 ConstString name = module_sp->GetFileSpec().GetFilename();
927 auto it = m_name_to_modules.find(name);
928 if (it == m_name_to_modules.end())
933 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
934 module_sp->GetArchitecture());
935 equivalent_module_spec.GetPlatformFileSpec() =
936 module_sp->GetPlatformFileSpec();
938 llvm::SmallVectorImpl<ModuleSP> &vec = it->second;
939 llvm::erase_if(vec, [&equivalent_module_spec](
ModuleSP &element) {
940 return element->MatchesModuleSpec(equivalent_module_spec);
945 ModuleList RemoveOrphansFromVector(llvm::SmallVectorImpl<ModuleSP> &vec) {
948 auto *to_remove_start = llvm::remove_if(vec, [](
const ModuleSP &module) {
949 return module.use_count() == kUseCountSharedModuleListOrphaned;
952 ModuleList to_remove;
953 for (
ModuleSP *it = to_remove_start; it != vec.end(); ++it)
954 to_remove.Append(*it);
956 vec.erase(to_remove_start, vec.end());
964 int RemoveOrphansFromMapAndList() {
968 int remove_count = 0;
969 int previous_remove_count;
971 previous_remove_count = remove_count;
972 for (
auto &[name, vec] : m_name_to_modules) {
975 ModuleList to_remove = RemoveOrphansFromVector(vec);
976 remove_count += to_remove.
GetSize();
977 m_list.Remove(to_remove);
980 }
while (previous_remove_count != remove_count);
989 llvm::DenseMap<ConstString, llvm::SmallVector<ModuleSP, 1>> m_name_to_modules;
992 static constexpr long kUseCountSharedModuleListOrphaned = 2;
995struct SharedModuleListInfo {
996 SharedModuleList module_list;
997 ModuleListProperties module_list_properties;
1002 static SharedModuleListInfo *g_shared_module_list_info =
nullptr;
1003 static llvm::once_flag g_once_flag;
1004 llvm::call_once(g_once_flag, []() {
1008 if (g_shared_module_list_info ==
nullptr)
1009 g_shared_module_list_info =
new SharedModuleListInfo();
1011 return *g_shared_module_list_info;
1025 return shared_module_list.FindModule(*module_ptr).get() !=
nullptr;
1046 bool *did_create_ptr,
bool always_create,
1047 bool invoke_locate_callback) {
1049 std::lock_guard<std::recursive_mutex> guard(shared_module_list.GetMutex());
1057 *did_create_ptr =
false;
1066 if (!always_create) {
1068 shared_module_list.FindModules(module_spec, matching_module_list);
1069 const size_t num_matching_modules = matching_module_list.
GetSize();
1071 if (num_matching_modules > 0) {
1072 for (
size_t module_idx = 0; module_idx < num_matching_modules;
1077 if (module_sp->FileHasChanged()) {
1079 old_modules->push_back(module_sp);
1084 log,
"%p '%s' module changed: removing from global module list",
1085 static_cast<void *
>(module_sp.get()),
1086 module_sp->GetFileSpec().GetFilename().GetCString());
1088 shared_module_list.Remove(module_sp);
1103 if (invoke_locate_callback) {
1105 if (target_sp && target_sp->IsValid()) {
1106 if (
PlatformSP platform_sp = target_sp->GetPlatform()) {
1108 platform_sp->CallLocateModuleCallbackIfSet(
1109 module_spec, module_sp, symbol_file_spec, did_create_ptr);
1118 module_sp = std::make_shared<Module>(module_spec);
1122 if (module_sp->GetObjectFile()) {
1125 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1128 if (module_sp->GetObjectFile() &&
1129 module_sp->GetObjectFile()->GetType() ==
1133 if (did_create_ptr) {
1134 *did_create_ptr =
true;
1137 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1149 module_search_paths = target_sp->GetExecutableSearchPaths();
1151 if (!module_search_paths.
IsEmpty()) {
1152 const auto num_directories = module_search_paths.
GetSize();
1153 for (
size_t idx = 0; idx < num_directories; ++idx) {
1156 namespace fs = llvm::sys::fs;
1159 search_path_spec.AppendPathComponent(
1164 auto resolved_module_spec(module_spec);
1165 resolved_module_spec.GetFileSpec() = search_path_spec;
1166 module_sp = std::make_shared<Module>(resolved_module_spec);
1167 if (module_sp->GetObjectFile()) {
1170 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1173 if (module_sp->GetObjectFile()->GetType() ==
1178 *did_create_ptr =
true;
1180 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1199 module_spec, symbol_locator_map);
1202 if (located_binary_modulespec.
GetFileSpec() != module_file_spec) {
1206 if (path[0] ==
'\0')
1207 module_file_spec.
GetPath(path,
sizeof(path));
1212 std::string uuid_str;
1213 if (uuid_ptr && uuid_ptr->
IsValid())
1217 if (!uuid_str.empty())
1219 "'%s' does not contain the %s architecture and UUID %s", path,
1223 "'%s' does not contain the %s architecture.", path,
1237 ModuleSpec platform_module_spec(module_spec);
1245 shared_module_list.FindModules(platform_module_spec, matching_module_list);
1246 if (!matching_module_list.
IsEmpty()) {
1251 if (platform_module_spec.
GetUUIDPtr() ==
nullptr) {
1254 if (file_spec_mod_time != llvm::sys::TimePoint<>()) {
1255 if (file_spec_mod_time != module_sp->GetModificationTime()) {
1257 old_modules->push_back(module_sp);
1258 shared_module_list.Remove(module_sp);
1266 module_sp = std::make_shared<Module>(platform_module_spec);
1271 if (module_sp && module_sp->GetObjectFile()) {
1272 module_sp->GetSymbolLocatorStatistics().merge(symbol_locator_map);
1273 if (module_sp->GetObjectFile()->GetType() ==
1278 *did_create_ptr =
true;
1280 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1288 "unable to open %s architecture in '%s'",
1294 std::string uuid_str;
1295 if (uuid_ptr && uuid_ptr->
IsValid())
1298 if (!uuid_str.empty())
1300 "cannot locate a module for UUID '%s'", uuid_str.c_str());
1320 std::list<Status> &errors,
1322 bool continue_on_error) {
1335 if (!module->LoadScriptingResourceInTarget(target,
error,
1339 "unable to load scripting data for "
1340 "module %s - error reported was %s",
1341 module->GetFileSpec()
1342 .GetFileNameStrippingExtension()
1345 errors.push_back(std::move(
error));
1346 if (!continue_on_error)
1352 return errors.empty();
1359 for (
const auto &module_sp :
m_modules) {
1360 assert(module_sp !=
nullptr);
1370 for (
const auto &module_sp :
m_modules) {
1371 assert(module_sp !=
nullptr);
1372 if (callback(*module_sp))
1382 std::scoped_lock<std::recursive_mutex, std::recursive_mutex> lock(
1392 module_sp->PreloadSymbols();
1398 task_group.async([module_sp] {
1400 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.
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
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()
A class that describes a function.
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
bool GetLoadSymbolOnDemand()
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.
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.
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool always_create=false, bool invoke_locate_callback=true)
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()
ArchSpec & GetArchitecture()
FileSpec & GetSymbolFileSpec()
lldb::TargetSP GetTargetSP() const
A class that encapsulates name lookup information.
lldb::FunctionNameType GetNameTypeMask() const
ConstString GetLookupName() const
void Prune(SymbolContextList &sc_list, size_t start_idx) const
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.