From 3ce416e2ffee12dc84a44fc0a0387f32e697ec06 Mon Sep 17 00:00:00 2001 From: Jeff Charles Date: Mon, 31 Aug 2026 16:55:18 -0400 Subject: [PATCH] Update `cpp_demangle` --- Cargo.lock | 13 +++++++++++-- Cargo.toml | 2 +- src/lib.rs | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f887b6d..d7ef47b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -118,6 +118,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_demangle" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0667304c32ea56cb4cd6d2d7c0cfe9a2f8041229db8c033af7f8d69492429def" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpufeatures" version = "0.2.16" @@ -1087,7 +1096,7 @@ dependencies = [ name = "wasmprof" version = "0.12.0" dependencies = [ - "cpp_demangle", + "cpp_demangle 0.5.1", "libc", "nix", "rustc-demangle", @@ -1157,7 +1166,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fd1d43cfaa1a0859d2f4fccc15e7e571e2a88b357e81bc88ba6c501b83d925d" dependencies = [ "anyhow", - "cpp_demangle", + "cpp_demangle 0.4.4", "cranelift-bitset", "cranelift-entity", "gimli", diff --git a/Cargo.toml b/Cargo.toml index 76c2faf..e631771 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ keywords = ["wasm", "wasmtime", "profiler"] categories = ["wasm", "development-tools::profiling"] [dependencies] -cpp_demangle = "0.4.1" +cpp_demangle = "0.5.1" libc = "0.2.142" nix = { version = "0.31", default-features = false, features = ["signal"] } rustc-demangle = "0.1.23" diff --git a/src/lib.rs b/src/lib.rs index 78e64ee..e7ce847 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -156,9 +156,40 @@ impl<'a, T> ProfilerBuilder<'a, T> { fn unmangle_name(name: &str) -> String { if let Ok(demangled) = rustc_demangle::try_demangle(name) { demangled.to_string() - } else if let Ok(demangled) = cpp_demangle::Symbol::new(name) { - demangled.to_string() + } else if let Ok(cpp_symbol) = cpp_demangle::Symbol::new(name) { + cpp_symbol.demangle().unwrap_or_else(|_| name.to_string()) } else { name.to_string() } } + +#[cfg(test)] +mod tests { + use super::unmangle_name; + + #[test] + fn unmangles_rust_symbols() { + assert_eq!(unmangle_name("_ZN4testE"), "test"); + } + + #[test] + fn unmangles_cpp_symbols() { + assert_eq!( + unmangle_name("_ZN5space3fooEibc"), + "space::foo(int, bool, char)" + ); + } + + #[test] + fn preserves_unmangled_symbols() { + assert_eq!( + unmangle_name("not_a_mangled_symbol"), + "not_a_mangled_symbol" + ); + } + + #[test] + fn preserves_symbols_that_fail_cpp_parsing() { + assert_eq!(unmangle_name("_Z"), "_Z"); + } +}