Skip to content

Commit c6ea7d7

Browse files
authored
[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.
1 parent 139bde2 commit c6ea7d7

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ CPlusPlusLanguage::GetFunctionNameInfo(ConstString name) const {
105105

106106
bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
107107
const char *mangled_name = mangled.GetMangledName().GetCString();
108-
return mangled_name && Mangled::IsMangledName(mangled_name);
108+
auto mangling_scheme = Mangled::GetManglingScheme(mangled_name);
109+
return mangled_name && (mangling_scheme == Mangled::eManglingSchemeItanium ||
110+
mangling_scheme == Mangled::eManglingSchemeMSVC);
109111
}
110112

111113
ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments(

lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,3 +397,33 @@ TEST(CPlusPlusLanguage, CPlusPlusNameParser) {
397397
// Don't crash.
398398
CPlusPlusNameParser((const char *)nullptr);
399399
}
400+
401+
TEST(CPlusPlusLanguage, DoesNotMatchCxx) {
402+
// Test that a symbol name that is NOT C++ does not match C++.
403+
404+
SubsystemRAII<CPlusPlusLanguage> lang;
405+
Language *CPlusPlusLang =
406+
Language::FindPlugin(lldb::eLanguageTypeC_plus_plus);
407+
408+
EXPECT_TRUE(CPlusPlusLang != nullptr);
409+
410+
Mangled swiftSymbol("$sS");
411+
EXPECT_FALSE(CPlusPlusLang->SymbolNameFitsToLanguage(swiftSymbol));
412+
}
413+
414+
TEST(CPlusPlusLanguage, MatchesCxx) {
415+
// Test that a symbol name that is C++ does match C++ (both Itanium and MSVC).
416+
417+
SubsystemRAII<CPlusPlusLanguage> lang;
418+
Language *CPlusPlusLang =
419+
Language::FindPlugin(lldb::eLanguageTypeC_plus_plus);
420+
421+
EXPECT_TRUE(CPlusPlusLang != nullptr);
422+
423+
Mangled itaniumSymbol("_ZFoo");
424+
EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(itaniumSymbol));
425+
Mangled itaniumExtensionSymbol("___ZBar");
426+
EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(itaniumExtensionSymbol));
427+
Mangled msvcSymbol("?Baz");
428+
EXPECT_TRUE(CPlusPlusLang->SymbolNameFitsToLanguage(msvcSymbol));
429+
}

0 commit comments

Comments
 (0)