Skip to main content

wasmtime_environ/
demangling.rs

1//! Helpers for demangling function names.
2
3/// Demangles a single function name into a user-readable form.
4///
5/// Currently supported: Rust/C/C++ function names.
6pub fn demangle_function_name(writer: &mut impl core::fmt::Write, name: &str) -> core::fmt::Result {
7    #[cfg(feature = "demangle")]
8    if let Ok(demangled) = rustc_demangle::try_demangle(name) {
9        return write!(writer, "{demangled}");
10    } else if name.starts_with("_Z")
11        // Only attempt to demangle Itanium C++ mangled symbols, which all
12        // start with `_Z`, as otherwise short names such as `i` are
13        // "demangled" as types such as `int`.
14        && let Ok(symbol) = cpp_demangle::Symbol::new(name)
15        && let Ok(demangled) = symbol.demangle()
16    {
17        return write!(writer, "{demangled}");
18    }
19
20    write!(writer, "{name}")
21}
22
23/// Demangles a function name if it's provided, or returns a unified representation based on the
24/// function index otherwise.
25pub fn demangle_function_name_or_index(
26    writer: &mut impl core::fmt::Write,
27    name: Option<&str>,
28    func_id: usize,
29) -> core::fmt::Result {
30    match name {
31        Some(name) => demangle_function_name(writer, name),
32        None => write!(writer, "<wasm function {func_id}>"),
33    }
34}