be51e6bd07
The `backtrace-rs` crate can use this to implement `Frame::symbol_address`, which is used to skip frames above the call to `Backtrace::capture` on the stack. The function pointer will not be useable for comparison purposes if the function is generic, as CTFE creates a new function pointer for each cast of a (monomorphized) generic function. However, this already affects code running under Miri, and isn't a problem for `backtrace-rs` (which only casts a non-generic function). I've added logic to allow `MiriFrame` to have either 4 or 5 fields - if a 5th field is present, we write the function pointer to it.
14 lines
415 B
Rust
14 lines
415 B
Rust
extern "Rust" {
|
|
fn miri_get_backtrace(flags: u64) -> Box<[*mut ()]>;
|
|
fn miri_resolve_frame(ptr: *mut (), flags: u64);
|
|
}
|
|
|
|
fn main() {
|
|
let frames = unsafe { miri_get_backtrace(0) };
|
|
for frame in frames.into_iter() {
|
|
unsafe {
|
|
miri_resolve_frame(*frame, 0); //~ ERROR Undefined Behavior: bad declaration of miri_resolve_frame - should return a struct with 5 fields
|
|
}
|
|
}
|
|
}
|