<rdar://problem/11398407>
Name matching was working inconsistently across many places in LLDB. Anyone doing name lookups where you want to look for all types of names should used "eFunctionNameTypeAuto" as the sole name type mask. This will ensure that we get consistent "lookup function by name" results. We had many function calls using as mask like "eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector". This was due to the function lookup by name evolving over time, but as it stands today, use eFunctionNameTypeAuto when you want general name lookups. Either ModuleList::FindFunctions() or Module::FindFunctions() will figure out the right kinds of names to lookup and remove the "eFunctionNameTypeAuto" and replace it with the exact subset of what the name can be.
This checkin also changes eFunctionNameTypeAny over to use eFunctionNameTypeAuto to reflect this.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@182179 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Commands/CommandObjectTarget.cpp b/source/Commands/CommandObjectTarget.cpp
index 7765352..f6aafec 100644
--- a/source/Commands/CommandObjectTarget.cpp
+++ b/source/Commands/CommandObjectTarget.cpp
@@ -1676,7 +1676,7 @@
ConstString function_name (name);
num_matches = module->FindFunctions (function_name,
NULL,
- eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
append,
diff --git a/source/Core/AddressResolverName.cpp b/source/Core/AddressResolverName.cpp
index c8b9db8..dd22e17 100644
--- a/source/Core/AddressResolverName.cpp
+++ b/source/Core/AddressResolverName.cpp
@@ -120,7 +120,7 @@
sym_list);
context.module_sp->FindFunctions (m_func_name,
NULL,
- eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
append,
diff --git a/source/Core/Disassembler.cpp b/source/Core/Disassembler.cpp
index b5497b4..0f5ed87 100644
--- a/source/Core/Disassembler.cpp
+++ b/source/Core/Disassembler.cpp
@@ -194,10 +194,7 @@
{
module->FindFunctions (name,
NULL,
- eFunctionNameTypeBase |
- eFunctionNameTypeFull |
- eFunctionNameTypeMethod |
- eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
true,
@@ -206,10 +203,7 @@
else if (exe_ctx.GetTargetPtr())
{
exe_ctx.GetTargetPtr()->GetImages().FindFunctions (name,
- eFunctionNameTypeBase |
- eFunctionNameTypeFull |
- eFunctionNameTypeMethod |
- eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
false,
diff --git a/source/Core/Module.cpp b/source/Core/Module.cpp
index de39a98..7ce0c1b 100644
--- a/source/Core/Module.cpp
+++ b/source/Core/Module.cpp
@@ -1438,8 +1438,19 @@
if (ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))
lookup_name_type_mask |= eFunctionNameTypeSelector;
- if (CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end))
+ CPPLanguageRuntime::MethodName cpp_method (name);
+ llvm::StringRef basename (cpp_method.GetBasename());
+ if (basename.empty())
+ {
+ if (CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end))
+ lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
+ }
+ else
+ {
+ base_name_start = basename.data();
+ base_name_end = base_name_start + basename.size();
lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
+ }
}
}
else
@@ -1449,11 +1460,30 @@
{
// If they've asked for a CPP method or function name and it can't be that, we don't
// even need to search for CPP methods or names.
- if (!CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end))
+ CPPLanguageRuntime::MethodName cpp_method (name);
+ if (cpp_method.IsValid())
{
- lookup_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase);
- if (lookup_name_type_mask == eFunctionNameTypeNone)
- return;
+ llvm::StringRef basename (cpp_method.GetBasename());
+ base_name_start = basename.data();
+ base_name_end = base_name_start + basename.size();
+
+ if (!cpp_method.GetQualifiers().empty())
+ {
+ // There is a "const" or other qualifer following the end of the fucntion parens,
+ // this can't be a eFunctionNameTypeBase
+ lookup_name_type_mask &= ~(eFunctionNameTypeBase);
+ if (lookup_name_type_mask == eFunctionNameTypeNone)
+ return;
+ }
+ }
+ else
+ {
+ if (!CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end))
+ {
+ lookup_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase);
+ if (lookup_name_type_mask == eFunctionNameTypeNone)
+ return;
+ }
}
}
diff --git a/source/Symbol/Symtab.cpp b/source/Symbol/Symtab.cpp
index c0f241e..b4c7554 100644
--- a/source/Symbol/Symtab.cpp
+++ b/source/Symbol/Symtab.cpp
@@ -320,7 +320,7 @@
entry.cstring[2] != 'Z')) // named local entities (if we eventually handle eSymbolTypeData, we will want this back)
{
CPPLanguageRuntime::MethodName cxx_method (mangled.GetDemangledName());
- entry.cstring = cxx_method.GetBasename ().GetCString();
+ entry.cstring = ConstString(cxx_method.GetBasename()).GetCString();
if (entry.cstring && entry.cstring[0])
{
// ConstString objects permanently store the string in the pool so calling
diff --git a/source/Target/CPPLanguageRuntime.cpp b/source/Target/CPPLanguageRuntime.cpp
index b020e0a..f5b7f7f 100644
--- a/source/Target/CPPLanguageRuntime.cpp
+++ b/source/Target/CPPLanguageRuntime.cpp
@@ -9,6 +9,8 @@
#include "lldb/Target/CPPLanguageRuntime.h"
+#include <string.h>
+
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/UniqueCStringMap.h"
#include "lldb/Target/ExecutionContext.h"
@@ -193,15 +195,7 @@
if (base_name_end == NULL)
base_name_end = name + strlen (name);
- const char *last_colon = NULL;
- for (const char *ptr = base_name_end; ptr != name; ptr--)
- {
- if (*ptr == ':')
- {
- last_colon = ptr;
- break;
- }
- }
+ const char *last_colon = strrchr (name, ':');
if (last_colon == NULL)
{
@@ -221,36 +215,6 @@
return true;
}
}
-bool
-CPPLanguageRuntime::IsPossibleCPPCall (const char *name, const char *&base_name_start, const char *&base_name_end)
-{
- if (!name)
- return false;
- // For now, I really can't handle taking template names apart, so if you
- // have < or > I'll say "could be CPP but leave the base_name empty which
- // means I couldn't figure out what to use for that.
- // FIXME: Do I need to do more sanity checking here?
-
- if (strchr(name, '>') != NULL || strchr (name, '>') != NULL)
- return true;
-
- size_t name_len = strlen (name);
-
- if (name[name_len - 1] == ')')
- {
- // We've got arguments.
- base_name_end = strchr (name, '(');
- if (base_name_end == NULL)
- return false;
-
- // FIXME: should check that this parenthesis isn't a template specialized
- // on a function type or something gross like that...
- }
- else
- base_name_end = name + strlen (name);
-
- return StripNamespacesFromVariableName (name, base_name_start, base_name_end);
-}
uint32_t
CPPLanguageRuntime::FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents)
@@ -272,7 +236,7 @@
CPPLanguageRuntime::MethodName::Clear()
{
m_full.Clear();
- m_basename.Clear();
+ m_basename = llvm::StringRef();
m_context = llvm::StringRef();
m_arguments = llvm::StringRef();
m_qualifiers = llvm::StringRef();
@@ -356,12 +320,12 @@
context_end = full.rfind(':', basename_end);
if (context_end == llvm::StringRef::npos)
- m_basename.SetString(full.substr(0, basename_end));
+ m_basename = full.substr(0, basename_end);
else
{
m_context = full.substr(0, context_end - 1);
const size_t basename_begin = context_end + 1;
- m_basename.SetString(full.substr(basename_begin, basename_end - basename_begin));
+ m_basename = full.substr(basename_begin, basename_end - basename_begin);
}
m_type = eTypeUnknownMethod;
}
@@ -388,7 +352,7 @@
}
}
-const ConstString &
+llvm::StringRef
CPPLanguageRuntime::MethodName::GetBasename ()
{
if (!m_parsed)