Skip to content

Commit 9233a54

Browse files
authored
[rust]: Support including disambiguating hashes in demangled symbols (#14)
1 parent 470c92e commit 9233a54

3 files changed

Lines changed: 54 additions & 20 deletions

File tree

rust/Cargo.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ edition = "2018"
77
[dependencies]
88
lazy_static = "1.4.0"
99
regex = "1.5.5"
10-
rustc-demangle = "0.1.20"
10+
rustc-demangle = "0.1.24"

rust/src/main.rs

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@ use rustc_demangle::demangle;
88
use std::io;
99
use std::io::prelude::*;
1010

11-
fn demangle_line(line: &str) -> String {
11+
fn demangle_line(no_verbose: bool, line: &str) -> String {
1212
lazy_static! {
1313
static ref RE: Regex = Regex::new(r"[_a-zA-Z$][_a-zA-Z$0-9.]*").unwrap();
1414
}
1515

1616
RE.replace_all(line, |caps: &Captures<'_>| {
17-
format!("{:#}", demangle(caps.get(0).unwrap().as_str()))
17+
let demangled = demangle(caps.get(0).unwrap().as_str());
18+
if no_verbose {
19+
format!("{:#}", demangled)
20+
} else {
21+
format!("{}", demangled)
22+
}
1823
})
1924
.to_string()
2025
}
@@ -26,40 +31,69 @@ mod tests {
2631
#[test]
2732
fn passes_text() {
2833
assert_eq!(
29-
demangle_line("mo fo\tboom hello "),
34+
demangle_line(true, "mo fo\tboom hello "),
3035
"mo fo\tboom hello "
3136
);
3237
}
3338

3439
#[test]
3540
fn demangles() {
3641
assert_eq!(
37-
demangle_line("_ZN7example4main17h0db00b8b32acffd5E:"),
42+
demangle_line(true, "_ZN7example4main17h0db00b8b32acffd5E:"),
3843
"example::main:"
3944
);
4045
}
4146

4247
#[test]
4348
fn handles_mid_demangling() {
4449
assert_eq!(
45-
demangle_line(" lea rax, [rip + _ZN55_$LT$$RF$$u27$a$u20$T$u20$as$u20$core..fmt..Display$GT$3fmt17h510ed05e72307174E]"),
50+
demangle_line(true, " lea rax, [rip + _ZN55_$LT$$RF$$u27$a$u20$T$u20$as$u20$core..fmt..Display$GT$3fmt17h510ed05e72307174E]"),
4651
" lea rax, [rip + <&\'a T as core::fmt::Display>::fmt]",
4752
);
4853
}
4954

5055
#[test]
5156
fn handles_call_plt() {
5257
assert_eq!(
53-
demangle_line(" call _ZN3std2io5stdio6_print17he48522be5b0a80d9E@PLT"),
58+
demangle_line(true, " call _ZN3std2io5stdio6_print17he48522be5b0a80d9E@PLT"),
5459
" call std::io::stdio::_print@PLT"
5560
);
5661
}
62+
63+
#[test]
64+
fn includes_hash_in_verbose_mode() {
65+
assert_eq!(
66+
demangle_line(false, "_ZN4core3fmt9Arguments9new_const17hf7eafdf6c5e03508E"),
67+
"core::fmt::Arguments::new_const::hf7eafdf6c5e03508",
68+
);
69+
}
70+
71+
#[test]
72+
fn demangles_v0_symbols() {
73+
assert_eq!(
74+
demangle_line(true, "_RNvCslMLAjg8TrSC_7example4meow"),
75+
"example::meow",
76+
);
77+
}
78+
79+
#[test]
80+
fn demangles_double_underscore_prefixed_symbols() {
81+
assert_eq!(
82+
demangle_line(true, "__RINvMs2_NtCslVVlGMZyABT_4core3fmtNtB6_9Arguments9new_constKj1_ECslMLAjg8TrSC_7example"),
83+
"<core::fmt::Arguments>::new_const::<1>",
84+
);
85+
assert_eq!(
86+
demangle_line(true, "__ZN4core3fmt9Arguments9new_const17hf7eafdf6c5e03508E"),
87+
"core::fmt::Arguments::new_const",
88+
);
89+
}
5790
}
5891

5992
fn main() {
93+
let no_verbose = std::env::args().any(|arg| arg == "--no-verbose");
6094
let stdin = io::stdin();
6195

6296
for line in stdin.lock().lines() {
63-
println!("{}", demangle_line(&line.unwrap()));
97+
println!("{}", demangle_line(no_verbose, &line.unwrap()));
6498
}
6599
}

0 commit comments

Comments
 (0)