adjust for rustc changes

This commit is contained in:
Ralf Jung 2019-08-03 20:31:33 +02:00
parent 9d3fdeeed7
commit f65e7cd2d1
8 changed files with 36 additions and 53 deletions

View File

@ -1 +1 @@
8e917f48382c6afaf50568263b89d35fba5d98e4
a45743345659c775b01484574af2818c46a2cb03

View File

@ -41,10 +41,9 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
let main_mir = ecx.load_mir(main_instance.def)?;
if !main_mir.return_ty().is_unit() || main_mir.arg_count != 0 {
throw_unsup!(Unimplemented(
throw_unsup_format!(
"miri does not support main functions without `fn()` type signatures"
.to_owned(),
));
);
}
let start_id = tcx.lang_items().start_fn().unwrap();
@ -60,10 +59,10 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
let start_mir = ecx.load_mir(start_instance.def)?;
if start_mir.arg_count != 3 {
throw_unsup!(AbiViolation(format!(
bug!(
"'start' lang item should have three arguments, but has {}",
start_mir.arg_count
)));
);
}
// Return value (in static memory so that it does not count as leak).

View File

@ -247,9 +247,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'tcx> {
let data = vec![0; size.bytes() as usize];
Allocation::from_bytes(&data, tcx.data_layout.pointer_align.abi)
}
_ => throw_unsup!(Unimplemented(
format!("can't access foreign static: {}", link_name),
)),
_ => throw_unsup_format!("can't access foreign static: {}", link_name),
};
Ok(Cow::Owned(alloc))
}

View File

@ -16,9 +16,7 @@ impl Dlsym {
"getentropy" => Some(GetEntropy),
"__pthread_get_minstack" => None,
_ =>
throw_unsup!(Unimplemented(format!(
"Unsupported dlsym: {}", name
))),
throw_unsup_format!("Unsupported dlsym: {}", name),
})
}
}

View File

@ -141,7 +141,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
// First: functions that diverge.
match link_name {
"__rust_start_panic" | "panic_impl" => {
throw_unsup!(MachineError("the evaluated program panicked".to_string()));
throw_unsup_format!("the evaluated program panicked");
}
"exit" | "ExitProcess" => {
// it's really u32 for ExitProcess, but we have to put it into the `Exit` error variant anyway
@ -149,9 +149,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
return Err(InterpError::Exit(code).into());
}
_ => if dest.is_none() {
throw_unsup!(Unimplemented(
format!("can't call diverging foreign function: {}", link_name),
));
throw_unsup_format!("can't call (diverging) foreign function: {}", link_name);
}
}
@ -183,10 +181,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
FIXME: This check is disabled because rustc violates it.
See <https://github.com/rust-lang/rust/issues/62251>.
if align < this.pointer_size().bytes() {
throw_unsup!(MachineError(format!(
throw_ub_format!(
"posix_memalign: alignment must be at least the size of a pointer, but is {}",
align,
)));
);
}
*/
if size == 0 {
@ -309,9 +307,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
this.write_scalar(Scalar::from_uint(len, dest.layout.size), dest)?;
}
id => {
throw_unsup!(Unimplemented(
format!("miri does not support syscall ID {}", id),
))
throw_unsup_format!("miri does not support syscall ID {}", id)
}
}
}
@ -359,12 +355,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
)?;
let mut args = this.frame().body.args_iter();
let arg_local = args.next().ok_or_else(||
err_unsup!(AbiViolation(
"Argument to __rust_maybe_catch_panic does not take enough arguments."
.to_owned(),
)),
)?;
let arg_local = args.next()
.expect("Argument to __rust_maybe_catch_panic does not take enough arguments.");
let arg_dest = this.local_place(arg_local)?;
this.write_scalar(data, arg_dest)?;
@ -632,9 +624,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
if let Some(result) = result {
this.write_scalar(result, dest)?;
} else {
throw_unsup!(Unimplemented(
format!("Unimplemented sysconf name: {}", name),
));
throw_unsup_format!("Unimplemented sysconf name: {}", name)
}
}
@ -661,9 +651,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
// This is `libc::pthread_key_t`.
let key_type = args[0].layout.ty
.builtin_deref(true)
.ok_or_else(|| err_unsup!(
AbiViolation("wrong signature used for `pthread_key_create`: first argument must be a raw pointer.".to_owned())
))?
.ok_or_else(|| err_ub!(Ub(format!(
"wrong signature used for `pthread_key_create`: first argument must be a raw pointer."
))))?
.ty;
let key_layout = this.layout_of(key_type)?;
@ -729,7 +719,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
// We don't support threading. (Also for Windows.)
"pthread_create" | "CreateThread" => {
throw_unsup!(Unimplemented(format!("Miri does not support threading")));
throw_unsup_format!("Miri does not support threading");
}
// Stub out calls for condvar, mutex and rwlock, to just return `0`.
@ -948,9 +938,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
// We can't execute anything else.
_ => {
throw_unsup!(Unimplemented(
format!("can't call foreign function: {}", link_name),
));
throw_unsup_format!("can't call foreign function: {}", link_name)
}
}

View File

