Author: Dave Lee Date: 2024-05-31T11:20:23-07:00 New Revision: 5a02a9a2e67444494f086dfe1cd6f15ba2210bc0
URL: https://github.com/llvm/llvm-project/commit/5a02a9a2e67444494f086dfe1cd6f15ba2210bc0 DIFF: https://github.com/llvm/llvm-project/commit/5a02a9a2e67444494f086dfe1cd6f15ba2210bc0.diff LOG: [lldb] Improve identification of Dlang mangled names (#93881) Reduce false positive identification of C names as Dlang mangled names. This happens when a C function uses the prefix `_D`. The [Dlang ABI](https://dlang.org/spec/abi.html#name_mangling) shows that mangled names have a length immediately following the `_D` prefix. This change checks for a digit after the `_D` prefix, when identifying the mangling scheme of a symbol. This doesn't prevent false positives entirely, but does make it less likely. Added: lldb/test/API/lang/c/non-mangled/Makefile lldb/test/API/lang/c/non-mangled/TestCNonMangled.py lldb/test/API/lang/c/non-mangled/main.c Modified: lldb/source/Core/Mangled.cpp Removed: ################################################################################ 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..aae2f05263fcd --- /dev/null +++ b/lldb/test/API/lang/c/non-mangled/TestCNonMangled.py @@ -0,0 +1,15 @@ +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; +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits