diff options
| author | Oliver Schneider <git-spam-no-reply9815368754983@oli-obk.de> | 2017-08-08 16:29:47 +0200 |
|---|---|---|
| committer | Oliver Schneider <git-spam-no-reply9815368754983@oli-obk.de> | 2017-08-08 17:09:26 +0200 |
| commit | 9e787fbd82050ab2f15cc9897acd1cf42d5fc8aa (patch) | |
| tree | d633b3f42c3d0a31d73fd7fc13e0f2a53ee544e1 | |
| parent | 897b563e70f7b6a1079b3ef292a836a34aa64ff1 (diff) | |
| download | rust-9e787fbd82050ab2f15cc9897acd1cf42d5fc8aa.tar.gz rust-9e787fbd82050ab2f15cc9897acd1cf42d5fc8aa.zip | |
Dump all allocs when dumping locals
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 8908c0f729e..eb6e33a52f6 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -1621,41 +1621,52 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> { pub fn dump_local(&self, lvalue: Lvalue) { // Debug output - if let Lvalue::Local { frame, local } = lvalue { - let mut allocs = Vec::new(); - let mut msg = format!("{:?}", local); - if frame != self.cur_frame() { - write!(msg, " ({} frames up)", self.cur_frame() - frame).unwrap(); - } - write!(msg, ":").unwrap(); - - match self.stack[frame].get_local(local) { - Err(EvalError{ kind: EvalErrorKind::DeadLocal, ..} ) => { - write!(msg, " is dead").unwrap(); + match lvalue { + Lvalue::Local { frame, local } => { + let mut allocs = Vec::new(); + let mut msg = format!("{:?}", local); + if frame != self.cur_frame() { + write!(msg, " ({} frames up)", self.cur_frame() - frame).unwrap(); } - Err(err) => { - panic!("Failed to access local: {:?}", err); + write!(msg, ":").unwrap(); + + match self.stack[frame].get_local(local) { + Err(EvalError{ kind: EvalErrorKind::DeadLocal, ..} ) => { + write!(msg, " is dead").unwrap(); + } + Err(err) => { + panic!("Failed to access local: {:?}", err); + } + Ok(Value::ByRef(PtrAndAlign{ ptr, aligned })) => match ptr.into_inner_primval() { + PrimVal::Ptr(ptr) => { + write!(msg, " by {}ref:", if aligned { "" } else { "unaligned " }).unwrap(); + allocs.push(ptr.alloc_id); + }, + ptr => write!(msg, " integral by ref: {:?}", ptr).unwrap(), + }, + Ok(Value::ByVal(val)) => { + write!(msg, " {:?}", val).unwrap(); + if let PrimVal::Ptr(ptr) = val { allocs.push(ptr.alloc_id); } + } + Ok(Value::ByValPair(val1, val2)) => { + write!(msg, " ({:?}, {:?})", val1, val2).unwrap(); + if let PrimVal::Ptr(ptr) = val1 { allocs.push(ptr.alloc_id); } + if let PrimVal::Ptr(ptr) = val2 { allocs.push(ptr.alloc_id); } + } } - Ok(Value::ByRef(PtrAndAlign{ ptr, aligned })) => match ptr.into_inner_primval() { + + trace!("{}", msg); + self.memory.dump_allocs(allocs); + } + Lvalue::Ptr { ptr: PtrAndAlign { ptr, aligned }, .. } => { + match ptr.into_inner_primval() { PrimVal::Ptr(ptr) => { - write!(msg, " by {}ref:", if aligned { "" } else { "unaligned " }).unwrap(); - allocs.push(ptr.alloc_id); + trace!("by {}ref:", if aligned { "" } else { "unaligned " }); + self.memory.dump_alloc(ptr.alloc_id); }, - ptr => write!(msg, " integral by ref: {:?}", ptr).unwrap(), - }, - Ok(Value::ByVal(val)) => { - write!(msg, " {:?}", val).unwrap(); - if let PrimVal::Ptr(ptr) = val { allocs.push(ptr.alloc_id); } - } - Ok(Value::ByValPair(val1, val2)) => { - write!(msg, " ({:?}, {:?})", val1, val2).unwrap(); - if let PrimVal::Ptr(ptr) = val1 { allocs.push(ptr.alloc_id); } - if let PrimVal::Ptr(ptr) = val2 { allocs.push(ptr.alloc_id); } + ptr => trace!(" integral by ref: {:?}", ptr), } } - - trace!("{}", msg); - self.memory.dump_allocs(allocs); } } |
