summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2013-05-18 00:11:21 +0000
committerGreg Clayton <gclayton@apple.com>2013-05-18 00:11:21 +0000
commit6ecb232b311f44a24ceca1f22bb00838dc3cc8f1 (patch)
treea52db0d7d3d1272f75704cc85ab6bb6e4fe9f5b6 /lldb/source/Core
parentb39fc142fd1bf628e7c99254f9ec94eb5584a374 (diff)
downloadbcm5719-llvm-6ecb232b311f44a24ceca1f22bb00838dc3cc8f1.tar.gz
bcm5719-llvm-6ecb232b311f44a24ceca1f22bb00838dc3cc8f1.zip
<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. llvm-svn: 182179
Diffstat (limited to 'lldb/source/Core')
-rw-r--r--lldb/source/Core/AddressResolverName.cpp2
-rw-r--r--lldb/source/Core/Disassembler.cpp10
-rw-r--r--lldb/source/Core/Module.cpp40
3 files changed, 38 insertions, 14 deletions
diff --git a/lldb/source/Core/AddressResolverName.cpp b/lldb/source/Core/AddressResolverName.cpp
index c8b9db896d9..dd22e17402b 100644
--- a/lldb/source/Core/AddressResolverName.cpp
+++ b/lldb/source/Core/AddressResolverName.cpp
@@ -120,7 +120,7 @@ AddressResolverName::SearchCallback
sym_list);
context.module_sp->FindFunctions (m_func_name,
NULL,
- eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
append,
diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp
index b5497b4a9fd..0f5ed872745 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -194,10 +194,7 @@ Disassembler::Disassemble
{
module->FindFunctions (name,
NULL,
- eFunctionNameTypeBase |
- eFunctionNameTypeFull |
- eFunctionNameTypeMethod |
- eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
true,
@@ -206,10 +203,7 @@ Disassembler::Disassemble
else if (exe_ctx.GetTargetPtr())
{
exe_ctx.GetTargetPtr()->GetImages().FindFunctions (name,
- eFunctionNameTypeBase |
- eFunctionNameTypeFull |
- eFunctionNameTypeMethod |
- eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
false,
diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp
index de39a988dd3..7ce0c1b1f26 100644
--- a/lldb/source/Core/Module.cpp
+++ b/lldb/source/Core/Module.cpp
@@ -1438,8 +1438,19 @@ Module::PrepareForFunctionNameLookup (const ConstString &name,
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 @@ Module::PrepareForFunctionNameLookup (const ConstString &name,
{
// 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;
+ }
}
}
OpenPOWER on IntegriCloud