From a345f6151036bcd3929125413495054f49365ff2 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Nov 17 2021 16:46:42 +0000 Subject: Add valgrind-3.18.1-rust-v0-demangle.patch --- diff --git a/valgrind-3.18.1-rust-v0-demangle.patch b/valgrind-3.18.1-rust-v0-demangle.patch new file mode 100644 index 0000000..e48a106 --- /dev/null +++ b/valgrind-3.18.1-rust-v0-demangle.patch @@ -0,0 +1,137 @@ +commit 4831385c6706b377851284adc4c4545fff4c6564 +Author: Nicholas Nethercote +Date: Tue Nov 9 12:30:07 2021 +1100 + + Fix Rust v0 demangling. + + It's currently broken due to a silly test that prevents the v0 + demangling code from even running. + + The commit also adds a test, to avoid such problems in the future. + +diff --git a/coregrind/m_demangle/demangle.c b/coregrind/m_demangle/demangle.c +index 16161da2a..3fd7cb75f 100644 +--- a/coregrind/m_demangle/demangle.c ++++ b/coregrind/m_demangle/demangle.c +@@ -118,8 +118,13 @@ void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling, + } + + /* Possibly undo (1) */ ++ // - C++ mangled symbols start with "_Z" (possibly with exceptions?) ++ // - Rust "legacy" mangled symbols start with "_Z". ++ // - Rust "v0" mangled symbols start with "_R". ++ // 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 != NULL && orig[0] == '_' && (orig[1] == 'Z' || orig[1] == 'R')) { + /* !!! vvv STATIC vvv !!! */ + static HChar* demangled = NULL; + /* !!! ^^^ STATIC ^^^ !!! */ +diff --git a/memcheck/tests/demangle-rust.c b/memcheck/tests/demangle-rust.c +new file mode 100644 +index 000000000..f2a458b2a +--- /dev/null ++++ b/memcheck/tests/demangle-rust.c +@@ -0,0 +1,31 @@ ++// Valgrind supports demangling Rust symbols (both the "v0" and "legacy" ++// mangling schemes), but we don't want to add a dependency on the Rust ++// compiler for a single test. So this is a C program with function names that ++// are mangled Rust symbols. In the output, they become demangled Rust names. ++// It's a hack, but a useful one. ++ ++#include ++ ++// A v0 symbol that demangles to: ::fold_with:: ++int _RINvYNtNtCs4uGc65yWeeX_12rustc_middle2ty13PredicateKindNtNtB5_4fold12TypeFoldable9fold_withNtNtNtCsgI90OQiJWEs_11rustc_infer5infer7resolve24OpportunisticVarResolverECsdozMG8X9FIu_21rustc_trait_selection(int *p) ++{ ++ return *p ? 1 : 2; ++} ++ ++// A v0 symbol that demangles to: rustc_expand::mbe::macro_parser::parse_tt ++int _RNvNtNtCsaqSe1lZGvEL_12rustc_expand3mbe12macro_parser8parse_tt(int* p) ++{ ++ return _RINvYNtNtCs4uGc65yWeeX_12rustc_middle2ty13PredicateKindNtNtB5_4fold12TypeFoldable9fold_withNtNtNtCsgI90OQiJWEs_11rustc_infer5infer7resolve24OpportunisticVarResolverECsdozMG8X9FIu_21rustc_trait_selection(p); ++} ++ ++// A legacy symbol that demangles to: core::str::lossy::Utf8Lossy::from_bytes ++int _ZN4core3str5lossy9Utf8Lossy10from_bytes17heb1677c8cb728b0bE(int* p) ++{ ++ return _RNvNtNtCsaqSe1lZGvEL_12rustc_expand3mbe12macro_parser8parse_tt(p); ++} ++ ++int main(void) ++{ ++ return _ZN4core3str5lossy9Utf8Lossy10from_bytes17heb1677c8cb728b0bE(malloc(sizeof(int))); ++} ++ +diff --git a/memcheck/tests/demangle-rust.stderr.exp b/memcheck/tests/demangle-rust.stderr.exp +new file mode 100644 +index 000000000..f04bb625b +--- /dev/null ++++ b/memcheck/tests/demangle-rust.stderr.exp +@@ -0,0 +1,6 @@ ++Conditional jump or move depends on uninitialised value(s) ++ at 0x........: ::fold_with:: (demangle-rust.c:12) ++ by 0x........: rustc_expand::mbe::macro_parser::parse_tt (demangle-rust.c:18) ++ by 0x........: core::str::lossy::Utf8Lossy::from_bytes (demangle-rust.c:24) ++ by 0x........: main (demangle-rust.c:29) ++ +diff --git a/memcheck/tests/demangle-rust.vgtest b/memcheck/tests/demangle-rust.vgtest +new file mode 100644 +index 000000000..d726c6b2e +--- /dev/null ++++ b/memcheck/tests/demangle-rust.vgtest +@@ -0,0 +1,2 @@ ++prog: demangle-rust ++vgopts: -q + +commit c1bfa115f985633722f25922d2996c231e8c9d8d +Author: Mark Wielaard +Date: Wed Nov 10 09:02:36 2021 +0100 + + Add demangle-rust.vgtest demangle-rust.stderr.exp to EXTRA_DIST + +diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am +index 4d0476e2d..7837d87c7 100644 +--- a/memcheck/tests/Makefile.am ++++ b/memcheck/tests/Makefile.am +@@ -281,6 +281,7 @@ EXTRA_DIST = \ + realloc3.stderr.exp realloc3.vgtest \ + recursive-merge.stderr.exp recursive-merge.vgtest \ + resvn_stack.stderr.exp resvn_stack.vgtest \ ++ demangle-rust.vgtest demangle-rust.stderr.exp \ + sbfragment.stdout.exp sbfragment.stderr.exp sbfragment.vgtest \ + sem.stderr.exp sem.vgtest \ + sendmsg.stderr.exp sendmsg.stderr.exp-solaris sendmsg.vgtest \ + +commit d151907e5d8ff393f4fef126c8ae445ea8813661 +Author: Mark Wielaard +Date: Thu Nov 11 18:02:09 2021 +0100 + + Add demangle-rust to check_PROGRAMS + + The demangle-rust.vgtest would fail because the demangle-rust binary + wasn't build by default. Add it to check_PROGRAMS and define + demangle_rust_SOURCES to make sure it is always build. + +diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am +index 7837d87c7..449710020 100644 +--- a/memcheck/tests/Makefile.am ++++ b/memcheck/tests/Makefile.am +@@ -392,6 +392,7 @@ check_PROGRAMS = \ + custom_alloc \ + custom-overlap \ + demangle \ ++ demangle-rust \ + big_debuginfo_symbol \ + deep-backtrace \ + describe-block \ +@@ -505,6 +506,7 @@ endif + leak_cpp_interior_SOURCES = leak_cpp_interior.cpp + + demangle_SOURCES = demangle.cpp ++demangle_rust_SOURCES = demangle-rust.c + + # Suppress various gcc warnings which are correct, but for things + # we are actually testing for at runtime. diff --git a/valgrind.spec b/valgrind.spec index bdf267b..7f16088 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -105,6 +105,9 @@ Patch10: valgrind-3.18.1-ppc-pstq-tests.patch # gdbserver_tests: Filter out glibc hwcaps libc.so Patch11: valgrind-3.18.1-gdbserver_tests-hwcap.patch +# KDE#445184 Rust v0 symbol demangling is broken +Patch12: valgrind-3.18.1-rust-v0-demangle.patch + BuildRequires: make BuildRequires: glibc-devel @@ -248,6 +251,7 @@ Valgrind User Manual for details. %patch9 -p1 %patch10 -p1 %patch11 -p1 +%patch12 -p1 %build # LTO triggers undefined symbols in valgrind. Valgrind has a --enable-lto @@ -481,6 +485,7 @@ fi - Add valgrind-3.18.1-ppc-pstq.patch - Add valgrind-3.18.1-ppc-pstq-tests.patch - Add valgrind-3.18.1-gdbserver_tests-hwcap.patch +- Add valgrind-3.18.1-rust-v0-demangle.patch * Mon Nov 1 2021 Mark Wielaard - 3.18.1-2 - Add valgrind-3.18.1-dhat-tests-copy.patch