Check for lack of C++ context first when demangling

Summary: It seems that if we have no context, then it can't possibly be a method.  Check that first.

Reviewers: clayborg

Reviewed By: clayborg

Subscribers: labath, lldb-commits

Differential Revision: https://reviews.llvm.org/D32708
Patch by Scott Smith <scott.smith@purestorage.com>.

llvm-svn: 302008
This commit is contained in:
Pavel Labath 2017-05-03 10:00:00 +00:00
parent c60b4510ea
commit 9075f52c78
1 changed files with 17 additions and 18 deletions

View File

@ -299,17 +299,24 @@ void Symtab::InitNameIndexes() {
const char *const_context =
ConstString(cxx_method.GetContext()).GetCString();
entry_ref = entry.cstring.GetStringRef();
if (entry_ref[0] == '~' ||
!cxx_method.GetQualifiers().empty()) {
// The first character of the demangled basename is '~' which
// means we have a class destructor. We can use this information
// to help us know what is a class and what isn't.
if (class_contexts.find(const_context) == class_contexts.end())
class_contexts.insert(const_context);
m_method_to_index.Append(entry);
if (!const_context || const_context[0] == 0) {
// No context for this function so this has to be a basename
m_basename_to_index.Append(entry);
// If there is no context (no namespaces or class scopes that
// come before the function name) then this also could be a
// fullname.
m_name_to_index.Append(entry);
} else {
if (const_context && const_context[0]) {
entry_ref = entry.cstring.GetStringRef();
if (entry_ref[0] == '~' ||
!cxx_method.GetQualifiers().empty()) {
// The first character of the demangled basename is '~' which
// means we have a class destructor. We can use this information
// to help us know what is a class and what isn't.
if (class_contexts.find(const_context) == class_contexts.end())
class_contexts.insert(const_context);
m_method_to_index.Append(entry);
} else {
if (class_contexts.find(const_context) !=
class_contexts.end()) {
// The current decl context is in our "class_contexts" which
@ -326,14 +333,6 @@ void Symtab::InitNameIndexes() {
mangled_name_to_index.Append(entry);
symbol_contexts[entry.value] = const_context;
}
} else {
// No context for this function so this has to be a basename
m_basename_to_index.Append(entry);
// If there is no context (no namespaces or class scopes that
// come before the function name) then this also could be a
// fullname.
if (cxx_method.GetContext().empty())
m_name_to_index.Append(entry);
}
}
}