Implement a crude stack printing mechanism
This commit is contained in:
parent
e7785f6dfc
commit
79cd6f38f3
3 changed files with 32 additions and 0 deletions
|
|
@ -91,6 +91,10 @@ impl<T> RangeMap<T> {
|
|||
self.v.iter_mut().map(|elem| &mut elem.data)
|
||||
}
|
||||
|
||||
pub fn iter_all(&self) -> impl Iterator<Item = (ops::Range<u64>, &T)> {
|
||||
self.v.iter().map(|elem| (elem.range.clone(), &elem.data))
|
||||
}
|
||||
|
||||
// Splits the element situated at the given `index`, such that the 2nd one starts at offset
|
||||
// `split_offset`. Do nothing if the element already starts there.
|
||||
// Returns whether a split was necessary.
|
||||
|
|
|
|||
|
|
@ -417,6 +417,19 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
// shim, add it to the corresponding submodule.
|
||||
match link_name.as_str() {
|
||||
// Miri-specific extern functions
|
||||
"miri_get_alloc_id" => {
|
||||
let [ptr] = this.check_shim(abi, Abi::Rust, link_name, args)?;
|
||||
let ptr = this.read_pointer(ptr)?;
|
||||
let (alloc_id, _, _) = this.ptr_get_alloc_id(ptr)?;
|
||||
this.write_scalar(Scalar::from_u64(alloc_id.0.get()), dest)?;
|
||||
}
|
||||
"miri_print_stacks" => {
|
||||
let [id] = this.check_shim(abi, Abi::Rust, link_name, args)?;
|
||||
let id = this.read_scalar(id)?.to_u64()?;
|
||||
if let Some(id) = std::num::NonZeroU64::new(id) {
|
||||
this.print_stacks(AllocId(id))?;
|
||||
}
|
||||
}
|
||||
"miri_static_root" => {
|
||||
let [ptr] = this.check_shim(abi, Abi::Rust, link_name, args)?;
|
||||
let ptr = this.read_pointer(ptr)?;
|
||||
|
|
|
|||
|
|
@ -1123,4 +1123,19 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn print_stacks(&mut self, alloc_id: AllocId) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
let alloc_extra = this.get_alloc_extra(alloc_id)?;
|
||||
let stacks = alloc_extra.stacked_borrows.as_ref().unwrap().borrow();
|
||||
for (range, stack) in stacks.stacks.iter_all() {
|
||||
print!("{:?}: [", range);
|
||||
for i in 0..stack.len() {
|
||||
let item = stack.get(i).unwrap();
|
||||
print!(" {:?}{:?}", item.perm(), item.tag());
|
||||
}
|
||||
println!(" ]");
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue