Skip to content

Commit 22c97b3

Browse files
committed
Auto merge of #2138 - JakobDegen:call-fallout, r=RalfJung
Adjust Miri to also require return places everywhere This is the miri side of rust-lang/rust#96098 . It'll still need a bump to rust-version once the rust PR is merged, but the test suite passes against my local build of rustc.
2 parents ede9ae6 + e428d29 commit 22c97b3

17 files changed

+57
-49
lines changed

rust-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
32c8c5df06c025441ad04791d7982d65c79a60e4
1+
b2eba058e6e1c698723e47074561a30b50b5fa7a

src/diagnostics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ pub fn report_error<'tcx, 'mir>(
275275
for (i, frame) in ecx.active_thread_stack().iter().enumerate() {
276276
trace!("-------------------");
277277
trace!("Frame {}", i);
278-
trace!(" return: {:?}", frame.return_place.map(|p| *p));
278+
trace!(" return: {:?}", *frame.return_place);
279279
for (i, local) in frame.locals.iter().enumerate() {
280280
trace!(" local {}: {:?}", i, local.value);
281281
}

src/eval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
277277
start_instance,
278278
Abi::Rust,
279279
&[Scalar::from_pointer(main_ptr, &ecx).into(), argc.into(), argv],
280-
Some(&ret_place.into()),
280+
&ret_place.into(),
281281
StackPopCleanup::Root { cleanup: true },
282282
)?;
283283
}
@@ -286,7 +286,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
286286
entry_instance,
287287
Abi::Rust,
288288
&[argc.into(), argv],
289-
Some(&ret_place.into()),
289+
&ret_place.into(),
290290
StackPopCleanup::Root { cleanup: true },
291291
)?;
292292
}

src/helpers.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
240240
f: ty::Instance<'tcx>,
241241
caller_abi: Abi,
242242
args: &[Immediate<Tag>],
243-
dest: Option<&PlaceTy<'tcx, Tag>>,
243+
dest: &PlaceTy<'tcx, Tag>,
244244
stack_pop: StackPopCleanup,
245245
) -> InterpResult<'tcx> {
246246
let this = self.eval_context_mut();

src/machine.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -512,10 +512,11 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
512512
instance: ty::Instance<'tcx>,
513513
abi: Abi,
514514
args: &[OpTy<'tcx, Tag>],
515-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
515+
dest: &PlaceTy<'tcx, Tag>,
516+
ret: Option<mir::BasicBlock>,
516517
unwind: StackPopUnwind,
517518
) -> InterpResult<'tcx, Option<(&'mir mir::Body<'tcx>, ty::Instance<'tcx>)>> {
518-
ecx.find_mir_or_eval_fn(instance, abi, args, ret, unwind)
519+
ecx.find_mir_or_eval_fn(instance, abi, args, dest, ret, unwind)
519520
}
520521

521522
#[inline(always)]
@@ -524,21 +525,23 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
524525
fn_val: Dlsym,
525526
abi: Abi,
526527
args: &[OpTy<'tcx, Tag>],
527-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
528+
dest: &PlaceTy<'tcx, Tag>,
529+
ret: Option<mir::BasicBlock>,
528530
_unwind: StackPopUnwind,
529531
) -> InterpResult<'tcx> {
530-
ecx.call_dlsym(fn_val, abi, args, ret)
532+
ecx.call_dlsym(fn_val, abi, args, dest, ret)
531533
}
532534

533535
#[inline(always)]
534536
fn call_intrinsic(
535537
ecx: &mut MiriEvalContext<'mir, 'tcx>,
536538
instance: ty::Instance<'tcx>,
537539
args: &[OpTy<'tcx, Tag>],
538-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
540+
dest: &PlaceTy<'tcx, Tag>,
541+
ret: Option<mir::BasicBlock>,
539542
unwind: StackPopUnwind,
540543
) -> InterpResult<'tcx> {
541-
ecx.call_intrinsic(instance, args, ret, unwind)
544+
ecx.call_intrinsic(instance, args, dest, ret, unwind)
542545
}
543546