@ -133,7 +133,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
"atomic_xsub_relaxed" => {
let ptr = this.deref_operand(args[0])?;
if !ptr.layout.ty.is_integral() {
throw_unsup!(Unimplemented(format!("Atomic arithmetic operations only work on integer types")));
bug!("Atomic arithmetic operations only work on integer types");
}
let rhs = this.read_immediate(args[1])?;
let old = this.read_immediate(ptr.into())?;
@ -279,9 +279,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
// Check if `b` is -1, which is the "min_value / -1" case.
let minus1 = Scalar::from_int(-1, dest.layout.size);
return Err(if b.to_scalar().unwrap() == minus1 {
err_unsup!(Intrinsic(format!("exact_div: result of dividing MIN by -1 cannot be represented")))
err_ub!(Ub(format!("exact_div: result of dividing MIN by -1 cannot be represented")))
} else {
err_unsup!(Intrinsic(format!("exact_div: {:?} cannot be divided by {:?} without remainder", *a, *b)))
err_ub!(Ub(format!("exact_div: {:?} cannot be divided by {:?} without remainder", *a, *b)))
}.into());
}
this.binop_ignore_overflow(mir::BinOp::Div, a, b, dest)?;
@ -350,7 +350,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
let ty = substs.type_at(0);
let layout = this.layout_of(ty)?;
if layout.abi.is_uninhabited() {
throw_unsup!(Intrinsic(format!("Trying to instantiate uninhabited type {}", ty)))
throw_ub_format!("Trying to instantiate uninhabited type {}", ty)
}
}
@ -444,7 +444,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
let r = this.read_immediate(args[1])?;
let rval = r.to_scalar()?.to_bits(args[1].layout.size)?;
if rval == 0 {
throw_unsup!(Intrinsic(format!("Division by 0 in unchecked_div")));
throw_ub_format!("Division by 0 in unchecked_div");
}
this.binop_ignore_overflow(
mir::BinOp::Div,
@ -459,7 +459,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
let r = this.read_immediate(args[1])?;
let rval = r.to_scalar()?.to_bits(args[1].layout.size)?;
if rval == 0 {
throw_unsup!(Intrinsic(format!("Division by 0 in unchecked_rem")));
throw_ub_format!("Division by 0 in unchecked_rem");
}
this.binop_ignore_overflow(
mir::BinOp::Rem,
@ -480,7 +480,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
};
let (res, overflowed) = this.binary_op(op, l, r)?;
if overflowed {
throw_unsup!(Intrinsic(format!("Overflowing arithmetic in {}", intrinsic_name.get())));
throw_ub_format!("Overflowing arithmetic in {}", intrinsic_name.get());
}
this.write_scalar(res, dest)?;
}
@ -504,7 +504,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
}
}
name => throw_unsup!(Unimplemented(format!("unimplemented intrinsic: {}", name))),
name => throw_unsup_format!("unimplemented intrinsic: {}", name),
}
Ok(())

View File

@ -158,7 +158,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
StackPopCleanup::None { cleanup: true },
)?;
let arg_local = this.frame().body.args_iter().next().ok_or_else(
|| err_unsup!(AbiViolation("TLS dtor does not take enough arguments.".to_owned())),
|| err_ub!(Ub(format!("TLS dtor does not take enough arguments."))),
)?;
let dest = this.local_place(arg_local)?;
this.write_scalar(ptr, dest)?;

View File

@ -273,14 +273,14 @@ impl<'tcx> Stack {
if let Some(call) = item.protector {
if global.is_active(call) {
if let Some(tag) = tag {
throw_unsup!(MachineError(format!(
throw_ub_format!(
"not granting access to tag {:?} because incompatible item is protected: {:?}",
tag, item
)));
);
} else {
throw_unsup!(MachineError(format!(
throw_ub_format!(
"deallocating while item is protected: {:?}", item
)));
);
}
}
}
@ -299,7 +299,7 @@ impl<'tcx> Stack {
// Step 1: Find granting item.
let granting_idx = self.find_granting(access, tag)
.ok_or_else(|| err_unsup!(MachineError(format!(
.ok_or_else(|| err_ub!(Ub(format!(
"no item granting {} to tag {:?} found in borrow stack",
access, tag,
))))?;
@ -346,7 +346,7 @@ impl<'tcx> Stack {
) -> InterpResult<'tcx> {
// Step 1: Find granting item.
self.find_granting(AccessKind::Write, tag)
.ok_or_else(|| err_unsup!(MachineError(format!(
.ok_or_else(|| err_ub!(Ub(format!(
"no item granting write access for deallocation to tag {:?} found in borrow stack",
tag,
))))?;
@ -378,7 +378,7 @@ impl<'tcx> Stack {
// Now we figure out which item grants our parent (`derived_from`) this kind of access.
// We use that to determine where to put the new item.
let granting_idx = self.find_granting(access, derived_from)
.ok_or_else(|| err_unsup!(MachineError(format!(
.ok_or_else(|| err_ub!(Ub(format!(
"trying to reborrow for {:?}, but parent tag {:?} does not have an appropriate item in the borrow stack", new.perm, derived_from,
))))?;