[Lldb-commits] [lldb] [lldb] Improve identification of Dlang mangled names (PR #93881)
via lldb-commits
lldb-commits at lists.llvm.org
Thu May 30 14:20:26 PDT 2024
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
More information about the lldb-commits
mailing list