forked from OSchip/llvm-project
Revert "[lldb] Refactor Module::LookupInfo constructor"
This reverts commit cd2134e42a
.
Seems like this broke some tests on arm and aarch64 boxes. Will
investigate before re-landing.
This commit is contained in:
parent
d568e5325c
commit
ce512d5c2a
|
@ -896,7 +896,7 @@ public:
|
||||||
LookupInfo() : m_name(), m_lookup_name() {}
|
LookupInfo() : m_name(), m_lookup_name() {}
|
||||||
|
|
||||||
LookupInfo(ConstString name, lldb::FunctionNameType name_type_mask,
|
LookupInfo(ConstString name, lldb::FunctionNameType name_type_mask,
|
||||||
lldb::LanguageType language_type);
|
lldb::LanguageType language);
|
||||||
|
|
||||||
ConstString GetName() const { return m_name; }
|
ConstString GetName() const { return m_name; }
|
||||||
|
|
||||||
|
@ -922,7 +922,7 @@ public:
|
||||||
ConstString m_lookup_name;
|
ConstString m_lookup_name;
|
||||||
|
|
||||||
/// Limit matches to only be for this language
|
/// Limit matches to only be for this language
|
||||||
lldb::LanguageType m_language_type = lldb::eLanguageTypeUnknown;
|
lldb::LanguageType m_language = lldb::eLanguageTypeUnknown;
|
||||||
|
|
||||||
/// One or more bits from lldb::FunctionNameType that indicate what kind of
|
/// One or more bits from lldb::FunctionNameType that indicate what kind of
|
||||||
/// names we are looking for
|
/// names we are looking for
|
||||||
|
|
|
@ -202,20 +202,6 @@ public:
|
||||||
return std::vector<Language::MethodNameVariant>();
|
return std::vector<Language::MethodNameVariant>();
|
||||||
};
|
};
|
||||||
|
|
||||||
class FunctionNameInfo {
|
|
||||||
public:
|
|
||||||
llvm::StringRef basename;
|
|
||||||
llvm::StringRef context;
|
|
||||||
lldb::FunctionNameType func_name_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual Language::FunctionNameInfo
|
|
||||||
GetFunctionNameInfo(ConstString name) const {
|
|
||||||
FunctionNameInfo ret;
|
|
||||||
ret.func_name_type = lldb::eFunctionNameTypeNone;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Returns true iff the given symbol name is compatible with the mangling
|
/// Returns true iff the given symbol name is compatible with the mangling
|
||||||
/// scheme of this language.
|
/// scheme of this language.
|
||||||
///
|
///
|
||||||
|
|
|
@ -82,6 +82,7 @@ add_lldb_library(lldbCore
|
||||||
lldbTarget
|
lldbTarget
|
||||||
lldbUtility
|
lldbUtility
|
||||||
lldbPluginCPlusPlusLanguage
|
lldbPluginCPlusPlusLanguage
|
||||||
|
lldbPluginObjCLanguage
|
||||||
${LLDB_CURSES_LIBS}
|
${LLDB_CURSES_LIBS}
|
||||||
|
|
||||||
CLANG_LIBS
|
CLANG_LIBS
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
|
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
|
||||||
|
#include "Plugins/Language/ObjC/ObjCLanguage.h"
|
||||||
|
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
|
@ -634,81 +635,101 @@ void Module::FindCompileUnits(const FileSpec &path,
|
||||||
|
|
||||||
Module::LookupInfo::LookupInfo(ConstString name,
|
Module::LookupInfo::LookupInfo(ConstString name,
|
||||||
FunctionNameType name_type_mask,
|
FunctionNameType name_type_mask,
|
||||||
LanguageType language_type)
|
LanguageType language)
|
||||||
: m_name(name), m_lookup_name(name), m_language_type(language_type),
|
: m_name(name), m_lookup_name(), m_language(language),
|
||||||
m_name_type_mask(eFunctionNameTypeNone),
|
m_name_type_mask(eFunctionNameTypeNone),
|
||||||
m_match_name_after_lookup(false) {
|
m_match_name_after_lookup(false) {
|
||||||
|
const char *name_cstr = name.GetCString();
|
||||||
llvm::StringRef basename;
|
llvm::StringRef basename;
|
||||||
llvm::StringRef context;
|
llvm::StringRef context;
|
||||||
|
|
||||||
std::vector<Language *> languages;
|
|
||||||
Language::ForEach([&languages](Language *l) {
|
|
||||||
languages.push_back(l);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (name_type_mask & eFunctionNameTypeAuto) {
|
if (name_type_mask & eFunctionNameTypeAuto) {
|
||||||
if (language_type == eLanguageTypeUnknown) {
|
if (CPlusPlusLanguage::IsCPPMangledName(name_cstr))
|
||||||
for (Language *lang : languages) {
|
|
||||||
Language::FunctionNameInfo info = lang->GetFunctionNameInfo(name);
|
|
||||||
if (info.func_name_type != eFunctionNameTypeNone) {
|
|
||||||
m_name_type_mask = info.func_name_type;
|
|
||||||
basename = info.basename;
|
|
||||||
context = info.context;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (auto *lang = Language::FindPlugin(language_type)) {
|
|
||||||
Language::FunctionNameInfo info = lang->GetFunctionNameInfo(name);
|
|
||||||
m_name_type_mask = info.func_name_type;
|
|
||||||
basename = info.basename;
|
|
||||||
context = info.context;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: There are several ways to get here, but this is a fallback path in
|
|
||||||
// case the above does not succeed at extracting any useful information from
|
|
||||||
// the loaded language plugins.
|
|
||||||
if (m_name_type_mask == eFunctionNameTypeNone)
|
|
||||||
m_name_type_mask = eFunctionNameTypeFull;
|
m_name_type_mask = eFunctionNameTypeFull;
|
||||||
|
else if ((language == eLanguageTypeUnknown ||
|
||||||
|
Language::LanguageIsObjC(language)) &&
|
||||||
|
ObjCLanguage::IsPossibleObjCMethodName(name_cstr))
|
||||||
|
m_name_type_mask = eFunctionNameTypeFull;
|
||||||
|
else if (Language::LanguageIsC(language)) {
|
||||||
|
m_name_type_mask = eFunctionNameTypeFull;
|
||||||
|
} else {
|
||||||
|
if ((language == eLanguageTypeUnknown ||
|
||||||
|
Language::LanguageIsObjC(language)) &&
|
||||||
|
ObjCLanguage::IsPossibleObjCSelector(name_cstr))
|
||||||
|
m_name_type_mask |= eFunctionNameTypeSelector;
|
||||||
|
|
||||||
|
CPlusPlusLanguage::MethodName cpp_method(name);
|
||||||
|
basename = cpp_method.GetBasename();
|
||||||
|
if (basename.empty()) {
|
||||||
|
if (CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
|
||||||
|
basename))
|
||||||
|
m_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
|
||||||
|
else
|
||||||
|
m_name_type_mask |= eFunctionNameTypeFull;
|
||||||
|
} else {
|
||||||
|
m_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m_name_type_mask = name_type_mask;
|
m_name_type_mask = name_type_mask;
|
||||||
if (language_type != eLanguageTypeUnknown) {
|
if (name_type_mask & eFunctionNameTypeMethod ||
|
||||||
if (auto *lang = Language::FindPlugin(language_type)) {
|
name_type_mask & eFunctionNameTypeBase) {
|
||||||
Language::FunctionNameInfo info = lang->GetFunctionNameInfo(name);
|
// If they've asked for a CPP method or function name and it can't be
|
||||||
if (info.func_name_type & m_name_type_mask) {
|
// that, we don't even need to search for CPP methods or names.
|
||||||
// If the user asked for FunctionNameTypes that aren't possible,
|
CPlusPlusLanguage::MethodName cpp_method(name);
|
||||||
// then filter those out. (e.g. asking for Selectors on
|
if (cpp_method.IsValid()) {
|
||||||
// C++ symbols, or even if the symbol given can't be a selector in
|
basename = cpp_method.GetBasename();
|
||||||
// ObjC)
|
|
||||||
m_name_type_mask &= info.func_name_type;
|
if (!cpp_method.GetQualifiers().empty()) {
|
||||||
basename = info.basename;
|
// There is a "const" or other qualifier following the end of the
|
||||||
context = info.context;
|
// function parens, this can't be a eFunctionNameTypeBase
|
||||||
}
|
m_name_type_mask &= ~(eFunctionNameTypeBase);
|
||||||
|
if (m_name_type_mask == eFunctionNameTypeNone)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (Language *lang : languages) {
|
// If the CPP method parser didn't manage to chop this up, try to fill
|
||||||
Language::FunctionNameInfo info = lang->GetFunctionNameInfo(name);
|
// in the base name if we can. If a::b::c is passed in, we need to just
|
||||||
if (info.func_name_type & m_name_type_mask) {
|
// look up "c", and then we'll filter the result later.
|
||||||
m_name_type_mask &= info.func_name_type;
|
CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
|
||||||
basename = info.basename;
|
basename);
|
||||||
context = info.context;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name_type_mask & eFunctionNameTypeSelector) {
|
||||||
|
if (!ObjCLanguage::IsPossibleObjCSelector(name_cstr)) {
|
||||||
|
m_name_type_mask &= ~(eFunctionNameTypeSelector);
|
||||||
|
if (m_name_type_mask == eFunctionNameTypeNone)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Still try and get a basename in case someone specifies a name type mask
|
||||||
|
// of eFunctionNameTypeFull and a name like "A::func"
|
||||||
|
if (basename.empty()) {
|
||||||
|
if (name_type_mask & eFunctionNameTypeFull &&
|
||||||
|
!CPlusPlusLanguage::IsCPPMangledName(name_cstr)) {
|
||||||
|
CPlusPlusLanguage::MethodName cpp_method(name);
|
||||||
|
basename = cpp_method.GetBasename();
|
||||||
|
if (basename.empty())
|
||||||
|
CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
|
||||||
|
basename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!basename.empty()) {
|
if (!basename.empty()) {
|
||||||
// The name supplied was incomplete for lookup purposes. For example, in C++
|
// The name supplied was a partial C++ path like "a::count". In this case
|
||||||
// we may have gotten something like "a::count". In this case, we want to do
|
// we want to do a lookup on the basename "count" and then make sure any
|
||||||
// a lookup on the basename "count" and then make sure any matching results
|
// matching results contain "a::count" so that it would match "b::a::count"
|
||||||
// contain "a::count" so that it would match "b::a::count" and "a::count".
|
// and "a::count". This is why we set "match_name_after_lookup" to true
|
||||||
// This is why we set match_name_after_lookup to true.
|
|
||||||
m_lookup_name.SetString(basename);
|
m_lookup_name.SetString(basename);
|
||||||
m_match_name_after_lookup = true;
|
m_match_name_after_lookup = true;
|
||||||
|
} else {
|
||||||
|
// The name is already correct, just use the exact name as supplied, and we
|
||||||
|
// won't need to check if any matches contain "name"
|
||||||
|
m_lookup_name = name;
|
||||||
|
m_match_name_after_lookup = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,39 +59,6 @@ lldb_private::ConstString CPlusPlusLanguage::GetPluginNameStatic() {
|
||||||
return g_name;
|
return g_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Language::FunctionNameInfo
|
|
||||||
CPlusPlusLanguage::GetFunctionNameInfo(ConstString name) const {
|
|
||||||
FunctionNameInfo info;
|
|
||||||
info.func_name_type = lldb::eFunctionNameTypeNone;
|
|
||||||
|
|
||||||
if (IsCPPMangledName(name.GetCString())) {
|
|
||||||
info.func_name_type = lldb::eFunctionNameTypeFull;
|
|
||||||
}
|
|
||||||
|
|
||||||
CPlusPlusLanguage::MethodName method(name);
|
|
||||||
llvm::StringRef basename = method.GetBasename();
|
|
||||||
if (basename.empty()) {
|
|
||||||
if (CPlusPlusLanguage::ExtractContextAndIdentifier(
|
|
||||||
name.GetCString(), info.context, info.basename)) {
|
|
||||||
info.func_name_type |=
|
|
||||||
(lldb::eFunctionNameTypeMethod | eFunctionNameTypeBase);
|
|
||||||
} else {
|
|
||||||
info.func_name_type |= lldb::eFunctionNameTypeFull;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
info.func_name_type |=
|
|
||||||
(lldb::eFunctionNameTypeMethod | eFunctionNameTypeBase);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!method.GetQualifiers().empty()) {
|
|
||||||
// There is a 'const' or other qualifier following the end of the function
|
|
||||||
// parens, this can't be a eFunctionNameTypeBase.
|
|
||||||
info.func_name_type &= ~(lldb::eFunctionNameTypeBase);
|
|
||||||
}
|
|
||||||
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
|
bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
|
||||||
const char *mangled_name = mangled.GetMangledName().GetCString();
|
const char *mangled_name = mangled.GetMangledName().GetCString();
|
||||||
return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name);
|
return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name);
|
||||||
|
|
|
@ -104,9 +104,6 @@ public:
|
||||||
|
|
||||||
static lldb_private::ConstString GetPluginNameStatic();
|
static lldb_private::ConstString GetPluginNameStatic();
|
||||||
|
|
||||||
Language::FunctionNameInfo
|
|
||||||
GetFunctionNameInfo(ConstString name) const override;
|
|
||||||
|
|
||||||
bool SymbolNameFitsToLanguage(Mangled mangled) const override;
|
bool SymbolNameFitsToLanguage(Mangled mangled) const override;
|
||||||
|
|
||||||
ConstString
|
ConstString
|
||||||
|
|
|
@ -275,22 +275,6 @@ ObjCLanguage::GetMethodNameVariants(ConstString method_name) const {
|
||||||
return variant_names;
|
return variant_names;
|
||||||
}
|
}
|
||||||
|
|
||||||
Language::FunctionNameInfo
|
|
||||||
ObjCLanguage::GetFunctionNameInfo(ConstString name) const {
|
|
||||||
Language::FunctionNameInfo info;
|
|
||||||
info.func_name_type = lldb::eFunctionNameTypeNone;
|
|
||||||
|
|
||||||
if (ObjCLanguage::IsPossibleObjCMethodName(name.GetCString())) {
|
|
||||||
info.func_name_type = lldb::eFunctionNameTypeFull;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ObjCLanguage::IsPossibleObjCSelector(name.GetCString())) {
|
|
||||||
info.func_name_type |= lldb::eFunctionNameTypeSelector;
|
|
||||||
}
|
|
||||||
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ObjCLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
|
bool ObjCLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
|
||||||
ConstString demangled_name = mangled.GetDemangledName();
|
ConstString demangled_name = mangled.GetDemangledName();
|
||||||
if (!demangled_name)
|
if (!demangled_name)
|
||||||
|
|
|
@ -104,9 +104,6 @@ public:
|
||||||
std::vector<Language::MethodNameVariant>
|
std::vector<Language::MethodNameVariant>
|
||||||
GetMethodNameVariants(ConstString method_name) const override;
|
GetMethodNameVariants(ConstString method_name) const override;
|
||||||
|
|
||||||
Language::FunctionNameInfo
|
|
||||||
GetFunctionNameInfo(ConstString name) const override;
|
|
||||||
|
|
||||||
bool SymbolNameFitsToLanguage(Mangled mangled) const override;
|
bool SymbolNameFitsToLanguage(Mangled mangled) const override;
|
||||||
|
|
||||||
lldb::TypeCategoryImplSP GetFormatters() override;
|
lldb::TypeCategoryImplSP GetFormatters() override;
|
||||||
|
|
Loading…
Reference in New Issue