544547
#[inline(always)]

src/shims/dlsym.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
3232
dlsym: Dlsym,
3333
abi: Abi,
3434
args: &[OpTy<'tcx, Tag>],
35-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
35+
dest: &PlaceTy<'tcx, Tag>,
36+
ret: Option<mir::BasicBlock>,
3637
) -> InterpResult<'tcx> {
3738
let this = self.eval_context_mut();
3839
match dlsym {
39-
Dlsym::Posix(dlsym) => posix::EvalContextExt::call_dlsym(this, dlsym, abi, args, ret),
40+
Dlsym::Posix(dlsym) =>
41+
posix::EvalContextExt::call_dlsym(this, dlsym, abi, args, dest, ret),
4042
Dlsym::Windows(dlsym) =>
41-
windows::EvalContextExt::call_dlsym(this, dlsym, abi, args, ret),
43+
windows::EvalContextExt::call_dlsym(this, dlsym, abi, args, dest, ret),
4244
}
4345
}
4446
}

src/shims/foreign_items.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,15 +232,16 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
232232
def_id: DefId,
233233
abi: Abi,
234234
args: &[OpTy<'tcx, Tag>],
235-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
235+
dest: &PlaceTy<'tcx, Tag>,
236+
ret: Option<mir::BasicBlock>,
236237
unwind: StackPopUnwind,
237238
) -> InterpResult<'tcx, Option<(&'mir mir::Body<'tcx>, ty::Instance<'tcx>)>> {
238239
let this = self.eval_context_mut();
239240
let link_name = this.item_link_name(def_id);
240241
let tcx = this.tcx.tcx;
241242

242243
// First: functions that diverge.
243-
let (dest, ret) = match ret {
244+
let ret = match ret {
244245
None =>
245246
match &*link_name.as_str() {
246247
"miri_start_panic" => {

src/shims/intrinsics.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,20 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2222
&mut self,
2323
instance: ty::Instance<'tcx>,
2424
args: &[OpTy<'tcx, Tag>],
25-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
25+
dest: &PlaceTy<'tcx, Tag>,
26+
ret: Option<mir::BasicBlock>,
2627
_unwind: StackPopUnwind,
2728
) -> InterpResult<'tcx> {
2829
let this = self.eval_context_mut();
2930

30-
if this.emulate_intrinsic(instance, args, ret)? {
31+
if this.emulate_intrinsic(instance, args, dest, ret)? {
3132
return Ok(());
3233
}
3334

3435
// All supported intrinsics have a return place.
3536
let intrinsic_name = this.tcx.item_name(instance.def_id());
3637
let intrinsic_name = intrinsic_name.as_str();
37-
let (dest, ret) = match ret {
38+
let ret = match ret {
3839
None => throw_unsup_format!("unimplemented (diverging) intrinsic: {}", intrinsic_name),
3940
Some(p) => p,
4041
};

src/shims/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2828
instance: ty::Instance<'tcx>,
2929
abi: Abi,
3030
args: &[OpTy<'tcx, Tag>],
31-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
31+
dest: &PlaceTy<'tcx, Tag>,
32+
ret: Option<mir::BasicBlock>,
3233
unwind: StackPopUnwind,
3334
) -> InterpResult<'tcx, Option<(&'mir mir::Body<'tcx>, ty::Instance<'tcx>)>> {
3435
let this = self.eval_context_mut();
35-
trace!("eval_fn_call: {:#?}, {:?}", instance, ret.map(|p| p.0));
36+
trace!("eval_fn_call: {:#?}, {:?}", instance, dest);
3637

3738
// There are some more lang items we want to hook that CTFE does not hook (yet).
3839
if this.tcx.lang_items().align_offset_fn() == Some(instance.def.def_id()) {
3940
let [ptr, align] = check_arg_count(args)?;
40-
if this.align_offset(ptr, align, ret, unwind)? {
41+
if this.align_offset(ptr, align, dest, ret, unwind)? {
4142
return Ok(None);
4243
}
4344
}
@@ -50,7 +51,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
5051
// to run extra MIR), and Ok(Some(body)) if we found MIR to run for the
5152
// foreign function
5253
// Any needed call to `goto_block` will be performed by `emulate_foreign_item`.
53-
return this.emulate_foreign_item(instance.def_id(), abi, args, ret, unwind);
54+
return this.emulate_foreign_item(instance.def_id(), abi, args, dest, ret, unwind);
5455
}
5556

5657
// Otherwise, load the MIR.
@@ -63,11 +64,12 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
6364
&mut self,
6465
ptr_op: &OpTy<'tcx, Tag>,
6566
align_op: &OpTy<'tcx, Tag>,
66-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
67+
dest: &PlaceTy<'tcx, Tag>,
68+
ret: Option<mir::BasicBlock>,
6769
unwind: StackPopUnwind,
6870
) -> InterpResult<'tcx, bool> {
6971
let this = self.eval_context_mut();
70-
let (dest, ret) = ret.unwrap();
72+
let ret = ret.unwrap();
7173

7274
if this.machine.check_alignment != AlignmentCheck::Symbolic {
7375
// Just use actual implementation.

src/shims/panic.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
9696
f_instance,
9797
Abi::Rust,
9898
&[data.into()],
99-
Some(&ret_place),
99+
&ret_place,
100100
// Directly return to caller.
101101
StackPopCleanup::Goto { ret: Some(ret), unwind: StackPopUnwind::Skip },
102102
)?;
@@ -153,7 +153,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
153153
f_instance,
154154
Abi::Rust,
155155
&[catch_unwind.data.into(), payload.into()],
156-
Some(&ret_place),
156+
&ret_place,
157157
// Directly return to caller of `try`.
158158
StackPopCleanup::Goto { ret: Some(catch_unwind.ret), unwind: StackPopUnwind::Skip },
159159
)?;
@@ -179,7 +179,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
179179
panic,
180180
Abi::Rust,
181181
&[msg.to_ref(this)],
182-
None,
182+
&MPlaceTy::dangling(this.machine.layouts.unit).into(),
183183
StackPopCleanup::Goto { ret: None, unwind },
184184
)
185185
}
@@ -208,7 +208,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
208208
panic_bounds_check,
209209
Abi::Rust,
210210
&[index.into(), len.into()],
211-
None,
211+
&MPlaceTy::dangling(this.machine.layouts.unit).into(),
212212
StackPopCleanup::Goto {
213213
ret: None,
214214
unwind: match unwind {

src/shims/posix/dlsym.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,16 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
3030
dlsym: Dlsym,
3131
abi: Abi,
3232
args: &[OpTy<'tcx, Tag>],
33-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
33+
dest: &PlaceTy<'tcx, Tag>,
34+
ret: Option<mir::BasicBlock>,
3435
) -> InterpResult<'tcx> {
3536
let this = self.eval_context_mut();
3637

3738
this.check_abi(abi, Abi::C { unwind: false })?;
3839

3940
match dlsym {
40-
Dlsym::Linux(dlsym) => linux::EvalContextExt::call_dlsym(this, dlsym, args, ret),
41-
Dlsym::MacOs(dlsym) => macos::EvalContextExt::call_dlsym(this, dlsym, args, ret),
41+
Dlsym::Linux(dlsym) => linux::EvalContextExt::call_dlsym(this, dlsym, args, dest, ret),
42+
Dlsym::MacOs(dlsym) => macos::EvalContextExt::call_dlsym(this, dlsym, args, dest, ret),
4243
}
4344
}
4445
}

src/shims/posix/linux/dlsym.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2424
&mut self,
2525
dlsym: Dlsym,
2626
_args: &[OpTy<'tcx, Tag>],
27-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
27+
_dest: &PlaceTy<'tcx, Tag>,
28+
ret: Option<mir::BasicBlock>,
2829
) -> InterpResult<'tcx> {
2930
let this = self.eval_context_mut();
30-
let (_dest, _ret) = ret.expect("we don't support any diverging dlsym");
31+
let _ret = ret.expect("we don't support any diverging dlsym");
3132
assert!(this.tcx.sess.target.os == "linux");
3233

3334
match dlsym {}

src/shims/posix/macos/dlsym.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2828
&mut self,
2929
dlsym: Dlsym,
3030
args: &[OpTy<'tcx, Tag>],
31-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
31+
dest: &PlaceTy<'tcx, Tag>,
32+
ret: Option<mir::BasicBlock>,
3233
) -> InterpResult<'tcx> {
3334
let this = self.eval_context_mut();
34-
let (dest, ret) = ret.expect("we don't support any diverging dlsym");
35+
let ret = ret.expect("we don't support any diverging dlsym");
3536
assert!(this.tcx.sess.target.os == "macos");
3637

3738
match dlsym {

src/shims/posix/thread.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
5151
instance,
5252
Abi::C { unwind: false },
5353
&[*func_arg],
54-
Some(&ret_place.into()),
54+
&ret_place.into(),
5555
StackPopCleanup::Root { cleanup: true },
5656
)?;
5757

src/shims/tls.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ trait EvalContextPrivExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
258258
thread_callback,
259259
Abi::System { unwind: false },
260260
&[Scalar::null_ptr(this).into(), reason.into(), Scalar::null_ptr(this).into()],
261-
Some(&ret_place),
261+
&ret_place,
262262
StackPopCleanup::Root { cleanup: true },
263263
)?;
264264

@@ -281,7 +281,7 @@ trait EvalContextPrivExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
281281
instance,
282282
Abi::C { unwind: false },
283283
&[data.into()],
284-
Some(&ret_place),
284+
&ret_place,
285285
StackPopCleanup::Root { cleanup: true },
286286
)?;
287287

@@ -324,7 +324,7 @@ trait EvalContextPrivExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
324324
instance,
325325
Abi::C { unwind: false },
326326
&[ptr.into()],
327-
Some(&ret_place),
327+
&ret_place,
328328
StackPopCleanup::Root { cleanup: true },
329329
)?;
330330

