Rollup merge of #66844 - RalfJung:caller-location-leak, r=oli-obk
Miri: do not consider memory allocated by caller_location leaked Fixes https://github.com/rust-lang/miri/issues/1071 r? @oli-obk I am not sure if this is the best approach, but it certainly is the easiest.
This commit is contained in:
commit
0f6745d6e2
3 changed files with 9 additions and 5 deletions
|
@ -100,7 +100,7 @@ fn intern_shallow<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>>(
|
|||
// This match is just a canary for future changes to `MemoryKind`, which most likely need
|
||||
// changes in this function.
|
||||
match kind {
|
||||
MemoryKind::Stack | MemoryKind::Vtable => {},
|
||||
MemoryKind::Stack | MemoryKind::Vtable | MemoryKind::CallerLocation => {},
|
||||
}
|
||||
// Set allocation mutability as appropriate. This is used by LLVM to put things into
|
||||
// read-only memory, and also by Miri when evluating other constants/statics that
|
||||
|
|
|
@ -28,7 +28,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
let file = Scalar::Ptr(self.tag_static_base_pointer(file_ptr));
|
||||
let file_len = Scalar::from_uint(filename.as_str().len() as u128, ptr_size);
|
||||
|
||||
let location = self.allocate(loc_layout, MemoryKind::Stack);
|
||||
let location = self.allocate(loc_layout, MemoryKind::CallerLocation);
|
||||
|
||||
let file_out = self.mplace_field(location, 0)?;
|
||||
let file_ptr_out = self.force_ptr(self.mplace_field(file_out, 0)?.ptr)?;
|
||||
|
|
|
@ -24,11 +24,13 @@ use super::{
|
|||
|
||||
#[derive(Debug, PartialEq, Copy, Clone)]
|
||||
pub enum MemoryKind<T> {
|
||||
/// Error if deallocated except during a stack pop
|
||||
/// Stack memory. Error if deallocated except during a stack pop.
|
||||
Stack,
|
||||
/// Error if ever deallocated
|
||||
/// Memory backing vtables. Error if ever deallocated.
|
||||
Vtable,
|
||||
/// Additional memory kinds a machine wishes to distinguish from the builtin ones
|
||||
/// Memory allocated by `caller_location` intrinsic. Error if ever deallocated.
|
||||
CallerLocation,
|
||||
/// Additional memory kinds a machine wishes to distinguish from the builtin ones.
|
||||
Machine(T),
|
||||
}
|
||||
|
||||
|
@ -38,6 +40,7 @@ impl<T: MayLeak> MayLeak for MemoryKind<T> {
|
|||
match self {
|
||||
MemoryKind::Stack => false,
|
||||
MemoryKind::Vtable => true,
|
||||
MemoryKind::CallerLocation => true,
|
||||
MemoryKind::Machine(k) => k.may_leak()
|
||||
}
|
||||
}
|
||||
|
@ -719,6 +722,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {
|
|||
let extra = match kind {
|
||||
MemoryKind::Stack => " (stack)".to_owned(),
|
||||
MemoryKind::Vtable => " (vtable)".to_owned(),
|
||||
MemoryKind::CallerLocation => " (caller_location)".to_owned(),
|
||||
MemoryKind::Machine(m) => format!(" ({:?})", m),
|
||||
};
|
||||
self.dump_alloc_helper(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue