[Lldb-commits] [lldb] 5a02a9a - [lldb] Improve identification of Dlang mangled names (#93881)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 31 11:20:27 PDT 2024
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;
+}
More information about the lldb-commits
mailing list