]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 464969 - D language demangling
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 29 Jan 2023 21:05:27 +0000 (22:05 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 29 Jan 2023 21:07:52 +0000 (22:07 +0100)
    Patch from witold.baryluk@gmail.com

(also added a testcase)

.gitignore
NEWS
coregrind/m_demangle/demangle.c
memcheck/tests/Makefile.am
memcheck/tests/bug464969_d_demangle.cpp [new file with mode: 0644]
memcheck/tests/bug464969_d_demangle.stderr.exp [new file with mode: 0644]
memcheck/tests/bug464969_d_demangle.stdout.exp [new file with mode: 0644]
memcheck/tests/bug464969_d_demangle.vgtest [new file with mode: 0644]

index b6c2852345399db7308dcd0ac0b2c4946081709e..ae71cbbbddf9bda7af52cafe9e58b249ceb959f4 100644 (file)
 /memcheck/tests/bug155125
 /memcheck/tests/bug287260
 /memcheck/tests/bug340392
+/memcheck/tests/bug464969_d_demangle
 /memcheck/tests/calloc-overflow
 /memcheck/tests/cdebug_zlib
 /memcheck/tests/cdebug_zlib_gnu
diff --git a/NEWS b/NEWS
index 7990a8a56ffa496bfeb62bb7b8228d686f9c961b..5e61efbbfe3acbc3d1abc42ce8013f99673580f5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -93,6 +93,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 463027  broken check for MPX instruction support in assembler
 464476  Firefox fails to start under Valgrind
 464859  Build failures with GCC-13 (drd tsan_unittest)
+464969  D language demangling
 
 To see details of a given bug, visit
   https://bugs.kde.org/show_bug.cgi?id=XXXXXX
index 3fd7cb75f5a134544919524a8fec0333c886cc42..a4031dc8ac5f9619caae8d9d7e3d89d766778d7b 100644 (file)
@@ -121,10 +121,12 @@ void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling,
    // - C++ mangled symbols start with "_Z" (possibly with exceptions?)
    // - Rust "legacy" mangled symbols start with "_Z".
    // - Rust "v0" mangled symbols start with "_R".
+   // - D programming language mangled symbols start with "_D".
    // XXX: the Java/Rust/Ada demangling here probably doesn't work. See
    // https://bugs.kde.org/show_bug.cgi?id=445235 for details.
    if (do_cxx_demangling && VG_(clo_demangle)
-       && orig != NULL && orig[0] == '_' && (orig[1] == 'Z' || orig[1] == 'R')) {
+       && orig != NULL && orig[0] == '_'
+       && (orig[1] == 'Z' || orig[1] == 'R' || orig[1] == 'D')) {
       /* !!! vvv STATIC vvv !!! */
       static HChar* demangled = NULL;
       /* !!! ^^^ STATIC ^^^ !!! */
@@ -134,7 +136,11 @@ void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling,
          VG_(arena_free) (VG_AR_DEMANGLE, demangled);
          demangled = NULL;
       }
-      demangled = ML_(cplus_demangle) ( orig, DMGL_ANSI | DMGL_PARAMS );
+      if (orig[1] == 'D') {
+        demangled = dlang_demangle ( orig, DMGL_ANSI | DMGL_PARAMS );
+      } else {
+        demangled = ML_(cplus_demangle) ( orig, DMGL_ANSI | DMGL_PARAMS );
+      }
 
       *result = (demangled == NULL) ? orig : demangled;
    } else {
index aa936ac05ea7096c4c8e10112f635a722cfcca62..1be744ebaca12bcf25df7553a4ebdbf99bde2853 100644 (file)
@@ -114,6 +114,8 @@ EXTRA_DIST = \
        bug155125.stderr.exp bug155125.vgtest \
        bug287260.stderr.exp bug287260.vgtest \
        bug340392.stderr.exp bug340392.vgtest \
+       bug464969_d_demangle.stderr.exp bug464969_d_demangle.vgtest \
+               bug464969_d_demangle.stdout.exp \
        calloc-overflow.stderr.exp calloc-overflow.vgtest\
        cdebug_zlib.stderr.exp cdebug_zlib.vgtest \
        cdebug_zlib_gnu.stderr.exp cdebug_zlib_gnu.vgtest \
@@ -381,6 +383,7 @@ check_PROGRAMS = \
        bug155125 \
        bug287260 \
        bug340392 \
+       bug464969_d_demangle \
        calloc-overflow \
        client-msg \
        clientperm \
@@ -462,6 +465,8 @@ if DWARF4
 check_PROGRAMS += dw4
 endif
 
+bug464969_d_demangle_SOURCES = bug464969_d_demangle.cpp
+
 if GZ_ZLIB
 check_PROGRAMS += cdebug_zlib
 cdebug_zlib_SOURCES = cdebug.c
diff --git a/memcheck/tests/bug464969_d_demangle.cpp b/memcheck/tests/bug464969_d_demangle.cpp
new file mode 100644 (file)
index 0000000..b66c79b
--- /dev/null
@@ -0,0 +1,17 @@
+#include <iostream>
+
+extern "C" void _D4test4findFiPxaZPxa()
+{
+   int a;
+   if (a)
+      std::cout << "a\n";
+   else
+      std::cout << "!a\n";
+}
+
+int main()
+{
+   _D4test4findFiPxaZPxa();
+}
+
+
diff --git a/memcheck/tests/bug464969_d_demangle.stderr.exp b/memcheck/tests/bug464969_d_demangle.stderr.exp
new file mode 100644 (file)
index 0000000..e2c5b0b
--- /dev/null
@@ -0,0 +1,4 @@
+Conditional jump or move depends on uninitialised value(s)
+   at 0x........: test.find(int, const(char)*) (bug464969_d_demangle.cpp:6)
+   by 0x........: main (bug464969_d_demangle.cpp:14)
+
diff --git a/memcheck/tests/bug464969_d_demangle.stdout.exp b/memcheck/tests/bug464969_d_demangle.stdout.exp
new file mode 100644 (file)
index 0000000..60fc874
--- /dev/null
@@ -0,0 +1 @@
+!a
diff --git a/memcheck/tests/bug464969_d_demangle.vgtest b/memcheck/tests/bug464969_d_demangle.vgtest
new file mode 100644 (file)
index 0000000..bf20ace
--- /dev/null
@@ -0,0 +1,2 @@
+prog: bug464969_d_demangle
+vgopts: -q