fix ICE when debug-printing MIR
This commit is contained in:
parent
52b605c8cb
commit
d59fa081ec
1 changed files with 20 additions and 10 deletions
|
@ -1,5 +1,7 @@
|
||||||
use crate::middle::cstore::{ExternCrate, ExternCrateSource};
|
use crate::middle::cstore::{ExternCrate, ExternCrateSource};
|
||||||
use crate::mir::interpret::{sign_extend, truncate, AllocId, ConstValue, Pointer, Scalar};
|
use crate::mir::interpret::{
|
||||||
|
sign_extend, truncate, AllocId, ConstValue, GlobalAlloc, Pointer, Scalar,
|
||||||
|
};
|
||||||
use crate::ty::layout::IntegerExt;
|
use crate::ty::layout::IntegerExt;
|
||||||
use crate::ty::subst::{GenericArg, GenericArgKind, Subst};
|
use crate::ty::subst::{GenericArg, GenericArgKind, Subst};
|
||||||
use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable};
|
use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable};
|
||||||
|
@ -951,15 +953,20 @@ pub trait PrettyPrinter<'tcx>:
|
||||||
},
|
},
|
||||||
_,
|
_,
|
||||||
),
|
),
|
||||||
) => {
|
) => match self.tcx().get_global_alloc(ptr.alloc_id) {
|
||||||
let byte_str = self
|
Some(GlobalAlloc::Memory(alloc)) => {
|
||||||
.tcx()
|
if let Ok(byte_str) = alloc.get_bytes(&self.tcx(), ptr, Size::from_bytes(*data))
|
||||||
.global_alloc(ptr.alloc_id)
|
{
|
||||||
.unwrap_memory()
|
p!(pretty_print_byte_str(byte_str))
|
||||||
.get_bytes(&self.tcx(), ptr, Size::from_bytes(*data))
|
} else {
|
||||||
.unwrap();
|
p!(write("<too short allocation>"))
|
||||||
p!(pretty_print_byte_str(byte_str));
|
}
|
||||||
}
|
}
|
||||||
|
// FIXME: for statics and functions, we could in principle print more detail.
|
||||||
|
Some(GlobalAlloc::Static(def_id)) => p!(write("<static({:?})>", def_id)),
|
||||||
|
Some(GlobalAlloc::Function(_)) => p!(write("<function>")),
|
||||||
|
None => p!(write("<dangling pointer>")),
|
||||||
|
},
|
||||||
// Bool
|
// Bool
|
||||||
(Scalar::Raw { data: 0, .. }, ty::Bool) => p!(write("false")),
|
(Scalar::Raw { data: 0, .. }, ty::Bool) => p!(write("false")),
|
||||||
(Scalar::Raw { data: 1, .. }, ty::Bool) => p!(write("true")),
|
(Scalar::Raw { data: 1, .. }, ty::Bool) => p!(write("true")),
|
||||||
|
@ -1018,6 +1025,9 @@ pub trait PrettyPrinter<'tcx>:
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
(Scalar::Ptr(ptr), ty::FnPtr(_)) => {
|
(Scalar::Ptr(ptr), ty::FnPtr(_)) => {
|
||||||
|
// FIXME: this can ICE when the ptr is dangling or points to a non-function.
|
||||||
|
// We should probably have a helper method to share code with the "Byte strings"
|
||||||
|
// printing above (which also has to handle pointers to all sorts of things).
|
||||||
let instance = self.tcx().global_alloc(ptr.alloc_id).unwrap_fn();
|
let instance = self.tcx().global_alloc(ptr.alloc_id).unwrap_fn();
|
||||||
self = self.typed_value(
|
self = self.typed_value(
|
||||||
|this| this.print_value_path(instance.def_id(), instance.substs),
|
|this| this.print_value_path(instance.def_id(), instance.substs),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue