From e9b6355607d827ae23f828e8d381b6b0ce859f56 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 30 May 2018 12:05:17 +0200 Subject: [PATCH 1/6] Update the miri submodule --- src/tools/miri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri b/src/tools/miri index 6a4c62c1673c3..49ca1746482e3 160000 --- a/src/tools/miri +++ b/src/tools/miri @@ -1 +1 @@ -Subproject commit 6a4c62c1673c3dabcc9a0c99018bd08fec46fda7 +Subproject commit 49ca1746482e3c8221d8e8c7161b7d92ae076c8f From 665866d3981b4fe0b52a0ef6cab5952a34d5f412 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 30 May 2018 12:05:38 +0200 Subject: [PATCH 2/6] Don't store the discriminant with the enum's type size --- src/librustc_mir/interpret/eval_context.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 9f6e376d3062a..632f7abfdb499 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -793,7 +793,7 @@ impl<'a, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M let ty = self.place_ty(place); let place = self.eval_place(place)?; let discr_val = self.read_discriminant_value(place, ty)?; - let defined = self.layout_of(ty).unwrap().size.bits() as u8; + let defined = self.layout_of(dest_ty).unwrap().size.bits() as u8; self.write_scalar(dest, Scalar::Bits { bits: discr_val, defined, From 1236d57d841a8bd66c47202b8dddd13e269c8e6e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 30 May 2018 12:05:56 +0200 Subject: [PATCH 3/6] Don't invalidate one byte beyond the end --- src/librustc_mir/interpret/memory.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 912fc64d3429c..387eeb64c46d0 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -844,7 +844,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> { } // Forget all the relocations. - alloc.relocations.remove_range(first ..= last); + alloc.relocations.remove_range(first .. last); Ok(()) } From 823013349ffc58e243560f21886152cc62917f1d Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 30 May 2018 12:06:16 +0200 Subject: [PATCH 4/6] Pull a layout computation out of a loop --- src/librustc_mir/interpret/terminator/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/interpret/terminator/mod.rs b/src/librustc_mir/interpret/terminator/mod.rs index cc250fb68c902..634a0c9ada8bf 100644 --- a/src/librustc_mir/interpret/terminator/mod.rs +++ b/src/librustc_mir/interpret/terminator/mod.rs @@ -39,12 +39,15 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> { } => { let discr_val = self.eval_operand(discr)?; let discr_prim = self.value_to_scalar(discr_val)?; + let discr_layout = self.layout_of(discr_val.ty).unwrap(); + trace!("SwitchInt({:?}, {:#?})", discr_prim, discr_layout); + let discr_prim = discr_prim.to_bits(discr_layout.size)?; // Branch to the `otherwise` case by default, if no match is found. let mut target_block = targets[targets.len() - 1]; for (index, &const_int) in values.iter().enumerate() { - if discr_prim.to_bits(self.layout_of(discr_val.ty).unwrap().size)? == const_int { + if discr_prim == const_int { target_block = targets[index]; break; } From 03474943ec5cfd713064e085000cfe9f405a28ef Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 30 May 2018 15:41:43 +0200 Subject: [PATCH 5/6] ScalarPair for two element tuples was treated wrongly in closure calls --- src/librustc_mir/interpret/terminator/mod.rs | 36 +++++++++++++------- src/tools/miri | 2 +- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/librustc_mir/interpret/terminator/mod.rs b/src/librustc_mir/interpret/terminator/mod.rs index 634a0c9ada8bf..9151bfbdd1b3c 100644 --- a/src/librustc_mir/interpret/terminator/mod.rs +++ b/src/librustc_mir/interpret/terminator/mod.rs @@ -291,10 +291,10 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> { // and need to pack arguments Abi::Rust => { trace!( - "arg_locals: {:?}", + "arg_locals: {:#?}", self.frame().mir.args_iter().collect::>() ); - trace!("args: {:?}", args); + trace!("args: {:#?}", args); let local = arg_locals.nth(1).unwrap(); for (i, &valty) in args.into_iter().enumerate() { let dest = self.eval_place(&mir::Place::Local(local).field( @@ -321,10 +321,10 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> { let mut arg_locals = self.frame().mir.args_iter(); trace!("ABI: {:?}", sig.abi); trace!( - "arg_locals: {:?}", + "arg_locals: {:#?}", self.frame().mir.args_iter().collect::>() ); - trace!("args: {:?}", args); + trace!("args: {:#?}", args); match sig.abi { Abi::RustCall => { assert_eq!(args.len(), 2); @@ -376,14 +376,26 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> { } break; } - let dest = self.eval_place(&mir::Place::Local( - arg_locals.next().unwrap(), - ))?; - let valty = ValTy { - value: other, - ty: layout.ty, - }; - self.write_value(valty, dest)?; + { + let mut write_next = |value| { + let dest = self.eval_place(&mir::Place::Local( + arg_locals.next().unwrap(), + ))?; + let valty = ValTy { + value: Value::Scalar(value), + ty: layout.ty, + }; + self.write_value(valty, dest) + }; + match other { + Value::Scalar(value) | Value::ScalarPair(value, _) => write_next(value)?, + _ => unreachable!(), + } + if let Value::ScalarPair(_, value) = other { + write_next(value)?; + } + } + assert!(arg_locals.next().is_none()); } } } else { diff --git a/src/tools/miri b/src/tools/miri index 49ca1746482e3..ac667d372f409 160000 --- a/src/tools/miri +++ b/src/tools/miri @@ -1 +1 @@ -Subproject commit 49ca1746482e3c8221d8e8c7161b7d92ae076c8f +Subproject commit ac667d372f4094debfb9b7e29041f9e4a874fa6c From 06394518f8c53ac940977fb16467942c0a1ca58c Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 30 May 2018 15:59:42 +0200 Subject: [PATCH 6/6] Update miri submodule --- src/librustc_mir/interpret/memory.rs | 2 +- src/tools/miri | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 387eeb64c46d0..dc56de47fbf63 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -844,7 +844,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> { } // Forget all the relocations. - alloc.relocations.remove_range(first .. last); + alloc.relocations.remove_range(first..last); Ok(()) } diff --git a/src/tools/miri b/src/tools/miri index ac667d372f409..066a284557ff6 160000 --- a/src/tools/miri +++ b/src/tools/miri @@ -1 +1 @@ -Subproject commit ac667d372f4094debfb9b7e29041f9e4a874fa6c +Subproject commit 066a284557ff6e6a2aa19084f599f167a724af7b