Bug 464969 - D language demangling

Patch from witold.baryluk@gmail.com

(also added a testcase)
This commit is contained in:
Paul Floyd 2023-01-29 22:05:27 +01:00
parent 2e873534bb
commit 82282a6676
8 changed files with 39 additions and 2 deletions

1
.gitignore vendored
View File

@ -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

1
NEWS
View File

@ -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

View 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 {

View 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

View File

@ -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();
}

View File

@ -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)

View File

@ -0,0 +1 @@
!a

View File

@ -0,0 +1,2 @@
prog: bug464969_d_demangle
vgopts: -q