]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix Rust v0 demangling.
authorNicholas Nethercote <nnethercote@apple.com>
Tue, 9 Nov 2021 01:30:07 +0000 (12:30 +1100)
committerNicholas Nethercote <nnethercote@apple.com>
Tue, 9 Nov 2021 23:03:06 +0000 (10:03 +1100)
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.

coregrind/m_demangle/demangle.c
memcheck/tests/demangle-rust.c [new file with mode: 0644]
memcheck/tests/demangle-rust.stderr.exp [new file with mode: 0644]
memcheck/tests/demangle-rust.vgtest [new file with mode: 0644]

index 16161da2af45421bb43a58ea43f2349a7eff4524..3fd7cb75f5a134544919524a8fec0333c886cc42 100644 (file)
@@ -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 (file)
index 0000000..f2a458b
--- /dev/null
@@ -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 <stdlib.h>
+
+// A v0 symbol that demangles to: <rustc_middle::ty::PredicateKind as rustc_middle::ty::fold::TypeFoldable>::fold_with::<rustc_infer::infer::resolve::OpportunisticVarResolver>
+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 (file)
index 0000000..f04bb62
--- /dev/null
@@ -0,0 +1,6 @@
+Conditional jump or move depends on uninitialised value(s)
+   at 0x........: <rustc_middle::ty::PredicateKind as rustc_middle::ty::fold::TypeFoldable>::fold_with::<rustc_infer::infer::resolve::OpportunisticVarResolver> (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 (file)
index 0000000..d726c6b
--- /dev/null
@@ -0,0 +1,2 @@
+prog: demangle-rust
+vgopts: -q