src/shims/windows/dlsym.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
3131
dlsym: Dlsym,
3232
abi: Abi,
3333
args: &[OpTy<'tcx, Tag>],
34-
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
34+
dest: &PlaceTy<'tcx, Tag>,
35+
ret: Option<mir::BasicBlock>,
3536
) -> InterpResult<'tcx> {
3637
let this = self.eval_context_mut();
37-
let (dest, ret) = ret.expect("we don't support any diverging dlsym");
38+
let ret = ret.expect("we don't support any diverging dlsym");
3839
assert!(this.tcx.sess.target.os == "windows");
3940

4041
this.check_abi(abi, Abi::System { unwind: false })?;

src/stacked_borrows.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -930,12 +930,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
930930
/// explicit. Also see https://github.com/rust-lang/rust/issues/71117.
931931
fn retag_return_place(&mut self) -> InterpResult<'tcx> {
932932
let this = self.eval_context_mut();
933-
let return_place = if let Some(return_place) = this.frame_mut().return_place {
934-
return_place
935-
} else {
936-
// No return place, nothing to do.
937-
return Ok(());
938-
};
933+
let return_place = this.frame_mut().return_place;
939934
if return_place.layout.is_zst() {
940935
// There may not be any memory here, nothing to do.
941936
return Ok(());
@@ -955,7 +950,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
955950
)?;
956951
// And use reborrowed pointer for return place.
957952
let return_place = this.ref_to_mplace(&val)?;
958-
this.frame_mut().return_place = Some(return_place.into());
953+
this.frame_mut().return_place = return_place.into();
959954

960955
Ok(())
961956
}

0 commit comments

Comments
 (0)