use alloc::borrow::Cow;
use alloc::str;
use core::fmt;
use addr2line::gimli;
use addr2line::Context;
mod freestanding;
use self::freestanding::resolve as resolve_imp;
use self::freestanding::Symbol as SymbolImp;
pub fn resolve<F: FnMut(&Symbol)>(
ctxt: Option<&Context<gimli::EndianRcSlice<gimli::RunTimeEndian>>>,
offset: u64,
addr: *mut u8,
mut cb: F,
) -> Result<(), addr2line::gimli::Error> {
resolve_imp(ctxt, offset, addr, &mut cb)
}
pub struct Symbol {
inner: SymbolImp,
}
impl Symbol {
pub fn name(&self) -> Option<Cow<str>> {
self.inner.name()
}
pub fn addr(&self) -> Option<*mut u8> {
self.inner.addr()
}
pub fn filename(&self) -> Option<&str> {
self.inner.filename()
}
pub fn lineno(&self) -> Option<u32> {
self.inner.lineno()
}
}
impl fmt::Debug for Symbol {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut d = f.debug_struct("Symbol");
if let Some(name) = self.name() {
d.field("name", &name);
}
if let Some(addr) = self.addr() {
d.field("addr", &addr);
}
if let Some(filename) = self.filename() {
d.field("filename", &filename);
}
if let Some(lineno) = self.lineno() {
d.field("lineno", &lineno);
}
d.finish()
}
}