@@ -37,6 +37,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
37
37
self . write_immediate ( res, dest) ?;
38
38
}
39
39
40
+ PointerFromExposedAddress => {
41
+ let src = self . read_immediate ( src) ?;
42
+ let res = self . pointer_from_exposed_address_cast ( & src, cast_ty) ?;
43
+ self . write_immediate ( res, dest) ?;
44
+ }
45
+
40
46
Misc => {
41
47
let src = self . read_immediate ( src) ?;
42
48
let res = self . misc_cast ( & src, cast_ty) ?;
@@ -201,6 +207,24 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
201
207
Ok ( self . cast_from_int_like ( scalar, src. layout , cast_ty) ?. into ( ) )
202
208
}
203
209
210
+ pub fn pointer_from_exposed_address_cast (
211
+ & mut self ,
212
+ src : & ImmTy < ' tcx , M :: PointerTag > ,
213
+ cast_ty : Ty < ' tcx > ,
214
+ ) -> InterpResult < ' tcx , Immediate < M :: PointerTag > > {
215
+ assert ! ( src. layout. ty. is_integral( ) ) ;
216
+ assert_matches ! ( cast_ty. kind( ) , ty:: RawPtr ( _) ) ;
217
+
218
+ // First cast to usize.
219
+ let scalar = src. to_scalar ( ) ?;
220
+ let addr = self . cast_from_int_like ( scalar, src. layout , self . tcx . types . usize ) ?;
221
+ let addr = addr. to_machine_usize ( self ) ?;
222
+
223
+ // Then turn address into pointer.
224
+ let ptr = M :: ptr_from_addr_cast ( & self , addr) ;
225
+ Ok ( Scalar :: from_maybe_pointer ( ptr, self ) . into ( ) )
226
+ }
227
+
204
228
pub fn cast_from_int_like (
205
229
& self ,
206
230
scalar : Scalar < M :: PointerTag > , // input value (there is no ScalarTy so we separate data+layout)
@@ -225,16 +249,6 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
225
249
Scalar :: from_uint ( v, size)
226
250
}
227
251
228
- RawPtr ( _) => {
229
- assert ! ( src_layout. ty. is_integral( ) ) ;
230
-
231
- let size = self . pointer_size ( ) ;
232
- let addr = u64:: try_from ( size. truncate ( v) ) . unwrap ( ) ;
233
-
234
- let ptr = M :: ptr_from_addr_cast ( & self , addr) ;
235
- Scalar :: from_maybe_pointer ( ptr, self )
236
- }
237
-
238
252
Float ( FloatTy :: F32 ) if signed => Scalar :: from_f32 ( Single :: from_i128 ( v as i128 ) . value ) ,
239
253
Float ( FloatTy :: F64 ) if signed => Scalar :: from_f64 ( Double :: from_i128 ( v as i128 ) . value ) ,
240
254
Float ( FloatTy :: F32 ) => Scalar :: from_f32 ( Single :: from_u128 ( v) . value ) ,
0 commit comments