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