summaryrefslogtreecommitdiffstats
path: root/library/backtrace/src/symbolize/miri.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/backtrace/src/symbolize/miri.rs')
-rw-r--r--library/backtrace/src/symbolize/miri.rs56
1 files changed, 56 insertions, 0 deletions
diff --git a/library/backtrace/src/symbolize/miri.rs b/library/backtrace/src/symbolize/miri.rs
new file mode 100644
index 000000000..5b0dc3084
--- /dev/null
+++ b/library/backtrace/src/symbolize/miri.rs
@@ -0,0 +1,56 @@
+use core::ffi::c_void;
+use core::marker::PhantomData;
+
+use super::super::backtrace::miri::{resolve_addr, Frame};
+use super::BytesOrWideString;
+use super::{ResolveWhat, SymbolName};
+
+pub unsafe fn resolve(what: ResolveWhat<'_>, cb: &mut dyn FnMut(&super::Symbol)) {
+ let sym = match what {
+ ResolveWhat::Address(addr) => Symbol {
+ inner: resolve_addr(addr),
+ _unused: PhantomData,
+ },
+ ResolveWhat::Frame(frame) => Symbol {
+ inner: frame.inner.clone(),
+ _unused: PhantomData,
+ },
+ };
+ cb(&super::Symbol { inner: sym })
+}
+
+pub struct Symbol<'a> {
+ inner: Frame,
+ _unused: PhantomData<&'a ()>,
+}
+
+impl<'a> Symbol<'a> {
+ pub fn name(&self) -> Option<SymbolName<'_>> {
+ Some(SymbolName::new(&self.inner.inner.name))
+ }
+
+ pub fn addr(&self) -> Option<*mut c_void> {
+ Some(self.inner.addr)
+ }
+
+ pub fn filename_raw(&self) -> Option<BytesOrWideString<'_>> {
+ Some(BytesOrWideString::Bytes(&self.inner.inner.filename))
+ }
+
+ pub fn lineno(&self) -> Option<u32> {
+ Some(self.inner.inner.lineno)
+ }
+
+ pub fn colno(&self) -> Option<u32> {
+ Some(self.inner.inner.colno)
+ }
+
+ #[cfg(feature = "std")]
+ pub fn filename(&self) -> Option<&std::path::Path> {
+ Some(std::path::Path::new(
+ core::str::from_utf8(&self.inner.inner.filename).unwrap(),
+ ))
+ }
+}
+
+pub unsafe fn clear_symbol_cache() {}