@@ -37,6 +37,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
3737 self . write_immediate ( res, dest) ?;
3838 }
3939
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+
4046 Misc => {
4147 let src = self . read_immediate ( src) ?;
4248 let res = self . misc_cast ( & src, cast_ty) ?;
@@ -201,6 +207,24 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
201207 Ok ( self . cast_from_int_like ( scalar, src. layout , cast_ty) ?. into ( ) )
202208 }
203209
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+
204228 pub fn cast_from_int_like (
205229 & self ,
206230 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> {
225249 Scalar :: from_uint ( v, size)
226250 }
227251
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-
238252 Float ( FloatTy :: F32 ) if signed => Scalar :: from_f32 ( Single :: from_i128 ( v as i128 ) . value ) ,
239253 Float ( FloatTy :: F64 ) if signed => Scalar :: from_f64 ( Double :: from_i128 ( v as i128 ) . value ) ,
240254 Float ( FloatTy :: F32 ) => Scalar :: from_f32 ( Single :: from_u128 ( v) . value ) ,
0 commit comments