@@ -19,10 +19,10 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
19
19
dest_ty : Ty < ' tcx > ,
20
20
dest_layout : & ' tcx Layout ,
21
21
) -> EvalResult < ' tcx , ( ) > {
22
- let args_ptrs : EvalResult < Vec < Value > > = args. iter ( )
22
+ let arg_vals : EvalResult < Vec < Value > > = args. iter ( )
23
23
. map ( |arg| self . eval_operand ( arg) )
24
24
. collect ( ) ;
25
- let args_ptrs = args_ptrs ?;
25
+ let arg_vals = arg_vals ?;
26
26
let i32 = self . tcx . types . i32 ;
27
27
let isize = self . tcx . types . isize ;
28
28
let usize = self . tcx . types . usize ;
@@ -42,32 +42,31 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
42
42
43
43
44
44
"arith_offset" => {
45
- let ptr = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
46
- let offset = self . value_to_primval ( args_ptrs [ 1 ] , isize) ?
45
+ let ptr = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
46
+ let offset = self . value_to_primval ( arg_vals [ 1 ] , isize) ?
47
47
. expect_int ( "arith_offset second arg not isize" ) ;
48
48
let new_ptr = ptr. offset ( offset as isize ) ;
49
49
self . write_primval ( dest, PrimVal :: from_ptr ( new_ptr) ) ?;
50
50
}
51
51
52
52
"assume" => {
53
53
let bool = self . tcx . types . bool ;
54
- let cond = self . value_to_primval ( args_ptrs[ 0 ] , bool) ?
55
- . expect_bool ( "assume arg not bool" ) ;
54
+ let cond = self . value_to_primval ( arg_vals[ 0 ] , bool) ?. try_as_bool ( ) ?;
56
55
if !cond { return Err ( EvalError :: AssumptionNotHeld ) ; }
57
56
}
58
57
59
58
"atomic_load" |
60
59
"volatile_load" => {
61
60
let ty = substs. type_at ( 0 ) ;
62
- let ptr = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
61
+ let ptr = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
63
62
self . write_value ( Value :: ByRef ( ptr) , dest, ty) ?;
64
63
}
65
64
66
65
"atomic_store" |
67
66
"volatile_store" => {
68
67
let ty = substs. type_at ( 0 ) ;
69
- let dest = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
70
- self . write_value_to_ptr ( args_ptrs [ 1 ] , dest, ty) ?;
68
+ let dest = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
69
+ self . write_value_to_ptr ( arg_vals [ 1 ] , dest, ty) ?;
71
70
}
72
71
73
72
"breakpoint" => unimplemented ! ( ) , // halt miri
@@ -78,9 +77,9 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
78
77
let elem_ty = substs. type_at ( 0 ) ;
79
78
let elem_size = self . type_size ( elem_ty) ;
80
79
let elem_align = self . type_align ( elem_ty) ;
81
- let src = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
82
- let dest = args_ptrs [ 1 ] . read_ptr ( & self . memory ) ?;
83
- let count = self . value_to_primval ( args_ptrs [ 2 ] , usize) ?
80
+ let src = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
81
+ let dest = arg_vals [ 1 ] . read_ptr ( & self . memory ) ?;
82
+ let count = self . value_to_primval ( arg_vals [ 2 ] , usize) ?
84
83
. expect_uint ( "arith_offset second arg not isize" ) ;
85
84
self . memory . copy ( src, dest, count as usize * elem_size, elem_align) ?;
86
85
}
@@ -90,34 +89,34 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
90
89
"ctlz" |
91
90
"bswap" => {
92
91
let elem_ty = substs. type_at ( 0 ) ;
93
- let num = self . value_to_primval ( args_ptrs [ 0 ] , elem_ty) ?;
92
+ let num = self . value_to_primval ( arg_vals [ 0 ] , elem_ty) ?;
94
93
let num = numeric_intrinsic ( intrinsic_name, num) ;
95
94
self . write_primval ( dest, num) ?;
96
95
}
97
96
98
97
"discriminant_value" => {
99
98
let ty = substs. type_at ( 0 ) ;
100
- let adt_ptr = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
99
+ let adt_ptr = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
101
100
let discr_val = self . read_discriminant_value ( adt_ptr, ty) ?;
102
101
self . write_primval ( dest, PrimVal :: new ( discr_val, PrimValKind :: U64 ) ) ?;
103
102
}
104
103
105
104
"fabsf32" => {
106
- let f = self . value_to_primval ( args_ptrs [ 2 ] , f32) ?
105
+ let f = self . value_to_primval ( arg_vals [ 2 ] , f32) ?
107
106
. expect_f32 ( "fabsf32 read non f32" ) ;
108
107
self . write_primval ( dest, PrimVal :: from_f32 ( f. abs ( ) ) ) ?;
109
108
}
110
109
111
110
"fabsf64" => {
112
- let f = self . value_to_primval ( args_ptrs [ 2 ] , f64) ?
111
+ let f = self . value_to_primval ( arg_vals [ 2 ] , f64) ?
113
112
. expect_f64 ( "fabsf64 read non f64" ) ;
114
113
self . write_primval ( dest, PrimVal :: from_f64 ( f. abs ( ) ) ) ?;
115
114
}
116
115
117
116
"fadd_fast" => {
118
117
let ty = substs. type_at ( 0 ) ;
119
- let a = self . value_to_primval ( args_ptrs [ 0 ] , ty) ?;
120
- let b = self . value_to_primval ( args_ptrs [ 0 ] , ty) ?;
118
+ let a = self . value_to_primval ( arg_vals [ 0 ] , ty) ?;
119
+ let b = self . value_to_primval ( arg_vals [ 0 ] , ty) ?;
121
120
let result = primval:: binary_op ( mir:: BinOp :: Add , a, b) ?;
122
121
self . write_primval ( dest, result. 0 ) ?;
123
122
}
@@ -151,8 +150,8 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
151
150
152
151
"move_val_init" => {
153
152
let ty = substs. type_at ( 0 ) ;
154
- let ptr = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
155
- self . write_value_to_ptr ( args_ptrs [ 1 ] , ptr, ty) ?;
153
+ let ptr = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
154
+ self . write_value_to_ptr ( arg_vals [ 1 ] , ptr, ty) ?;
156
155
}
157
156
158
157
"needs_drop" => {
@@ -165,10 +164,10 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
165
164
"offset" => {
166
165
let pointee_ty = substs. type_at ( 0 ) ;
167
166
let pointee_size = self . type_size ( pointee_ty) as isize ;
168
- let offset = self . value_to_primval ( args_ptrs [ 1 ] , isize) ?
167
+ let offset = self . value_to_primval ( arg_vals [ 1 ] , isize) ?
169
168
. expect_int ( "offset second arg not isize" ) ;
170
169
171
- let ptr = args_ptrs [ 0 ] . read_ptr ( & self . memory ) ?;
170
+ let ptr = arg_vals [ 0 ] . read_ptr ( & self . memory ) ?;
172
171
let result_ptr = ptr. offset ( offset as isize * pointee_size) ;
173
172
self . write_primval ( dest, PrimVal :: from_ptr ( result_ptr) ) ?;
174
173
}
@@ -186,29 +185,29 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
186
185
}
187
186
188
187
"powif32" => {
189
- let f = self . value_to_primval ( args_ptrs [ 0 ] , f32) ?
188
+ let f = self . value_to_primval ( arg_vals [ 0 ] , f32) ?
190
189
. expect_f32 ( "powif32 first arg not f32" ) ;
191
- let i = self . value_to_primval ( args_ptrs [ 1 ] , i32) ?
190
+ let i = self . value_to_primval ( arg_vals [ 1 ] , i32) ?
192
191
. expect_int ( "powif32 second arg not i32" ) ;
193
192
self . write_primval ( dest, PrimVal :: from_f32 ( f. powi ( i as i32 ) ) ) ?;
194
193
}
195
194
196
195
"powif64" => {
197
- let f = self . value_to_primval ( args_ptrs [ 0 ] , f64) ?
196
+ let f = self . value_to_primval ( arg_vals [ 0 ] , f64) ?
198
197
. expect_f64 ( "powif64 first arg not f64" ) ;
199
- let i = self . value_to_primval ( args_ptrs [ 1 ] , i32) ?
198
+ let i = self . value_to_primval ( arg_vals [ 1 ] , i32) ?
200
199
. expect_int ( "powif64 second arg not i32" ) ;
201
200
self . write_primval ( dest, PrimVal :: from_f64 ( f. powi ( i as i32 ) ) ) ?;
202
201
}
203
202
204
203
"sqrtf32" => {
205
- let f = self . value_to_primval ( args_ptrs [ 0 ] , f32) ?
204
+ let f = self . value_to_primval ( arg_vals [ 0 ] , f32) ?
206
205
. expect_f32 ( "sqrtf32 first arg not f32" ) ;
207
206
self . write_primval ( dest, PrimVal :: from_f32 ( f. sqrt ( ) ) ) ?;
208
207
}
209
208
210
209
"sqrtf64" => {
211
- let f = self . value_to_primval ( args_ptrs [ 0 ] , f64) ?
210
+ let f = self . value_to_primval ( arg_vals [ 0 ] , f64) ?
212
211
. expect_f64 ( "sqrtf64 first arg not f64" ) ;
213
212
self . write_primval ( dest, PrimVal :: from_f64 ( f. sqrt ( ) ) ) ?;
214
213
}
@@ -222,7 +221,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
222
221
223
222
"size_of_val" => {
224
223
let ty = substs. type_at ( 0 ) ;
225
- let ( size, _) = self . size_and_align_of_dst ( ty, args_ptrs [ 0 ] ) ?;
224
+ let ( size, _) = self . size_and_align_of_dst ( ty, arg_vals [ 0 ] ) ?;
226
225
let size_val = self . usize_primval ( size) ;
227
226
self . write_primval ( dest, size_val) ?;
228
227
}
@@ -239,8 +238,13 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
239
238
}
240
239
241
240
"transmute" => {
242
- let ty = substs. type_at ( 0 ) ;
243
- self . write_value ( args_ptrs[ 0 ] , dest, ty) ?;
241
+ let dest_ty = substs. type_at ( 1 ) ;
242
+ let val = match arg_vals[ 0 ] {
243
+ Value :: ByVal ( primval) =>
244
+ Value :: ByVal ( self . transmute_primval ( primval, dest_ty) ?) ,
245
+ v => v,
246
+ } ;
247
+ self . write_value ( val, dest, dest_ty) ?;
244
248
}
245
249
246
250
"uninit" => {
0 commit comments