bulbazord created this revision. bulbazord added reviewers: clayborg, teemperor, jingham, JDevlieghere, labath. bulbazord requested review of this revision. Herald added a project: LLDB.
I have 2 goals with this change: 1. Disambiguate between CPlusPlus::FindAlternateFunctionManglings and IRExecutionUnit::FindBestAlternateMangledName. These are named very similar things, they try to do very similar things, but their approaches are different. This change should make it clear that one is generating possible alternate manglings (through some heuristics-based approach) and the other is finding alternate manglings (through searching the SymbolFile for potential matches). 2. Change GenerateAlternateFunctionManglings from a static method in CPlusPlusLanguage to a virtual method in Language. This will allow us to remove a direct use of CPlusPlusLanguage in IRExecutionUnit, further pushing it to be more general. This change doesn't meet this goal completely but allows for it to happen later. Though this doesn't remove IRExecutionUnit's dependency on CPlusPlusLanguage, it does bring us closer to that goal. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D109785 Files: lldb/include/lldb/Target/Language.h lldb/source/Expression/IRExecutionUnit.cpp lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
Index: lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp =================================================================== --- lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp +++ lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" #include "Plugins/Language/CPlusPlus/CPlusPlusNameParser.h" +#include "TestingSupport/SubsystemRAII.h" +#include "lldb/lldb-enumerations.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -185,29 +187,32 @@ "operator<=><A::B>", context, basename)); } -static std::set<std::string> FindAlternate(llvm::StringRef Name) { - std::set<ConstString> Results; - uint32_t Count = CPlusPlusLanguage::FindAlternateFunctionManglings( - ConstString(Name), Results); - EXPECT_EQ(Count, Results.size()); +static std::set<std::string> GenerateAlternate(llvm::StringRef Name) { std::set<std::string> Strings; - for (ConstString Str : Results) - Strings.insert(std::string(Str.GetStringRef())); + if (Language *CPlusPlusLang = + Language::FindPlugin(lldb::eLanguageTypeC_plus_plus)) { + std::set<ConstString> Results = + CPlusPlusLang->GenerateAlternateFunctionManglings(ConstString(Name)); + for (ConstString Str : Results) + Strings.insert(std::string(Str.GetStringRef())); + } return Strings; } -TEST(CPlusPlusLanguage, FindAlternateFunctionManglings) { +TEST(CPlusPlusLanguage, GenerateAlternateFunctionManglings) { using namespace testing; - EXPECT_THAT(FindAlternate("_ZN1A1fEv"), + SubsystemRAII<CPlusPlusLanguage> lang; + + EXPECT_THAT(GenerateAlternate("_ZN1A1fEv"), UnorderedElementsAre("_ZNK1A1fEv", "_ZLN1A1fEv")); - EXPECT_THAT(FindAlternate("_ZN1A1fEa"), Contains("_ZN1A1fEc")); - EXPECT_THAT(FindAlternate("_ZN1A1fEx"), Contains("_ZN1A1fEl")); - EXPECT_THAT(FindAlternate("_ZN1A1fEy"), Contains("_ZN1A1fEm")); - EXPECT_THAT(FindAlternate("_ZN1A1fEai"), Contains("_ZN1A1fEci")); - EXPECT_THAT(FindAlternate("_ZN1AC1Ev"), Contains("_ZN1AC2Ev")); - EXPECT_THAT(FindAlternate("_ZN1AD1Ev"), Contains("_ZN1AD2Ev")); - EXPECT_THAT(FindAlternate("_bogus"), IsEmpty()); + EXPECT_THAT(GenerateAlternate("_ZN1A1fEa"), Contains("_ZN1A1fEc")); + EXPECT_THAT(GenerateAlternate("_ZN1A1fEx"), Contains("_ZN1A1fEl")); + EXPECT_THAT(GenerateAlternate("_ZN1A1fEy"), Contains("_ZN1A1fEm")); + EXPECT_THAT(GenerateAlternate("_ZN1A1fEai"), Contains("_ZN1A1fEci")); + EXPECT_THAT(GenerateAlternate("_ZN1AC1Ev"), Contains("_ZN1AC2Ev")); + EXPECT_THAT(GenerateAlternate("_ZN1AD1Ev"), Contains("_ZN1AD2Ev")); + EXPECT_THAT(GenerateAlternate("_bogus"), IsEmpty()); } TEST(CPlusPlusLanguage, CPlusPlusNameParser) { Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -127,11 +127,8 @@ llvm::StringRef &context, llvm::StringRef &identifier); - // Given a mangled function name, calculates some alternative manglings since - // the compiler mangling may not line up with the symbol we are expecting - static uint32_t - FindAlternateFunctionManglings(const ConstString mangled, - std::set<ConstString> &candidates); + std::set<ConstString> + GenerateAlternateFunctionManglings(const ConstString mangled) const override; // PluginInterface protocol ConstString GetPluginName() override; Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -424,9 +424,10 @@ }; } // namespace -uint32_t CPlusPlusLanguage::FindAlternateFunctionManglings( - const ConstString mangled_name, std::set<ConstString> &alternates) { - const auto start_size = alternates.size(); +std::set<ConstString> CPlusPlusLanguage::GenerateAlternateFunctionManglings( + const ConstString mangled_name) const { + std::set<ConstString> alternates; + /// Get a basic set of alternative manglings for the given symbol `name`, by /// making a few basic possible substitutions on basic types, storage duration /// and `const`ness for the given symbol. The output parameter `alternates` @@ -474,7 +475,7 @@ CtorDtorSubstitutor().substitute(mangled_name.GetStringRef())) alternates.insert(ctor_fixup); - return alternates.size() - start_size; + return alternates; } static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { Index: lldb/source/Expression/IRExecutionUnit.cpp =================================================================== --- lldb/source/Expression/IRExecutionUnit.cpp +++ lldb/source/Expression/IRExecutionUnit.cpp @@ -723,9 +723,11 @@ } } - std::set<ConstString> alternates; - CPlusPlusLanguage::FindAlternateFunctionManglings(name, alternates); - CPP_names.insert(CPP_names.end(), alternates.begin(), alternates.end()); + if (auto *cpp_lang = Language::FindPlugin(lldb::eLanguageTypeC_plus_plus)) { + std::set<ConstString> alternates = + cpp_lang->GenerateAlternateFunctionManglings(name); + CPP_names.insert(CPP_names.end(), alternates.begin(), alternates.end()); + } } } Index: lldb/include/lldb/Target/Language.h =================================================================== --- lldb/include/lldb/Target/Language.h +++ lldb/include/lldb/Target/Language.h @@ -293,6 +293,13 @@ static LanguageSet GetLanguagesSupportingTypeSystemsForExpressions(); static LanguageSet GetLanguagesSupportingREPLs(); + // Given a mangled function name, calculates some alternative manglings since + // the compiler mangling may not line up with the symbol we are expecting. + virtual std::set<ConstString> + GenerateAlternateFunctionManglings(const ConstString mangled) const { + return std::set<ConstString>(); + } + protected: // Classes that inherit from Language can see and modify these
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits