@@ -6,10 +6,10 @@ use syntax::symbol::Symbol;
66use rustc:: ty;
77use rustc:: ty:: layout:: { LayoutOf , Primitive , Size } ;
88use rustc:: mir:: BinOp ;
9- use rustc:: mir:: interpret:: { InterpResult , Scalar } ;
9+ use rustc:: mir:: interpret:: { InterpResult , Scalar , GlobalId } ;
1010
1111use super :: {
12- Machine , PlaceTy , OpTy , InterpCx , Immediate ,
12+ Machine , PlaceTy , OpTy , InterpCx ,
1313} ;
1414
1515mod type_name;
@@ -49,41 +49,18 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
4949
5050 let intrinsic_name = & self . tcx . item_name ( instance. def_id ( ) ) . as_str ( ) [ ..] ;
5151 match intrinsic_name {
52- "min_align_of" => {
53- let elem_ty = substs. type_at ( 0 ) ;
54- let elem_align = self . layout_of ( elem_ty) ?. align . abi . bytes ( ) ;
55- let align_val = Scalar :: from_uint ( elem_align, dest. layout . size ) ;
56- self . write_scalar ( align_val, dest) ?;
57- }
58-
59- "needs_drop" => {
60- let ty = substs. type_at ( 0 ) ;
61- let ty_needs_drop = ty. needs_drop ( self . tcx . tcx , self . param_env ) ;
62- let val = Scalar :: from_bool ( ty_needs_drop) ;
63- self . write_scalar ( val, dest) ?;
64- }
65-
66- "size_of" => {
67- let ty = substs. type_at ( 0 ) ;
68- let size = self . layout_of ( ty) ?. size . bytes ( ) as u128 ;
69- let size_val = Scalar :: from_uint ( size, dest. layout . size ) ;
70- self . write_scalar ( size_val, dest) ?;
71- }
72-
73- "type_id" => {
74- let ty = substs. type_at ( 0 ) ;
75- let type_id = self . tcx . type_id_hash ( ty) as u128 ;
76- let id_val = Scalar :: from_uint ( type_id, dest. layout . size ) ;
77- self . write_scalar ( id_val, dest) ?;
78- }
79-
52+ "min_align_of" |
53+ "needs_drop" |
54+ "size_of" |
55+ "type_id" |
8056 "type_name" => {
81- let alloc = alloc_type_name ( self . tcx . tcx , substs. type_at ( 0 ) ) ;
82- let name_id = self . tcx . alloc_map . lock ( ) . create_memory_alloc ( alloc) ;
83- let id_ptr = self . memory . tag_static_base_pointer ( name_id. into ( ) ) ;
84- let alloc_len = alloc. bytes . len ( ) as u64 ;
85- let name_val = Immediate :: new_slice ( Scalar :: Ptr ( id_ptr) , alloc_len, self ) ;
86- self . write_immediate ( name_val, dest) ?;
57+ let gid = GlobalId {
58+ instance,
59+ promoted : None ,
60+ } ;
61+ let val = self . tcx . const_eval ( ty:: ParamEnv :: reveal_all ( ) . and ( gid) ) ?;
62+ let val = self . eval_const_to_op ( val, None ) ?;
63+ self . copy_op ( val, dest) ?;
8764 }
8865
8966 | "ctpop"
0 commit comments