diff options
author | Greg Clayton <gclayton@apple.com> | 2013-05-18 00:11:21 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2013-05-18 00:11:21 +0000 |
commit | 6ecb232b311f44a24ceca1f22bb00838dc3cc8f1 (patch) | |
tree | a52db0d7d3d1272f75704cc85ab6bb6e4fe9f5b6 /lldb/source/Core | |
parent | b39fc142fd1bf628e7c99254f9ec94eb5584a374 (diff) | |
download | bcm5719-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.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Core/Disassembler.cpp | 10 | ||||
-rw-r--r-- | lldb/source/Core/Module.cpp | 40 |
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; + } } } |