summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/ModuleList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core/ModuleList.cpp')
-rw-r--r--lldb/source/Core/ModuleList.cpp89
1 files changed, 82 insertions, 7 deletions
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index 451db38aae9..e2e0aa2a075 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -216,14 +216,20 @@ public:
ModuleMatches (const FileSpec *file_spec_ptr,
const ArchSpec *arch_ptr,
const lldb_private::UUID *uuid_ptr,
- const ConstString *object_name) :
+ const ConstString *object_name,
+ bool file_spec_is_platform) :
m_file_spec_ptr (file_spec_ptr),
m_arch_ptr (arch_ptr),
m_uuid_ptr (uuid_ptr),
- m_object_name (object_name)
+ m_object_name (object_name),
+ m_file_spec_compare_basename_only (false),
+ m_file_spec_is_platform (file_spec_is_platform)
{
+ if (file_spec_ptr)
+ m_file_spec_compare_basename_only = file_spec_ptr->GetDirectory();
}
+
//--------------------------------------------------------------
/// Unary predicate function object callback.
//--------------------------------------------------------------
@@ -232,8 +238,21 @@ public:
{
if (m_file_spec_ptr)
{
- if (!FileSpec::Equal (*m_file_spec_ptr, module_sp->GetFileSpec(), m_file_spec_ptr->GetDirectory()))
- return false;
+ if (m_file_spec_is_platform)
+ {
+ if (!FileSpec::Equal (*m_file_spec_ptr,
+ module_sp->GetPlatformFileSpec(),
+ m_file_spec_compare_basename_only))
+ return false;
+
+ }
+ else
+ {
+ if (!FileSpec::Equal (*m_file_spec_ptr,
+ module_sp->GetFileSpec(),
+ m_file_spec_compare_basename_only))
+ return false;
+ }
}
if (m_arch_ptr && m_arch_ptr->IsValid())
@@ -264,6 +283,8 @@ private:
const ArchSpec * m_arch_ptr;
const lldb_private::UUID * m_uuid_ptr;
const ConstString * m_object_name;
+ bool m_file_spec_compare_basename_only;
+ bool m_file_spec_is_platform;
};
size_t
@@ -277,7 +298,7 @@ ModuleList::FindModules
) const
{
size_t existing_matches = matching_module_list.GetSize();
- ModuleMatches matcher (file_spec_ptr, arch_ptr, uuid_ptr, object_name);
+ ModuleMatches matcher (file_spec_ptr, arch_ptr, uuid_ptr, object_name, false);
Mutex::Locker locker(m_modules_mutex);
collection::const_iterator end = m_modules.end();
@@ -316,6 +337,28 @@ ModuleList::FindModule (const Module *module_ptr)
}
+ModuleSP
+ModuleList::FindModule (const UUID &uuid)
+{
+ ModuleSP module_sp;
+
+ if (uuid.IsValid())
+ {
+ Mutex::Locker locker(m_modules_mutex);
+ collection::const_iterator pos, end = m_modules.end();
+
+ for (pos = m_modules.begin(); pos != end; ++pos)
+ {
+ if ((*pos)->GetUUID() == uuid)
+ {
+ module_sp = (*pos);
+ break;
+ }
+ }
+ }
+ return module_sp;
+}
+
uint32_t
ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
@@ -340,10 +383,16 @@ ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool ap
ModuleSP
-ModuleList::FindFirstModuleForFileSpec (const FileSpec &file_spec, const ConstString *object_name)
+ModuleList::FindFirstModuleForFileSpec (const FileSpec &file_spec,
+ const ArchSpec *arch_ptr,
+ const ConstString *object_name)
{
ModuleSP module_sp;
- ModuleMatches matcher (&file_spec, NULL, NULL, NULL);
+ ModuleMatches matcher (&file_spec,
+ arch_ptr,
+ NULL,
+ object_name,
+ false);
// Scope for "locker"
{
@@ -359,6 +408,32 @@ ModuleList::FindFirstModuleForFileSpec (const FileSpec &file_spec, const ConstSt
}
+ModuleSP
+ModuleList::FindFirstModuleForPlatormFileSpec (const FileSpec &file_spec,
+ const ArchSpec *arch_ptr,
+ const ConstString *object_name)
+{
+ ModuleSP module_sp;
+ ModuleMatches matcher (&file_spec,
+ arch_ptr,
+ NULL,
+ object_name,
+ true);
+
+ // Scope for "locker"
+ {
+ Mutex::Locker locker(m_modules_mutex);
+ collection::const_iterator end = m_modules.end();
+ collection::const_iterator pos = m_modules.begin();
+
+ pos = std::find_if (pos, end, matcher);
+ if (pos != end)
+ module_sp = (*pos);
+ }
+ return module_sp;
+
+}
+
size_t
ModuleList::GetSize() const
OpenPOWER on IntegriCloud