llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Dave Lee (kastiglione) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/93881.diff 4 Files Affected: - (modified) lldb/source/Core/Mangled.cpp (+9-2) - (added) lldb/test/API/lang/c/non-mangled/Makefile (+4) - (added) lldb/test/API/lang/c/non-mangled/TestCNonMangled.py (+16) - (added) lldb/test/API/lang/c/non-mangled/main.c (+8) ``````````diff diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index 8efc4c639cca5..3142c81d12ed9 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -19,6 +19,7 @@ #include "lldb/Utility/Stream.h" #include "lldb/lldb-enumerations.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Support/Compiler.h" @@ -48,8 +49,14 @@ Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) { if (name.starts_with("_R")) return Mangled::eManglingSchemeRustV0; - if (name.starts_with("_D")) - return Mangled::eManglingSchemeD; + if (name.starts_with("_D")) { + // A dlang mangled name begins with `_D`, followed by a numeric length. + // See `SymbolName` and `LName` in + // https://dlang.org/spec/abi.html#name_mangling + llvm::StringRef buf = name.drop_front(2); + if (!buf.empty() && llvm::isDigit(buf.front())) + return Mangled::eManglingSchemeD; + } if (name.starts_with("_Z")) return Mangled::eManglingSchemeItanium; diff --git a/lldb/test/API/lang/c/non-mangled/Makefile b/lldb/test/API/lang/c/non-mangled/Makefile new file mode 100644 index 0000000000000..695335e068c0c --- /dev/null +++ b/lldb/test/API/lang/c/non-mangled/Makefile @@ -0,0 +1,4 @@ +C_SOURCES := main.c +CFLAGS_EXTRAS := -std=c99 + +include Makefile.rules diff --git a/lldb/test/API/lang/c/non-mangled/TestCNonMangled.py b/lldb/test/API/lang/c/non-mangled/TestCNonMangled.py new file mode 100644 index 0000000000000..32bd778fa6eb6 --- /dev/null +++ b/lldb/test/API/lang/c/non-mangled/TestCNonMangled.py @@ -0,0 +1,16 @@ +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + + +class TestCase(TestBase): + + def test_functions_having_dlang_mangling_prefix(self): + """ + Ensure C functions with a '_D' prefix alone are not mistakenly treated + as a Dlang mangled name. A proper Dlang mangling will have digits + immediately following the '_D' prefix. + """ + self.build() + _, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "_Dfunction") + symbol = thread.frame[0].symbol + self.assertEqual(symbol.GetDisplayName(), "_Dfunction") diff --git a/lldb/test/API/lang/c/non-mangled/main.c b/lldb/test/API/lang/c/non-mangled/main.c new file mode 100644 index 0000000000000..ad9d86e5c25a8 --- /dev/null +++ b/lldb/test/API/lang/c/non-mangled/main.c @@ -0,0 +1,8 @@ +#include <stdio.h> + +void _Dfunction() {} + +int main() { + _Dfunction(); + return 0; +} `````````` </details> https://github.com/llvm/llvm-project/pull/93881 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits