Auto merge of #2121 - RalfJung:less-ice, r=RalfJung
don't ICE when libcore is missing Fixes https://github.com/rust-lang/miri/issues/2120
This commit is contained in:
commit
8f7c8f7808
13
src/eval.rs
13
src/eval.rs
@ -172,15 +172,18 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
|||||||
Evaluator::late_init(&mut ecx, config)?;
|
Evaluator::late_init(&mut ecx, config)?;
|
||||||
|
|
||||||
// Make sure we have MIR. We check MIR for some stable monomorphic function in libcore.
|
// Make sure we have MIR. We check MIR for some stable monomorphic function in libcore.
|
||||||
let sentinel = ecx.resolve_path(&["core", "ascii", "escape_default"]);
|
let sentinel = ecx.try_resolve_path(&["core", "ascii", "escape_default"]);
|
||||||
if !tcx.is_mir_available(sentinel.def.def_id()) {
|
if !matches!(sentinel, Some(s) if tcx.is_mir_available(s.def.def_id())) {
|
||||||
tcx.sess.fatal("the current sysroot was built without `-Zalways-encode-mir`. Use `cargo miri setup` to prepare a sysroot that is suitable for Miri.");
|
tcx.sess.fatal(
|
||||||
|
"the current sysroot was built without `-Zalways-encode-mir`, or libcore seems missing. \
|
||||||
|
Use `cargo miri setup` to prepare a sysroot that is suitable for Miri."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup first stack-frame
|
// Setup first stack frame.
|
||||||
let entry_instance = ty::Instance::mono(tcx, entry_id);
|
let entry_instance = ty::Instance::mono(tcx, entry_id);
|
||||||
|
|
||||||
// First argument is constructed later, because its skipped if the entry function uses #[start]
|
// First argument is constructed later, because it's skipped if the entry function uses #[start].
|
||||||
|
|
||||||
// Second argument (argc): length of `config.args`.
|
// Second argument (argc): length of `config.args`.
|
||||||
let argc = Scalar::from_machine_usize(u64::try_from(config.args.len()).unwrap(), &ecx);
|
let argc = Scalar::from_machine_usize(u64::try_from(config.args.len()).unwrap(), &ecx);
|
||||||
|
@ -71,11 +71,16 @@ fn try_resolve_did<'tcx>(tcx: TyCtxt<'tcx>, path: &[&str]) -> Option<DefId> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
|
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
|
||||||
|
/// Gets an instance for a path; fails gracefully if the path does not exist.
|
||||||
|
fn try_resolve_path(&self, path: &[&str]) -> Option<ty::Instance<'tcx>> {
|
||||||
|
let did = try_resolve_did(self.eval_context_ref().tcx.tcx, path)?;
|
||||||
|
Some(ty::Instance::mono(self.eval_context_ref().tcx.tcx, did))
|
||||||
|
}
|
||||||
|
|
||||||
/// Gets an instance for a path.
|
/// Gets an instance for a path.
|
||||||
fn resolve_path(&self, path: &[&str]) -> ty::Instance<'tcx> {
|
fn resolve_path(&self, path: &[&str]) -> ty::Instance<'tcx> {
|
||||||
let did = try_resolve_did(self.eval_context_ref().tcx.tcx, path)
|
self.try_resolve_path(path)
|
||||||
.unwrap_or_else(|| panic!("failed to find required Rust item: {:?}", path));
|
.unwrap_or_else(|| panic!("failed to find required Rust item: {:?}", path))
|
||||||
ty::Instance::mono(self.eval_context_ref().tcx.tcx, did)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Evaluates the scalar at the specified path. Returns Some(val)
|
/// Evaluates the scalar at the specified path. Returns Some(val)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user