summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Target/CPPLanguageRuntime.h7
-rw-r--r--lldb/include/lldb/lldb-enumerations.h5
-rw-r--r--lldb/source/Commands/CommandObjectTarget.cpp2
-rw-r--r--lldb/source/Core/AddressResolverName.cpp2
-rw-r--r--lldb/source/Core/Disassembler.cpp10
-rw-r--r--lldb/source/Core/Module.cpp40
-rw-r--r--lldb/source/Symbol/Symtab.cpp2
-rw-r--r--lldb/source/Target/CPPLanguageRuntime.cpp50
8 files changed, 50 insertions, 68 deletions
diff --git a/lldb/include/lldb/Target/CPPLanguageRuntime.h b/lldb/include/lldb/Target/CPPLanguageRuntime.h
index bfa08e19b23..98a4ab88cb2 100644
--- a/lldb/include/lldb/Target/CPPLanguageRuntime.h
+++ b/lldb/include/lldb/Target/CPPLanguageRuntime.h
@@ -86,7 +86,7 @@ public:
return m_full;
}
- const ConstString &
+ llvm::StringRef
GetBasename ();
llvm::StringRef
@@ -103,7 +103,7 @@ public:
Parse();
ConstString m_full; // Full name: "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const"
- ConstString m_basename; // Basename: "GetBreakpointAtIndex"
+ llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex"
llvm::StringRef m_context; // Decl context: "lldb::SBTarget"
llvm::StringRef m_arguments; // Arguments: "(unsigned int)"
llvm::StringRef m_qualifiers; // Qualifiers: "const"
@@ -134,9 +134,6 @@ public:
IsCPPMangledName(const char *name);
static bool
- IsPossibleCPPCall (const char *name, const char *&base_name_start, const char *&base_name_end);
-
- static bool
StripNamespacesFromVariableName (const char *name, const char *&base_name_start, const char *&base_name_end);
// in some cases, compilers will output different names for one same type. when tht happens, it might be impossible
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index 307556a72e0..cfc68f19732 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -541,10 +541,7 @@ namespace lldb {
// methods or selectors will be searched.
eFunctionNameTypeMethod = (1u << 4), // Find function by method name (C++) with no namespace or arguments
eFunctionNameTypeSelector = (1u << 5), // Find function by selector name (ObjC) names
- eFunctionNameTypeAny = (eFunctionNameTypeFull |
- eFunctionNameTypeBase |
- eFunctionNameTypeMethod |
- eFunctionNameTypeSelector )
+ eFunctionNameTypeAny = eFunctionNameTypeAuto // DEPRECATED: use eFunctionNameTypeAuto
} FunctionNameType;
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 7765352922a..f6aafec29b6 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -1676,7 +1676,7 @@ LookupFunctionInModule (CommandInterpreter &interpreter,
ConstString function_name (name);
num_matches = module->FindFunctions (function_name,
NULL,
- eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ eFunctionNameTypeAuto,
include_symbols,
include_inlines,
append,
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;
+ }
}
}
diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp
index c0f241ec953..b4c7554ac79 100644
--- a/lldb/source/Symbol/Symtab.cpp
+++ b/lldb/source/Symbol/Symtab.cpp
@@ -320,7 +320,7 @@ Symtab::InitNameIndexes()
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/lldb/source/Target/CPPLanguageRuntime.cpp b/lldb/source/Target/CPPLanguageRuntime.cpp
index b020e0af18a..f5b7f7fc41a 100644
--- a/lldb/source/Target/CPPLanguageRuntime.cpp
+++ b/lldb/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 @@ CPPLanguageRuntime::StripNamespacesFromVariableName (const char *name, const cha
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 @@ CPPLanguageRuntime::StripNamespacesFromVariableName (const char *name, const cha
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 @@ void
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 @@ CPPLanguageRuntime::MethodName::Parse()
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 @@ CPPLanguageRuntime::MethodName::Parse()
}
}
-const ConstString &
+llvm::StringRef
CPPLanguageRuntime::MethodName::GetBasename ()
{
if (!m_parsed)
OpenPOWER on IntegriCloud