Index: lldb/include/lldb/Core/Mangled.h =================================================================== --- lldb/include/lldb/Core/Mangled.h +++ lldb/include/lldb/Core/Mangled.h @@ -44,7 +44,8 @@ eManglingSchemeNone = 0, eManglingSchemeMSVC, eManglingSchemeItanium, - eManglingSchemeRustV0 + eManglingSchemeRustV0, + eManglingSchemeD }; /// Default constructor. Index: lldb/source/Core/Mangled.cpp =================================================================== --- lldb/source/Core/Mangled.cpp +++ lldb/source/Core/Mangled.cpp @@ -45,6 +45,9 @@ if (name.startswith("_R")) return Mangled::eManglingSchemeRustV0; + if (name.startswith("_D")) + return Mangled::eManglingSchemeD; + if (name.startswith("_Z")) return Mangled::eManglingSchemeItanium; @@ -185,6 +188,19 @@ return demangled_cstr; } +static char *GetDLangDemangledStr(const char *M) { + char *demangled_cstr = llvm::dlangDemangle(M); + + if (Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DEMANGLE)) { + if (demangled_cstr && demangled_cstr[0]) + LLDB_LOG(log, "demangled dlang: {0} -> \"{1}\"", M, demangled_cstr); + else + LLDB_LOG(log, "demangled dlang: {0} -> error: failed to demangle", M); + } + + return demangled_cstr; +} + // Explicit demangling for scheduled requests during batch processing. This // makes use of ItaniumPartialDemangler's rich demangle info bool Mangled::DemangleWithRichManglingInfo( @@ -244,7 +260,8 @@ } case eManglingSchemeRustV0: - // Rich demangling scheme is not supported for Rust + case eManglingSchemeD: + // Rich demangling scheme is not supported return false; } llvm_unreachable("Fully covered switch above!"); @@ -277,6 +294,9 @@ case eManglingSchemeRustV0: demangled_name = GetRustV0DemangledStr(mangled_name); break; + case eManglingSchemeD: + demangled_name = GetDLangDemangledStr(mangled_name); + break; case eManglingSchemeNone: llvm_unreachable("eManglingSchemeNone was handled already"); } Index: lldb/source/Symbol/Symtab.cpp =================================================================== --- lldb/source/Symbol/Symtab.cpp +++ lldb/source/Symbol/Symtab.cpp @@ -248,10 +248,8 @@ // No filters for this scheme yet. Include all names in indexing. case Mangled::eManglingSchemeMSVC: - return false; - - // No filters for this scheme yet. Include all names in indexing. case Mangled::eManglingSchemeRustV0: + case Mangled::eManglingSchemeD: return false; // Don't try and demangle things we can't categorize. Index: lldb/unittests/Core/MangledTest.cpp =================================================================== --- lldb/unittests/Core/MangledTest.cpp +++ lldb/unittests/Core/MangledTest.cpp @@ -72,6 +72,24 @@ EXPECT_STREQ("", the_demangled.GetCString()); } +TEST(MangledTest, ResultForValidDLangName) { + ConstString mangled_name("_Dmain"); + Mangled the_mangled(mangled_name); + ConstString the_demangled = the_mangled.GetDemangledName(); + + ConstString expected_result("D main"); + EXPECT_STREQ(expected_result.GetCString(), the_demangled.GetCString()); +} + +TEST(MangledTest, EmptyForInvalidDLangName) { + ConstString mangled_name("_DDD"); + Mangled the_mangled(mangled_name); + ConstString the_demangled = the_mangled.GetDemangledName(); + + EXPECT_STREQ("", the_demangled.GetCString()); +} + + TEST(MangledTest, NameIndexes_FindFunctionSymbols) { SubsystemRAII subsystems;