diff options
-rw-r--r-- | lldb/include/lldb/Target/CPPLanguageRuntime.h | 7 | ||||
-rw-r--r-- | lldb/include/lldb/lldb-enumerations.h | 5 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 2 | ||||
-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 | ||||
-rw-r--r-- | lldb/source/Symbol/Symtab.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Target/CPPLanguageRuntime.cpp | 50 |
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) |