34#include "clang/Driver/Driver.h"
35#include "llvm/ADT/StringRef.h"
36#include "llvm/Support/FileSystem.h"
37#include "llvm/Support/Threading.h"
38#include "llvm/Support/raw_ostream.h"
67#define LLDB_PROPERTIES_modulelist
68#include "CoreProperties.inc"
71#define LLDB_PROPERTIES_modulelist
72#include "CorePropertiesEnum.inc"
83 llvm::SmallString<128> path;
84 if (clang::driver::Driver::getDefaultModuleCachePath(path)) {
89 if (llvm::sys::path::cache_directory(path)) {
90 llvm::sys::path::append(path,
"lldb");
91 llvm::sys::path::append(path,
"IndexCache");
98 const uint32_t idx = ePropertyEnableExternalLookup;
100 idx, g_modulelist_properties[idx].default_uint_value != 0);
112 const uint32_t idx = ePropertyAutoDownload;
115 g_modulelist_properties[idx].default_uint_value));
119 const uint32_t idx = ePropertyClangModulesCachePath;
124 const uint32_t idx = ePropertyClangModulesCachePath;
129 const uint32_t idx = ePropertyLLDBIndexCachePath;
134 const uint32_t idx = ePropertyLLDBIndexCachePath;
139 const uint32_t idx = ePropertyEnableLLDBIndexCache;
141 idx, g_modulelist_properties[idx].default_uint_value != 0);
149 const uint32_t idx = ePropertyLLDBIndexCacheMaxByteSize;
151 idx, g_modulelist_properties[idx].default_uint_value);
155 const uint32_t idx = ePropertyLLDBIndexCacheMaxPercent;
157 idx, g_modulelist_properties[idx].default_uint_value);
161 const uint32_t idx = ePropertyLLDBIndexCacheExpirationDays;
163 idx, g_modulelist_properties[idx].default_uint_value);
170 const bool notify =
false;
172 for (
auto symlink : list) {
186 const uint32_t idx = ePropertyLoadSymbolOnDemand;
188 idx, g_modulelist_properties[idx].default_uint_value != 0);
233 const bool elem_zero_is_executable =
234 m_modules[0]->GetObjectFile()->GetType() ==
237 if (!elem_zero_is_executable && obj &&
248 m_notifier->NotifyModuleAdded(*
this, module_sp);
263 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
264 module_sp->GetArchitecture());
266 module_sp->GetPlatformFileSpec();
271 if (test_module_sp->MatchesModuleSpec(equivalent_module_spec)) {
273 old_modules->push_back(test_module_sp);
288 if (module_sp.get() == new_module.get())
292 Append(new_module, notify);
315 collection::iterator pos, end =
m_modules.end();
316 for (pos =
m_modules.begin(); pos != end; ++pos) {
317 if (pos->get() == module_sp.get()) {
320 m_notifier->NotifyModuleRemoved(*
this, module_sp);
328ModuleList::collection::iterator
332 collection::iterator retval =
m_modules.erase(pos);
348 m_notifier->NotifyModuleUpdated(*
this, old_module_sp, new_module_sp);
355 collection::iterator pos, end =
m_modules.end();
356 for (pos =
m_modules.begin(); pos != end; ++pos) {
357 if (pos->get() == module_ptr) {
358 if (pos->use_count() == 1) {
370 std::unique_lock<std::recursive_mutex> lock(
m_modules_mutex, std::defer_lock);
376 if (!lock.try_lock())
379 size_t remove_count = 0;
383 bool made_progress =
true;
384 while (made_progress) {
386 made_progress =
false;
387 collection::iterator pos =
m_modules.begin();
389 if (pos->use_count() == 1) {
393 made_progress =
true;
404 size_t num_removed = 0;
405 collection::iterator pos, end = module_list.
m_modules.end();
406 for (pos = module_list.
m_modules.begin(); pos != end; ++pos) {
411 m_notifier->NotifyModulesRemoved(module_list);
446 FunctionNameType name_type_mask,
449 const size_t old_size = sc_list.
GetSize();
451 if (name_type_mask & eFunctionNameTypeAuto) {
460 const size_t new_size = sc_list.
GetSize();
462 if (old_size < new_size)
463 lookup_info.Prune(sc_list, old_size);
467 module_sp->FindFunctions(name, CompilerDeclContext(), name_type_mask,
474 lldb::FunctionNameType name_type_mask,
476 const size_t old_size = sc_list.
GetSize();
478 if (name_type_mask & eFunctionNameTypeAuto) {
487 const size_t new_size = sc_list.
GetSize();
489 if (old_size < new_size)
490 lookup_info.
Prune(sc_list, old_size);
494 module_sp->FindFunctionSymbols(name, name_type_mask, sc_list);
504 module_sp->FindFunctions(name, options, sc_list);
511 module_sp->FindCompileUnits(path, sc_list);
528 module_sp->FindGlobalVariables(regex, max_matches, variable_list);
536 module_sp->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
544 module_sp->FindSymbolsMatchingRegExAndType(regex, symbol_type, sc_list);
551 if (module_sp->MatchesModuleSpec(module_spec))
552 matching_module_list.
Append(module_sp);
562 collection::const_iterator pos, end =
m_modules.end();
564 for (pos =
m_modules.begin(); pos != end; ++pos) {
565 if ((*pos).get() == module_ptr) {
579 collection::const_iterator pos, end =
m_modules.end();
581 for (pos =
m_modules.begin(); pos != end; ++pos) {
582 if ((*pos)->GetUUID() == uuid) {
594 if (m->GetID() == uid) {
610 if (results.
Done(query))
613 for (
const auto &module_sp :
m_modules) {
614 if (search_first != module_sp.get()) {
615 module_sp->FindTypes(query, results);
616 if (results.
Done(query))
626 if (module_sp->FindSourceFile(orig_spec, new_spec))
633 const FileSpec &file, uint32_t line,
635 std::vector<Address> &output_local,
636 std::vector<Address> &output_extern) {
639 module_sp->FindAddressesForLine(target_sp, file, line, function,
640 output_local, output_extern);
647 collection::const_iterator pos, end =
m_modules.end();
648 for (pos =
m_modules.begin(); pos != end; ++pos) {
650 if (module_sp->MatchesModuleSpec(module_spec))
672 if (log !=
nullptr) {
674 collection::const_iterator pos, begin =
m_modules.begin(),
676 for (pos = begin; pos != end; ++pos) {
677 Module *module = pos->get();
678 const FileSpec &module_file_spec =
module->GetFileSpec();
679 LLDB_LOGF(log,
"%s[%u] %s (%s) \"%s\"", prefix_cstr ? prefix_cstr :
"",
680 (uint32_t)std::distance(begin, pos),
683 module_file_spec.
GetPath().c_str());
692 if (module_sp->ResolveFileAddress(vm_addr, so_addr))
701 SymbolContextItem resolve_scope,
704 uint32_t resolved_flags = 0;
708 module_sp->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
711 collection::const_iterator pos, end =
m_modules.end();
712 for (pos =
m_modules.begin(); pos != end; ++pos) {
714 (*pos)->ResolveSymbolContextForAddress(so_addr, resolve_scope, sc);
715 if (resolved_flags != 0)
720 return resolved_flags;
724 const char *file_path, uint32_t line,
bool check_inlines,
728 resolve_scope, sc_list);
732 const FileSpec &file_spec, uint32_t line,
bool check_inlines,
736 module_sp->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines,
737 resolve_scope, sc_list);
746 collection::const_iterator pos;
747 collection::const_iterator begin =
m_modules.begin();
748 collection::const_iterator end =
m_modules.end();
749 for (pos = begin; pos != end; ++pos) {
750 if ((*pos).get() == module)
751 return std::distance(begin, pos);
760class SharedModuleList {
764 void FindModules(
const ModuleSpec &module_spec,
766 std::lock_guard<std::recursive_mutex> guard(GetMutex());
769 FindModulesInMap(module_spec, matching_module_list);
770 if (!matching_module_list.
IsEmpty())
772 m_list.FindModules(module_spec, matching_module_list);
777 assert((matching_module_list.
IsEmpty() ||
783 "Search by name not found in SharedModuleList's map");
788 std::lock_guard<std::recursive_mutex> guard(GetMutex());
789 if (
ModuleSP result = FindModuleInMap(module))
791 return m_list.FindModule(&module);
795 ModuleSP FindModule(
const UUID &uuid)
const {
796 return m_list.FindModule(uuid);
799 void Append(
const ModuleSP &module_sp,
bool use_notifier) {
802 std::lock_guard<std::recursive_mutex> guard(GetMutex());
803 m_list.Append(module_sp, use_notifier);
807 size_t RemoveOrphans(
bool mandatory) {
808 std::unique_lock<std::recursive_mutex> lock(GetMutex(), std::defer_lock);
812 if (!lock.try_lock())
815 size_t total_count = 0;
821 run_count = RemoveOrphansFromMapAndList();
822 run_count += m_list.RemoveOrphans(mandatory);
823 total_count += run_count;
826 }
while (run_count != 0);
831 bool Remove(
const ModuleSP &module_sp,
bool use_notifier =
true) {
834 std::lock_guard<std::recursive_mutex> guard(GetMutex());
835 RemoveFromMap(*module_sp.get());
836 return m_list.Remove(module_sp, use_notifier);
839 void ReplaceEquivalent(
const ModuleSP &module_sp,
840 llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules) {
841 std::lock_guard<std::recursive_mutex> guard(GetMutex());
842 m_list.ReplaceEquivalent(module_sp, old_modules);
843 ReplaceEquivalentInMap(module_sp);
846 bool RemoveIfOrphaned(
const Module *module_ptr) {
847 std::lock_guard<std::recursive_mutex> guard(GetMutex());
848 RemoveFromMap(*module_ptr,
true);
849 return m_list.RemoveIfOrphaned(module_ptr);
852 std::recursive_mutex &GetMutex()
const {
return m_list.GetMutex(); }
858 ConstString name =
module.GetFileSpec().GetFilename();
859 auto it = m_name_to_modules.find(name);
860 if (it == m_name_to_modules.end())
862 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
863 for (
const ModuleSP &module_sp : vector) {
864 if (module_sp.get() == &module)
870 void FindModulesInMap(
const ModuleSpec &module_spec,
871 ModuleList &matching_module_list)
const {
873 if (it == m_name_to_modules.end())
875 const llvm::SmallVectorImpl<ModuleSP> &vector = it->second;
876 for (
const ModuleSP &module_sp : vector) {
877 if (module_sp->MatchesModuleSpec(module_spec))
878 matching_module_list.
Append(module_sp);
882 void AddToMap(
const ModuleSP &module_sp) {
883 ConstString name = module_sp->GetFileSpec().GetFilename();
886 m_name_to_modules[name].push_back(module_sp);
889 void RemoveFromMap(
const Module &module,
bool if_orphaned =
false) {
890 ConstString name =
module.GetFileSpec().GetFilename();
891 if (!m_name_to_modules.contains(name))
893 llvm::SmallVectorImpl<ModuleSP> &vec = m_name_to_modules[name];
894 for (
auto *it = vec.begin(); it != vec.end(); ++it) {
895 if (it->get() == &module) {
896 if (!if_orphaned || it->use_count() == kUseCountOrphaned) {
904 void ReplaceEquivalentInMap(
const ModuleSP &module_sp) {
905 RemoveEquivalentModulesFromMap(module_sp);
909 void RemoveEquivalentModulesFromMap(
const ModuleSP &module_sp) {
910 ConstString name = module_sp->GetFileSpec().GetFilename();
914 auto it = m_name_to_modules.find(name);
915 if (it == m_name_to_modules.end())
920 ModuleSpec equivalent_module_spec(module_sp->GetFileSpec(),
921 module_sp->GetArchitecture());
922 equivalent_module_spec.GetPlatformFileSpec() =
923 module_sp->GetPlatformFileSpec();
925 llvm::SmallVectorImpl<ModuleSP> &vec = it->second;
926 llvm::erase_if(vec, [&equivalent_module_spec](
ModuleSP &element) {
927 return element->MatchesModuleSpec(equivalent_module_spec);
932 ModuleList RemoveOrphansFromVector(llvm::SmallVectorImpl<ModuleSP> &vec) {
935 auto *to_remove_start = llvm::remove_if(vec, [](
const ModuleSP &module) {
936 return module.use_count() == kUseCountOrphaned;
939 ModuleList to_remove;
940 for (
ModuleSP *it = to_remove_start; it != vec.end(); ++it)
941 to_remove.Append(*it);
943 vec.erase(to_remove_start, vec.end());
951 int RemoveOrphansFromMapAndList() {
955 int remove_count = 0;
956 int previous_remove_count;
958 previous_remove_count = remove_count;
959 for (
auto &[name, vec] : m_name_to_modules) {
962 ModuleList to_remove = RemoveOrphansFromVector(vec);
963 remove_count += to_remove.
GetSize();
964 m_list.Remove(to_remove);
967 }
while (previous_remove_count != remove_count);
976 llvm::DenseMap<ConstString, llvm::SmallVector<ModuleSP, 1>> m_name_to_modules;
979 static constexpr long kUseCountOrphaned = 2;
982struct SharedModuleListInfo {
983 ModuleList module_list;
984 ModuleListProperties module_list_properties;
989 static SharedModuleListInfo *g_shared_module_list_info =
nullptr;
990 static llvm::once_flag g_once_flag;
991 llvm::call_once(g_once_flag, []() {
995 if (g_shared_module_list_info ==
nullptr)
996 g_shared_module_list_info =
new SharedModuleListInfo();
998 return *g_shared_module_list_info;
1012 return shared_module_list.
FindModule(module_ptr).get() !=
nullptr;
1034 bool *did_create_ptr,
bool always_create) {
1036 std::lock_guard<std::recursive_mutex> guard(
1045 *did_create_ptr =
false;
1054 if (!always_create) {
1056 shared_module_list.
FindModules(module_spec, matching_module_list);
1057 const size_t num_matching_modules = matching_module_list.
GetSize();
1059 if (num_matching_modules > 0) {
1060 for (
size_t module_idx = 0; module_idx < num_matching_modules;
1065 if (module_sp->FileHasChanged()) {
1067 old_modules->push_back(module_sp);
1072 log,
"%p '%s' module changed: removing from global module list",
1073 static_cast<void *
>(module_sp.get()),
1074 module_sp->GetFileSpec().GetFilename().GetCString());
1076 shared_module_list.
Remove(module_sp);
1090 module_sp = std::make_shared<Module>(module_spec);
1094 if (module_sp->GetObjectFile()) {
1097 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1100 if (module_sp->GetObjectFile() &&
1101 module_sp->GetObjectFile()->GetType() ==
1105 if (did_create_ptr) {
1106 *did_create_ptr =
true;
1117 if (module_search_paths_ptr) {
1118 const auto num_directories = module_search_paths_ptr->
GetSize();
1119 for (
size_t idx = 0; idx < num_directories; ++idx) {
1122 namespace fs = llvm::sys::fs;
1125 search_path_spec.AppendPathComponent(
1130 auto resolved_module_spec(module_spec);
1131 resolved_module_spec.GetFileSpec() = search_path_spec;
1132 module_sp = std::make_shared<Module>(resolved_module_spec);
1133 if (module_sp->GetObjectFile()) {
1136 if (uuid_ptr && *uuid_ptr != module_sp->GetUUID()) {
1139 if (module_sp->GetObjectFile()->GetType() ==
1144 *did_create_ptr =
true;
1165 module_spec, symbol_locator_map);
1168 if (located_binary_modulespec.
GetFileSpec() != module_file_spec) {
1172 if (path[0] ==
'\0')
1173 module_file_spec.
GetPath(path,
sizeof(path));
1178 std::string uuid_str;
1179 if (uuid_ptr && uuid_ptr->
IsValid())
1183 if (!uuid_str.empty())
1185 "'%s' does not contain the %s architecture and UUID %s", path,
1189 "'%s' does not contain the %s architecture.", path,
1203 ModuleSpec platform_module_spec(module_spec);
1211 shared_module_list.
FindModules(platform_module_spec, matching_module_list);
1212 if (!matching_module_list.
IsEmpty()) {
1217 if (platform_module_spec.
GetUUIDPtr() ==
nullptr) {
1220 if (file_spec_mod_time != llvm::sys::TimePoint<>()) {
1221 if (file_spec_mod_time != module_sp->GetModificationTime()) {
1223 old_modules->push_back(module_sp);
1224 shared_module_list.
Remove(module_sp);
1232 module_sp = std::make_shared<Module>(platform_module_spec);
1237 if (module_sp && module_sp->GetObjectFile()) {
1238 module_sp->GetSymbolLocatorStatistics().merge(symbol_locator_map);
1239 if (module_sp->GetObjectFile()->GetType() ==
1244 *did_create_ptr =
true;
1254 "unable to open %s architecture in '%s'",
1260 std::string uuid_str;
1261 if (uuid_ptr && uuid_ptr->
IsValid())
1264 if (!uuid_str.empty())
1266 "cannot locate a module for UUID '%s'", uuid_str.c_str());
1286 std::list<Status> &errors,
1288 bool continue_on_error) {
1301 if (!module->LoadScriptingResourceInTarget(target,
error,
1305 "unable to load scripting data for "
1306 "module %s - error reported was %s",
1307 module->GetFileSpec()
1308 .GetFileNameStrippingExtension()
1311 errors.push_back(std::move(
error));
1312 if (!continue_on_error)
1318 return errors.empty();
1325 for (
const auto &module_sp :
m_modules) {
1326 assert(module_sp !=
nullptr);
1336 for (
const auto &module_sp :
m_modules) {
1337 assert(module_sp !=
nullptr);
1338 if (callback(*module_sp))
1348 std::scoped_lock<std::recursive_mutex, std::recursive_mutex> lock(
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
static SharedModuleListInfo & GetSharedModuleListInfo()
static ModuleList & 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.
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 bool ModuleIsInCache(const Module *module_ptr)
void FindGlobalVariables(ConstString name, size_t max_matches, VariableList &variable_list) const
Find global and static variables by name.
void Swap(ModuleList &other)
Atomically swaps the contents of this module list with other.
size_t GetIndexForModule(const Module *module) const
bool RemoveImpl(const lldb::ModuleSP &module_sp, bool use_notifier=true)
lldb::ModuleSP FindFirstModule(const ModuleSpec &module_spec) const
Finds the first module whose file specification matches module_spec.
void Clear()
Clear the object's state.
ModuleList()
Default constructor.
void Dump(Stream *s) const
Dump the description of each module contained in this list.
void FindTypes(Module *search_first, const TypeQuery &query, lldb_private::TypeResults &results) const
Find types using a type-matching object that contains all search parameters.
uint32_t ResolveSymbolContextForFilePath(const char *file_path, uint32_t line, bool check_inlines, lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list) const
Resolve items in the symbol context for a given file and line. (const char*,uint32_t,...
static bool RemoveSharedModuleIfOrphaned(const Module *module_ptr)
lldb::ModuleSP GetModuleAtIndexUnlocked(size_t idx) const
Get the module shared pointer for the module at index idx without acquiring the ModuleList mutex.
void FindCompileUnits(const FileSpec &path, SymbolContextList &sc_list) const
Find compile units by partial or full path.
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.
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool always_create=false)
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.
bool RemoveIfOrphaned(const Module *module_ptr)
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.
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()
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.
@ 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.