From: Paul Floyd Date: Sun, 29 Jan 2023 21:05:27 +0000 (+0100) Subject: Bug 464969 - D language demangling X-Git-Tag: VALGRIND_3_21_0~190 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82282a6676a5c1b3784fd22fc097a0076dfcb7ca;p=thirdparty%2Fvalgrind.git Bug 464969 - D language demangling Patch from witold.baryluk@gmail.com (also added a testcase) --- diff --git a/.gitignore b/.gitignore index b6c2852345..ae71cbbbdd 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 7990a8a56f..5e61efbbfe 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 3fd7cb75f5..a4031dc8ac 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 aa936ac05e..1be744ebac 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 0000000000..b66c79b387 --- /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 0000000000..e2c5b0b254 --- /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 0000000000..60fc874768 --- /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 0000000000..bf20ace9ef --- /dev/null +++ b/memcheck/tests/bug464969_d_demangle.vgtest @@ -0,0 +1,2 @@ +prog: bug464969_d_demangle +vgopts: -q