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 if (name_type_mask & eFunctionNameTypeAuto) {
457 std::vector<Module::LookupInfo> lookup_infos =
461 for (
const auto &lookup_info : lookup_infos) {
462 const size_t old_size = sc_list.
GetSize();
468 const size_t new_size = sc_list.
GetSize();
469 if (old_size < new_size)
470 lookup_info.Prune(sc_list, old_size);
475 module_sp->FindFunctions(name, CompilerDeclContext(), name_type_mask,
482 lldb::FunctionNameType name_type_mask,
484 if (name_type_mask & eFunctionNameTypeAuto) {
485 std::vector<Module::LookupInfo> lookup_infos =
490 for (
const auto &lookup_info : lookup_infos) {
491 const size_t old_size = sc_list.
GetSize();
493 module_sp->FindFunctionSymbols(lookup_info.GetLookupName(),
494 lookup_info.GetNameTypeMask(), sc_list);
497 const size_t new_size = sc_list.
GetSize();
499 if (old_size < new_size)
500 lookup_info.Prune(sc_list, old_size);
505 module_sp->FindFunctionSymbols(name, name_type_mask, sc_list);
515 module_sp->FindFunctions(name, options, sc_list);
522 module_sp->FindCompileUnits(path, sc_list);
539 module_sp->FindGlobalVariables(regex, max_matches, variable_list);
547 module_sp->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
555 module_sp->FindSymbolsMatchingRegExAndType(regex, symbol_type, sc_list);
562 if (module_sp->MatchesModuleSpec(module_spec))
563 matching_module_list.
Append(module_sp);
573 collection::const_iterator pos, end =
m_modules.end();
575 for (pos =
m_modules.begin(); pos != end; ++pos) {
576 if ((*pos).get() == module_ptr) {
590 collection::const_iterator pos, end =
m_modules.end();
592 for (pos =
m_modules.begin(); pos != end; ++pos) {
593 if ((*pos)->GetUUID() == uuid) {
605 if (m->GetID() == uid) {
621 if (results.
Done(query))
624 for (
const auto &module_sp :
m_modules) {
625 if (search_first != module_sp.get()) {
626 module_sp->FindTypes(query, results);
627 if (results.
Done(query))
637 if (module_sp->FindSourceFile(orig_spec, new_spec))
644 const FileSpec &file, uint32_t line,
646 std::vector<Address> &output_local,
647 std::vector<Address> &output_extern) {
650 module_sp->FindAddressesForLine(target_sp, file, line, function,
651 output_local, output_extern);
658 collection::const_iterator pos, end =
m_modules.end();
659 for (pos =
m_modules.begin(); pos != end; ++pos) {
661 if (module_sp->MatchesModuleSpec(module_spec))
683 if (log !=
nullptr) {
685 collection::const_iterator pos, begin =
m_modules.begin(),
687 for (pos = begin; pos != end; ++pos) {
688 Module *module = pos->get();
689 const FileSpec &module_file_spec =
module->GetFileSpec();
690 LLDB_LOGF(log,
"%s[%u] %s (%s) \"%s\"", prefix_cstr ? prefix_cstr :
"",
691 (uint32_t)std::distance(begin, pos),
694 module_file_spec.
GetPath().c_str());
703 if (module_sp->ResolveFileAddress(vm_addr, so_addr))
712 SymbolContextItem resolve_scope,
715 uint32_t resolved_flags = 0;
719 module_sp->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
722 collection::const_iterator pos, end =
m_modules.end();
723 for (pos =
m_modules.begin(); pos != end; ++pos) {
725 (*pos)->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
726 if (resolved_flags != 0)
731 return resolved_flags;
735 const char *file_path, uint32_t line,
bool check_inlines,
739 resolve_scope, sc_list);
743 const FileSpec &file_spec, uint32_t line,
bool check_inlines,
747 module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
748 resolve_scope, sc_list);
757 collection::const_iterator pos;
758 collection::const_iterator begin =
m_modules.begin();
759 collection::const_iterator end =
m_modules.end();
760 for (pos = begin; pos != end; ++pos) {
761 if ((*pos).get() == module)
762 return std::distance(begin, pos);
771class SharedModuleList {
775 void FindModules(
const ModuleSpec &module_spec,
777 std::lock_guard<std::recursive_mutex> guard(GetMutex());
780 FindModulesInMap(module_spec, matching_module_list);
781 if (!matching_module_list.
IsEmpty())
783 m_list.FindModules(module_spec, matching_module_list);
788 assert((matching_module_list.
IsEmpty() ||
794 "Search by name not found in SharedModuleList's map");
799 std::lock_guard<std::recursive_mutex> guard(GetMutex());
800 if (
ModuleSP result = FindModuleInMap(module))
802 return m_list.FindModule(&module);
806 ModuleSP FindModule(
const UUID &uuid)
const {
807 return m_list.FindModule(uuid);
810 void Append(
const ModuleSP &module_sp,
bool use_notifier) {
813 std::lock_guard<std::recursive_mutex> guard(GetMutex());
814 m_list.Append(module_sp, use_notifier);
818 size_t RemoveOrphans(
bool mandatory) {
819 std::unique_lock<std::recursive_mutex> lock(GetMutex(), std::defer_lock);
823 if (!lock.try_lock())
826 size_t total_count = 0;
832 run_count = RemoveOrphansFromMapAndList();
833 run_count += m_list.RemoveOrphans(mandatory);
834 total_count += run_count;
837 }
while (run_count != 0);
842 bool Remove(
const ModuleSP &module_sp,
bool use_notifier =
true) {
845 std::lock_guard<std::recursive_mutex> guard(GetMutex());
846 RemoveFromMap(module_sp);
847 return m_list.Remove(module_sp, use_notifier);
850 void ReplaceEquivalent(
const ModuleSP &module_sp,
851 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules) {
852 std::lock_guard<std::recursive_mutex> guard(GetMutex());
853 m_list.ReplaceEquivalent(module_sp, old_modules);
854 ReplaceEquivalentInMap(module_sp);
857 bool RemoveIfOrphaned(
const ModuleWP module_wp) {
858 std::lock_guard<std::recursive_mutex> guard(GetMutex());
859 RemoveFromMap(module_wp,
true);
860 return m_list.RemoveIfOrphaned(module_wp);
863 std::recursive_mutex &GetMutex()
const {
return m_list.GetMutex(); }
869 ConstString name =
module.GetFileSpec().GetFilename();
870 auto it = m_name_to_modules.find(name);
871 if (it == m_name_to_modules.end())
873 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
874 for (
const ModuleSP &module_sp : vector) {
875 if (module_sp.get() == &module)
881 void FindModulesInMap(
const ModuleSpec &module_spec,
882 ModuleList &matching_module_list)
const {
884 if (it == m_name_to_modules.end())
886 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
887 for (
const ModuleSP &module_sp : vector) {
888 if (module_sp->MatchesModuleSpec(module_spec))
889 matching_module_list.
Append(module_sp);
893 void AddToMap(
const ModuleSP &module_sp) {
894 ConstString name = module_sp->GetFileSpec().GetFilename();
897 m_name_to_modules[name].push_back(module_sp);
900 void RemoveFromMap(
const ModuleWP module_wp,
bool if_orphaned =
false) {
901 if (
auto module_sp = module_wp.lock()) {
902 ConstString name = module_sp->GetFileSpec().GetFilename();
903 if (!m_name_to_modules.contains(name))
905 llvm::SmallVectorImpl<ModuleSP> &vec = m_name_to_modules[name];
906 for (
auto *it = vec.begin(); it != vec.end(); ++it) {
907 if (it->get() == module_sp.get()) {
910 constexpr long kUseCountOrphaned =
911 kUseCountSharedModuleListOrphaned + 1;
912 if (!if_orphaned || it->use_count() == kUseCountOrphaned) {
921 void ReplaceEquivalentInMap(
const ModuleSP &module_sp) {
922 RemoveEquivalentModulesFromMap(module_sp);
926 void RemoveEquivalentModulesFromMap(
const ModuleSP &module_sp) {
927 ConstString name = module_sp->GetFileSpec().GetFilename();
931 auto it = m_name_to_modules.find(name);
932 if (it == m_name_to_modules.end())
937 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
938 module_sp->GetArchitecture());
939 equivalent_module_spec.GetPlatformFileSpec() =
940 module_sp->GetPlatformFileSpec();
942 llvm::SmallVectorImpl<ModuleSP> &vec = it->second;
943 llvm::erase_if(vec, [&equivalent_module_spec](
ModuleSP &element) {
944 return element->MatchesModuleSpec(equivalent_module_spec);
949 ModuleList RemoveOrphansFromVector(llvm::SmallVectorImpl<ModuleSP> &vec) {
952 auto *to_remove_start = llvm::remove_if(vec, [](
const ModuleSP &module) {
953 return module.use_count() == kUseCountSharedModuleListOrphaned;
956 ModuleList to_remove;
957 for (
ModuleSP *it = to_remove_start; it != vec.end(); ++it)
958 to_remove.Append(*it);
960 vec.erase(to_remove_start, vec.end());
968 int RemoveOrphansFromMapAndList() {
972 int remove_count = 0;
973 int previous_remove_count;
975 previous_remove_count = remove_count;
976 for (
auto &[name, vec] : m_name_to_modules) {
979 ModuleList to_remove = RemoveOrphansFromVector(vec);
980 remove_count += to_remove.
GetSize();
981 m_list.Remove(to_remove);
984 }
while (previous_remove_count != remove_count);
993 llvm::DenseMap<ConstString, llvm::SmallVector<ModuleSP, 1>> m_name_to_modules;
996 static constexpr long kUseCountSharedModuleListOrphaned = 2;
999struct SharedModuleListInfo {
1000 SharedModuleList module_list;
1001 ModuleListProperties module_list_properties;
1006 static SharedModuleListInfo *g_shared_module_list_info =
nullptr;
1007 static llvm::once_flag g_once_flag;
1008 llvm::call_once(g_once_flag, []() {
1012 if (g_shared_module_list_info ==
nullptr)
1013 g_shared_module_list_info =
new SharedModuleListInfo();
1015 return *g_shared_module_list_info;
1029 return shared_module_list.FindModule(*module_ptr).get() !=
nullptr;
1050 bool *did_create_ptr,
bool always_create,
1051 bool invoke_locate_callback) {
1053 std::lock_guard<std::recursive_mutex> guard(shared_module_list.GetMutex());
1061 *did_create_ptr =
false;
1070 if (!always_create) {
1072 shared_module_list.FindModules(module_spec, matching_module_list);
1073 const size_t num_matching_modules = matching_module_list.
GetSize();
1075 if (num_matching_modules > 0) {
1076 for (
size_t module_idx = 0; module_idx < num_matching_modules;
1081 if (module_sp->FileHasChanged()) {
1083 old_modules->push_back(module_sp);
1088 log,
"%p '%s' module changed: removing from global module list",
1089 static_cast<void *
>(module_sp.get()),
1090 module_sp->GetFileSpec().GetFilename().GetCString());
1092 shared_module_list.Remove(module_sp);
1107 if (invoke_locate_callback) {
1109 if (target_sp && target_sp->IsValid()) {
1110 if (
PlatformSP platform_sp = target_sp->GetPlatform()) {
1112 platform_sp->CallLocateModuleCallbackIfSet(
1113 module_spec, module_sp, symbol_file_spec, did_create_ptr);
1122 module_sp = std::make_shared<Module>(module_spec);
1126 if (module_sp->GetObjectFile()) {
1129 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1132 if (module_sp->GetObjectFile() &&
1133 module_sp->GetObjectFile()->GetType() ==
1137 if (did_create_ptr) {
1138 *did_create_ptr =
true;
1141 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1153 module_search_paths = target_sp->GetExecutableSearchPaths();
1155 if (!module_search_paths.
IsEmpty()) {
1156 const auto num_directories = module_search_paths.
GetSize();
1157 for (
size_t idx = 0; idx < num_directories; ++idx) {
1160 namespace fs = llvm::sys::fs;
1163 search_path_spec.AppendPathComponent(
1168 auto resolved_module_spec(module_spec);
1169 resolved_module_spec.GetFileSpec() = search_path_spec;
1170 module_sp = std::make_shared<Module>(resolved_module_spec);
1171 if (module_sp->GetObjectFile()) {
1174 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1177 if (module_sp->GetObjectFile()->GetType() ==
1182 *did_create_ptr =
true;
1184 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1203 module_spec, symbol_locator_map);
1206 if (located_binary_modulespec.
GetFileSpec() != module_file_spec) {
1210 if (path[0] ==
'\0')
1211 module_file_spec.
GetPath(path,
sizeof(path));
1216 std::string uuid_str;
1217 if (uuid_ptr && uuid_ptr->
IsValid())
1221 if (!uuid_str.empty())
1223 "'%s' does not contain the %s architecture and UUID %s", path,
1227 "'%s' does not contain the %s architecture.", path,
1241 ModuleSpec platform_module_spec(module_spec);
1249 shared_module_list.FindModules(platform_module_spec, matching_module_list);
1250 if (!matching_module_list.
IsEmpty()) {
1255 if (platform_module_spec.
GetUUIDPtr() ==
nullptr) {
1258 if (file_spec_mod_time != llvm::sys::TimePoint<>()) {
1259 if (file_spec_mod_time != module_sp->GetModificationTime()) {
1261 old_modules->push_back(module_sp);
1262 shared_module_list.Remove(module_sp);
1270 module_sp = std::make_shared<Module>(platform_module_spec);
1275 if (module_sp && module_sp->GetObjectFile()) {
1276 module_sp->GetSymbolLocatorStatistics().merge(symbol_locator_map);
1277 if (module_sp->GetObjectFile()->GetType() ==
1282 *did_create_ptr =
true;
1284 shared_module_list.ReplaceEquivalent(module_sp, old_modules);
1292 "unable to open %s architecture in '%s'",
1298 std::string uuid_str;
1299 if (uuid_ptr && uuid_ptr->
IsValid())
1302 if (!uuid_str.empty())
1304 "cannot locate a module for UUID '%s'", uuid_str.c_str());
1324 std::list<Status> &errors,
1326 bool continue_on_error) {
1339 if (!module->LoadScriptingResourceInTarget(target,
error,
1343 "unable to load scripting data for "
1344 "module %s - error reported was %s",
1345 module->GetFileSpec()
1346 .GetFileNameStrippingExtension()
1349 errors.push_back(std::move(
error));
1350 if (!continue_on_error)
1356 return errors.empty();
1363 for (
const auto &module_sp :
m_modules) {
1364 assert(module_sp !=
nullptr);
1374 for (
const auto &module_sp :
m_modules) {
1375 assert(module_sp !=
nullptr);
1376 if (callback(*module_sp))
1386 std::scoped_lock<std::recursive_mutex, std::recursive_mutex> lock(
1396 module_sp->PreloadSymbols();
1402 task_group.async([module_sp] {
1404 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
static std::vector< LookupInfo > MakeLookupInfos(ConstString name, lldb::FunctionNameType name_type_mask, lldb::LanguageType lang_type)
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.