Author: Luís Ferreira Date: 2021-11-11T11:11:21+01:00 New Revision: 96a7359908397d8db3ac6f8e10fb9f6dc5756a44
URL: https://github.com/llvm/llvm-project/commit/96a7359908397d8db3ac6f8e10fb9f6dc5756a44 DIFF: https://github.com/llvm/llvm-project/commit/96a7359908397d8db3ac6f8e10fb9f6dc5756a44.diff LOG: [lldb] Add support for demangling D symbols This is part of https://github.com/dlang/projects/issues/81 . This patch enables support for D programming language demangler by using a pretty printed stacktrace with demangled D symbols, when present. Signed-off-by: Luís Ferreira <cont...@lsferreira.net> Reviewed By: JDevlieghere, teemperor Differential Revision: https://reviews.llvm.org/D110578 Added: Modified: lldb/include/lldb/Core/Mangled.h lldb/source/Core/Mangled.cpp lldb/source/Symbol/Symtab.cpp lldb/unittests/Core/MangledTest.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Core/Mangled.h b/lldb/include/lldb/Core/Mangled.h index d11d13b63cfcf..c0542157f85db 100644 --- a/lldb/include/lldb/Core/Mangled.h +++ b/lldb/include/lldb/Core/Mangled.h @@ -44,7 +44,8 @@ class Mangled { eManglingSchemeNone = 0, eManglingSchemeMSVC, eManglingSchemeItanium, - eManglingSchemeRustV0 + eManglingSchemeRustV0, + eManglingSchemeD }; /// Default constructor. diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index e36d412896a93..20f4dbdb419fb 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -45,6 +45,9 @@ Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) { 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 @@ static char *GetRustV0DemangledStr(const char *M) { 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 @@ bool Mangled::DemangleWithRichManglingInfo( } 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!"); @@ -278,6 +295,9 @@ ConstString Mangled::GetDemangledName() const { case eManglingSchemeRustV0: demangled_name = GetRustV0DemangledStr(mangled_name); break; + case eManglingSchemeD: + demangled_name = GetDLangDemangledStr(mangled_name); + break; case eManglingSchemeNone: llvm_unreachable("eManglingSchemeNone was handled already"); } diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp index 69887034a9fb0..19c1fee2bb381 100644 --- a/lldb/source/Symbol/Symtab.cpp +++ b/lldb/source/Symbol/Symtab.cpp @@ -248,10 +248,8 @@ static bool lldb_skip_name(llvm::StringRef mangled, // 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. diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp index 431993fccb1a6..4c1bb0cc45c27 100644 --- a/lldb/unittests/Core/MangledTest.cpp +++ b/lldb/unittests/Core/MangledTest.cpp @@ -72,6 +72,24 @@ TEST(MangledTest, EmptyForInvalidRustV0Name) { 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<FileSystem, HostInfo, ObjectFileELF, SymbolFileSymtab> subsystems; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits