Skip to content

Commit a4d62ca

Browse files
committed
[LLDB] Refactor Module::LookupInfo constructor and move out CPlusPlusLanguage::MethodName to break lldb-server dependencies
This patch addresses the issue #129543. After this patch the size of lldb-server is reduced by 9MB. Based on swiftlang#3240 by @bulbazord Alex Langford
1 parent edc22c6 commit a4d62ca

File tree

16 files changed

+524
-453
lines changed

16 files changed

+524
-453
lines changed

lldb/include/lldb/Target/Language.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,11 @@ class Language : public PluginInterface {
214214
return std::vector<Language::MethodNameVariant>();
215215
};
216216

217+
virtual std::pair<lldb::FunctionNameType, llvm::StringRef>
218+
GetFunctionNameInfo(ConstString name) const {
219+
return std::pair{lldb::eFunctionNameTypeNone, llvm::StringRef()};
220+
};
221+
217222
/// Returns true iff the given symbol name is compatible with the mangling
218223
/// scheme of this language.
219224
///

lldb/source/Core/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ add_lldb_library(lldbCore
7272
lldbValueObject
7373
lldbVersion
7474
lldbPluginCPlusPlusLanguage
75-
lldbPluginObjCLanguage
7675
${LLDB_CURSES_LIBS}
7776

7877
CLANG_LIBS

lldb/source/Core/Module.cpp

Lines changed: 53 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@
5252
#include "lldb/Host/windows/PosixApi.h"
5353
#endif
5454

55-
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
56-
#include "Plugins/Language/ObjC/ObjCLanguage.h"
55+
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguageMethod.h"
5756

5857
#include "llvm/ADT/STLExtras.h"
5958
#include "llvm/Support/Compiler.h"
@@ -641,98 +640,75 @@ void Module::FindCompileUnits(const FileSpec &path,
641640
Module::LookupInfo::LookupInfo(ConstString name,
642641
FunctionNameType name_type_mask,
643642
LanguageType language)
644-
: m_name(name), m_lookup_name(), m_language(language) {
645-
const char *name_cstr = name.GetCString();
643+
: m_name(name), m_lookup_name(name), m_language(language) {
646644
llvm::StringRef basename;
647-
llvm::StringRef context;
645+
646+
std::vector<Language *> languages;
647+
auto collect_language_plugins = [&languages](Language *lang) {
648+
languages.push_back(lang);
649+
return true;
650+
};
648651

649652
if (name_type_mask & eFunctionNameTypeAuto) {
650-
if (CPlusPlusLanguage::IsCPPMangledName(name_cstr))
651-
m_name_type_mask = eFunctionNameTypeFull;
652-
else if ((language == eLanguageTypeUnknown ||
653-
Language::LanguageIsObjC(language)) &&
654-
ObjCLanguage::IsPossibleObjCMethodName(name_cstr))
655-
m_name_type_mask = eFunctionNameTypeFull;
656-
else if (Language::LanguageIsC(language)) {
657-
m_name_type_mask = eFunctionNameTypeFull;
653+
if (language == eLanguageTypeUnknown) {
654+
Language::ForEach(collect_language_plugins);
655+
for (Language *lang : languages) {
656+
auto info = lang->GetFunctionNameInfo(name);
657+
if (info.first != eFunctionNameTypeNone) {
658+
m_name_type_mask |= info.first;
659+
basename = info.second;
660+
break;
661+
}
662+
}
658663
} else {
659-
if ((language == eLanguageTypeUnknown ||
660-
Language::LanguageIsObjC(language)) &&
661-
ObjCLanguage::IsPossibleObjCSelector(name_cstr))
662-
m_name_type_mask |= eFunctionNameTypeSelector;
663-
664-
CPlusPlusLanguage::MethodName cpp_method(name);
665-
basename = cpp_method.GetBasename();
666-
if (basename.empty()) {
667-
if (CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
668-
basename))
669-
m_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
670-
else
671-
m_name_type_mask |= eFunctionNameTypeFull;
672-
} else {
673-
m_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
664+
if (auto *lang = Language::FindPlugin(language)) {
665+
auto info = lang->GetFunctionNameInfo(name);
666+
m_name_type_mask = info.first;
667+
basename = info.second;
674668
}
675669
}
670+
671+
// NOTE: There are several ways to get here, but this is a fallback path in
672+
// case the above does not succeed at extracting any useful information from
673+
// the loaded language plugins.
674+
if (m_name_type_mask == eFunctionNameTypeNone)
675+
m_name_type_mask = eFunctionNameTypeFull;
676+
676677
} else {
677678
m_name_type_mask = name_type_mask;
678-
if (name_type_mask & eFunctionNameTypeMethod ||
679-
name_type_mask & eFunctionNameTypeBase) {
680-
// If they've asked for a CPP method or function name and it can't be
681-
// that, we don't even need to search for CPP methods or names.
682-
CPlusPlusLanguage::MethodName cpp_method(name);
683-
if (cpp_method.IsValid()) {
684-
basename = cpp_method.GetBasename();
685-
686-
if (!cpp_method.GetQualifiers().empty()) {
687-
// There is a "const" or other qualifier following the end of the
688-
// function parens, this can't be a eFunctionNameTypeBase
689-
m_name_type_mask &= ~(eFunctionNameTypeBase);
690-
if (m_name_type_mask == eFunctionNameTypeNone)
691-
return;
679+
if (language == eLanguageTypeUnknown) {
680+
Language::ForEach(collect_language_plugins);
681+
for (Language *lang : languages) {
682+
auto info = lang->GetFunctionNameInfo(name);
683+
if (info.first & m_name_type_mask) {
684+
m_name_type_mask &= info.first;
685+
basename = info.second;
686+
break;
692687
}
693-
} else {
694-
// If the CPP method parser didn't manage to chop this up, try to fill
695-
// in the base name if we can. If a::b::c is passed in, we need to just
696-
// look up "c", and then we'll filter the result later.
697-
CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
698-
basename);
699-
}
700-
}
701-
702-
if (name_type_mask & eFunctionNameTypeSelector) {
703-
if (!ObjCLanguage::IsPossibleObjCSelector(name_cstr)) {
704-
m_name_type_mask &= ~(eFunctionNameTypeSelector);
705-
if (m_name_type_mask == eFunctionNameTypeNone)
706-
return;
707688
}
708-
}
709-
710-
// Still try and get a basename in case someone specifies a name type mask
711-
// of eFunctionNameTypeFull and a name like "A::func"
712-
if (basename.empty()) {
713-
if (name_type_mask & eFunctionNameTypeFull &&
714-
!CPlusPlusLanguage::IsCPPMangledName(name_cstr)) {
715-
CPlusPlusLanguage::MethodName cpp_method(name);
716-
basename = cpp_method.GetBasename();
717-
if (basename.empty())
718-
CPlusPlusLanguage::ExtractContextAndIdentifier(name_cstr, context,
719-
basename);
689+
} else {
690+
if (auto *lang = Language::FindPlugin(language)) {
691+
auto info = lang->GetFunctionNameInfo(name);
692+
if (info.first & m_name_type_mask) {
693+
// If the user asked for FunctionNameTypes that aren't possible,
694+
// then filter those out. (e.g. asking for Selectors on
695+
// C++ symbols, or even if the symbol given can't be a selector in
696+
// ObjC)
697+
m_name_type_mask &= info.first;
698+
basename = info.second;
699+
}
720700
}
721701
}
722702
}
723703

724704
if (!basename.empty()) {
725-
// The name supplied was a partial C++ path like "a::count". In this case
726-
// we want to do a lookup on the basename "count" and then make sure any
727-
// matching results contain "a::count" so that it would match "b::a::count"
728-
// and "a::count". This is why we set "match_name_after_lookup" to true
705+
// The name supplied was incomplete for lookup purposes. For example, in C++
706+
// we may have gotten something like "a::count". In this case, we want to do
707+
// a lookup on the basename "count" and then make sure any matching results
708+
// contain "a::count" so that it would match "b::a::count" and "a::count".
709+
// This is why we set match_name_after_lookup to true.
729710
m_lookup_name.SetString(basename);
730711
m_match_name_after_lookup = true;
731-
} else {
732-
// The name is already correct, just use the exact name as supplied, and we
733-
// won't need to check if any matches contain "name"
734-
m_lookup_name = name;
735-
m_match_name_after_lookup = false;
736712
}
737713
}
738714

lldb/source/Core/RichManglingContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "lldb/Core/RichManglingContext.h"
10-
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
10+
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguageMethod.h"
1111
#include "lldb/Utility/LLDBLog.h"
1212

1313
#include "llvm/ADT/StringRef.h"

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
#include "clang/AST/DeclarationName.h"
5757
#include "clang/AST/RecursiveASTVisitor.h"
5858

59-
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
59+
#include "Plugins/Language/CPlusPlus/CPlusPlusLanguageMethod.h"
6060
#include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h"
6161
#include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
6262

@@ -1809,10 +1809,11 @@ void ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
18091809

18101810
const auto lang = function->GetCompileUnit()->GetLanguage();
18111811
const auto name = function->GetMangled().GetMangledName().AsCString();
1812-
const bool extern_c = (Language::LanguageIsC(lang) &&
1813-
!CPlusPlusLanguage::IsCPPMangledName(name)) ||
1814-
(Language::LanguageIsObjC(lang) &&
1815-
!Language::LanguageIsCPlusPlus(lang));
1812+
const bool extern_c =
1813+
(Language::LanguageIsC(lang) &&
1814+
!CPlusPlusLanguage::MethodName::IsCPPMangledName(name)) ||
1815+
(Language::LanguageIsObjC(lang) &&
1816+
!Language::LanguageIsCPlusPlus(lang));
18161817

18171818
if (!extern_c) {
18181819
TypeSystem *type_system = function->GetDeclContext().GetTypeSystem();
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
add_subdirectory(ClangCommon)
2+
3+
# Preserve language plug-ins sorting.
24
add_subdirectory(CPlusPlus)
35
add_subdirectory(ObjC)
46
add_subdirectory(ObjCPlusPlus)

lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ add_lldb_library(lldbPluginCPlusPlusLanguage PLUGIN
22
BlockPointer.cpp
33
Coroutines.cpp
44
CPlusPlusLanguage.cpp
5+
CPlusPlusLanguageMethod.cpp
56
CPlusPlusNameParser.cpp
67
CxxStringTypes.cpp
78
GenericBitset.cpp

0 commit comments

Comments
 (0)