Skip to content

Commit e0e8e2e

Browse files
committed
Add option to not demangle symbols
1 parent adc9f5c commit e0e8e2e

File tree

5 files changed

+56
-13
lines changed

5 files changed

+56
-13
lines changed

src/symbolize/dbghelp.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#![allow(bad_style)]
1919

2020
use super::super::{dbghelp, windows::*};
21-
use super::{BytesOrWideString, ResolveWhat, SymbolName};
21+
use super::{BytesOrWideString, RawSymbolName, ResolveWhat};
2222
use core::char;
2323
use core::ffi::c_void;
2424
use core::marker;
@@ -47,8 +47,8 @@ pub struct Symbol<'a> {
4747
}
4848

4949
impl Symbol<'_> {
50-
pub fn name(&self) -> Option<SymbolName<'_>> {
51-
Some(SymbolName::new(unsafe { &*self.name }))
50+
pub fn name_raw(&self) -> Option<RawSymbolName<'_>> {
51+
Some(RawSymbolName::new(unsafe { &*self.name }))
5252
}
5353

5454
pub fn addr(&self) -> Option<*mut c_void> {

src/symbolize/gimli.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use self::gimli::NativeEndian as Endian;
77
use self::mmap::Mmap;
88
use self::stash::Stash;
99
use super::BytesOrWideString;
10+
use super::RawSymbolName;
1011
use super::ResolveWhat;
11-
use super::SymbolName;
1212
use addr2line::gimli;
1313
use core::convert::TryInto;
1414
use core::mem;
@@ -492,13 +492,13 @@ pub enum Symbol<'a> {
492492
}
493493

494494
impl Symbol<'_> {
495-
pub fn name(&self) -> Option<SymbolName<'_>> {
495+
pub fn name_raw(&self) -> Option<RawSymbolName<'_>> {
496496
match self {
497497
Symbol::Frame { name, .. } => {
498498
let name = name.as_ref()?;
499-
Some(SymbolName::new(name))
499+
Some(RawSymbolName::new(name))
500500
}
501-
Symbol::Symtab { name, .. } => Some(SymbolName::new(name)),
501+
Symbol::Symtab { name, .. } => Some(RawSymbolName::new(name)),
502502
}
503503
}
504504

src/symbolize/miri.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use core::marker::PhantomData;
33

44
use super::super::backtrace::miri::{resolve_addr, Frame};
55
use super::BytesOrWideString;
6-
use super::{ResolveWhat, SymbolName};
6+
use super::{RawSymbolName, ResolveWhat};
77

88
pub unsafe fn resolve(what: ResolveWhat<'_>, cb: &mut dyn FnMut(&super::Symbol)) {
99
let sym = match what {
@@ -25,8 +25,8 @@ pub struct Symbol<'a> {
2525
}
2626

2727
impl<'a> Symbol<'a> {
28-
pub fn name(&self) -> Option<SymbolName<'_>> {
29-
Some(SymbolName::new(&self.inner.inner.name))
28+
pub fn name_raw(&self) -> Option<RawSymbolName<'_>> {
29+
Some(RawSymbolName::new(&self.inner.inner.name))
3030
}
3131

3232
pub fn addr(&self) -> Option<*mut c_void> {

src/symbolize/mod.rs

+44-1
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,14 @@ impl Symbol {
205205
/// utf-8).
206206
/// * The raw bytes for the symbol name can be accessed.
207207
pub fn name(&self) -> Option<SymbolName<'_>> {
208-
self.inner.name()
208+
self.name_raw().map(|s| s.demangle())
209+
}
210+
211+
/// Returns the raw name of this function.
212+
///
213+
/// This is similar to `name` but doesn't do any demangling.
214+
pub fn name_raw(&self) -> Option<RawSymbolName<'_>> {
215+
self.inner.name_raw()
209216
}
210217

211218
/// Returns the starting address of this function.
@@ -356,6 +363,42 @@ impl<'a> SymbolName<'a> {
356363
}
357364
}
358365

366+
/// A wrapper around the raw, mangled, symbol name.
367+
pub struct RawSymbolName<'a> {
368+
bytes: &'a [u8],
369+
}
370+
impl<'a> RawSymbolName<'a> {
371+
/// Creates a new raw symbol name from the raw underlying bytes.
372+
pub fn new(bytes: &'a [u8]) -> RawSymbolName<'a> {
373+
RawSymbolName { bytes }
374+
}
375+
376+
/// Attempt to demangle the symbol name.
377+
pub fn demangle(self) -> SymbolName<'a> {
378+
SymbolName::new(self.bytes)
379+
}
380+
381+
/// Returns the raw (mangled) symbol name as a `str` if the symbol is valid utf-8.
382+
pub fn as_str(&self) -> Option<&'a str> {
383+
str::from_utf8(self.bytes).ok()
384+
}
385+
386+
/// Returns the raw symbol name as a list of bytes
387+
pub fn as_bytes(&self) -> &'a [u8] {
388+
self.bytes
389+
}
390+
}
391+
impl<'a> fmt::Display for RawSymbolName<'a> {
392+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
393+
format_symbol_name(fmt::Display::fmt, self.bytes, f)
394+
}
395+
}
396+
impl<'a> fmt::Debug for RawSymbolName<'a> {
397+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
398+
format_symbol_name(fmt::Debug::fmt, self.bytes, f)
399+
}
400+
}
401+
359402
fn format_symbol_name(
360403
fmt: fn(&str, &mut fmt::Formatter<'_>) -> fmt::Result,
361404
mut bytes: &[u8],

src/symbolize/noop.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Empty symbolication strategy used to compile for platforms that have no
22
//! support.
33
4-
use super::{BytesOrWideString, ResolveWhat, SymbolName};
4+
use super::{BytesOrWideString, RawSymbolName, ResolveWhat};
55
use core::ffi::c_void;
66
use core::marker;
77

@@ -12,7 +12,7 @@ pub struct Symbol<'a> {
1212
}
1313

1414
impl Symbol<'_> {
15-
pub fn name(&self) -> Option<SymbolName<'_>> {
15+
pub fn name_raw(&self) -> Option<RawSymbolName<'_>> {
1616
None
1717
}
1818

0 commit comments

Comments
 (0)