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.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index b063d1647d7..d27b30eabfa 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -389,7 +389,7 @@ ModuleList::FindModule (const UUID &uuid)
uint32_t
-ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
+ModuleList::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
{
Mutex::Locker locker(m_modules_mutex);
@@ -409,6 +409,40 @@ ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool ap
return total_matches;
}
+// depending on implementation details, type lookup might fail because of
+// embedded spurious namespace:: prefixes. this call strips them, paying
+// attention to the fact that a type might have namespace'd type names as
+// arguments to templates, and those must not be stripped off
+static const char*
+StripTypeName(const char* name_cstr)
+{
+ const char* skip_namespace = strstr(name_cstr, "::");
+ const char* template_arg_char = strchr(name_cstr, '<');
+ while (skip_namespace != NULL)
+ {
+ if (template_arg_char != NULL &&
+ skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
+ break;
+ name_cstr = skip_namespace+2;
+ skip_namespace = strstr(name_cstr, "::");
+ }
+ return name_cstr;
+}
+
+uint32_t
+ModuleList::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
+{
+ uint32_t retval = FindTypes_Impl(sc, name, append, max_matches, types);
+
+ if (retval == 0)
+ {
+ const char *stripped = StripTypeName(name.GetCString());
+ return FindTypes_Impl(sc, ConstString(stripped), append, max_matches, types);
+ }
+ else
+ return retval;
+
+}
ModuleSP
ModuleList::FindFirstModuleForFileSpec (const FileSpec &file_spec,
OpenPOWER on IntegriCloud