From 0d7d989c8ce55d782995d22b47c97990190cc8eb Mon Sep 17 00:00:00 2001 From: Augusto Noronha Date: Fri, 15 Aug 2025 12:30:21 -0700 Subject: [PATCH 1/2] [lldb] Fix CXX's SymbolNameFitsToLanguage matching other languages (#153685) The current implementation of CPlusPlusLanguage::SymbolNameFitsToLanguage will return true if the symbol is mangled for any language that lldb knows about. (cherry picked from commit c6ea7d72d12073c63681bca998a87b4a436a9dff) --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 4 ++- .../CPlusPlus/CPlusPlusLanguageTest.cpp | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 3c140f9f94e0e..4ccbcae3e093d 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -104,7 +104,9 @@ CPlusPlusLanguage::GetFunctionNameInfo(ConstString name) const { bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const { const char *mangled_name = mangled.GetMangledName().GetCString(); - return mangled_name && Mangled::IsMangledName(mangled_name); + auto mangling_scheme = Mangled::GetManglingScheme(mangled_name); + return mangled_name && (mangling_scheme == Mangled::eManglingSchemeItanium || + mangling_scheme == Mangled::eManglingSchemeMSVC); } ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp index 99018c129c5cd..b5619978f5c88 100644 --- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp +++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp @@ -397,3 +397,33 @@ TEST(CPlusPlusLanguage, CPlusPlusNameParser) { // Don't crash. CPlusPlusNameParser((const char *)nullptr); } + +TEST(CPlusPlusLanguage, DoesNotMatchCxx) { + // Test that a symbol name that is NOT C++ does not match C++. + + SubsystemRAII lang; + Language *CPlusPlusLang = + Language::FindPlugin(lldb::eLanguageTypeC_plus_plus); + + EXPECT_TRUE(CPlusPlusLang != nullptr); + + Mangled swiftSymbol("$sS"); + EXPECT_FALSE(CPlusPlusLang->SymbolNameFitsToLanguage(swiftSymbol)); +} + +TEST(CPlusPlusLanguage, MatchesCxx) { + // Test that a symbol name that is C++ does match C++ (both Itanium and MSVC). + + SubsystemRAII lang; + Language *CPlusPlusLang = + Language::FindPlugin(lldb::eLanguageTypeC_plus_plus); + + EXPECT_TRUE(CPlusPlusLang != nullptr); + + Mangled itaniumSymbol("_ZFoo"); + EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(itaniumSymbol)); + Mangled itaniumExtensionSymbol("___ZBar"); + EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(itaniumExtensionSymbol)); + Mangled msvcSymbol("?Baz"); + EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(msvcSymbol)); +} From c2fd84837ff22705ef82eb0cf0fa77cbc4a8dce2 Mon Sep 17 00:00:00 2001 From: Augusto Noronha Date: Fri, 15 Aug 2025 12:33:45 -0700 Subject: [PATCH 2/2] [NFC][lldb] Make C++ symbols in CPlusPlusLanguageTest.cpp valid (cherry picked from commit aa8a48ce8beda92811a8bf9690fd53fe52913dc7) --- lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp index b5619978f5c88..f96e7896cc023 100644 --- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp +++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp @@ -420,10 +420,10 @@ TEST(CPlusPlusLanguage, MatchesCxx) { EXPECT_TRUE(CPlusPlusLang != nullptr); - Mangled itaniumSymbol("_ZFoo"); + Mangled itaniumSymbol("_Z3Foo"); EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(itaniumSymbol)); - Mangled itaniumExtensionSymbol("___ZBar"); + Mangled itaniumExtensionSymbol("___Z3Bar_block_invoke"); EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(itaniumExtensionSymbol)); - Mangled msvcSymbol("?Baz"); + Mangled msvcSymbol("??x@@3AH"); EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(msvcSymbol)); }