diff --git a/.gitignore b/.gitignore index b6c285234..ae71cbbbd 100644 --- a/.gitignore +++ b/.gitignore @@ -839,6 +839,7 @@ /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 7990a8a56..5e61efbbf 100644 --- 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 diff --git a/coregrind/m_demangle/demangle.c b/coregrind/m_demangle/demangle.c index 3fd7cb75f..a4031dc8a 100644 --- a/coregrind/m_demangle/demangle.c +++ b/coregrind/m_demangle/demangle.c @@ -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 { diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index aa936ac05..1be744eba 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -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 index 000000000..b66c79b38 --- /dev/null +++ b/memcheck/tests/bug464969_d_demangle.cpp @@ -0,0 +1,17 @@ +#include + +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 index 000000000..e2c5b0b25 --- /dev/null +++ b/memcheck/tests/bug464969_d_demangle.stderr.exp @@ -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 index 000000000..60fc87476 --- /dev/null +++ b/memcheck/tests/bug464969_d_demangle.stdout.exp @@ -0,0 +1 @@ +!a diff --git a/memcheck/tests/bug464969_d_demangle.vgtest b/memcheck/tests/bug464969_d_demangle.vgtest new file mode 100644 index 000000000..bf20ace9e --- /dev/null +++ b/memcheck/tests/bug464969_d_demangle.vgtest @@ -0,0 +1,2 @@ +prog: bug464969_d_demangle +vgopts: -q