@@ -186,11 +186,24 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
186
186
} ;
187
187
ret. write_cvalue( fx, CValue :: by_val( align, usize_layout) ) ;
188
188
} ;
189
+ pref_align_of, <T > ( ) {
190
+ let pref_align = fx. layout_of( T ) . align. pref. bytes( ) ;
191
+ let pref_align = CValue :: const_val( fx, usize_layout. ty, pref_align as i64 ) ;
192
+ ret. write_cvalue( fx, pref_align) ;
193
+ } ;
194
+
195
+
189
196
type_id, <T > ( ) {
190
197
let type_id = fx. tcx. type_id_hash( T ) ;
191
198
let type_id = CValue :: const_val( fx, u64_layout. ty, type_id as i64 ) ;
192
199
ret. write_cvalue( fx, type_id) ;
193
200
} ;
201
+ type_name, <T > ( ) {
202
+ let type_name = fx. tcx. type_name( T ) ;
203
+ let type_name = crate :: constant:: trans_const_value( fx, * type_name) ;
204
+ ret. write_cvalue( fx, type_name) ;
205
+ } ;
206
+
194
207
_ if intrinsic. starts_with( "unchecked_" ) || intrinsic == "exact_div" , ( c x, c y) {
195
208
// FIXME trap on overflow
196
209
let bin_op = match intrinsic {
@@ -418,6 +431,19 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
418
431
}
419
432
} ;
420
433
434
+ volatile_load, ( c ptr) {
435
+ // Cranelift treats loads as volatile by default
436
+ let inner_layout =
437
+ fx. layout_of( ptr. layout( ) . ty. builtin_deref( true ) . unwrap( ) . ty) ;
438
+ let val = CValue :: by_ref( ptr. load_scalar( fx) , inner_layout) ;
439
+ ret. write_cvalue( fx, val) ;
440
+ } ;
441
+ volatile_store, ( v ptr, c val) {
442
+ // Cranelift treats stores as volatile by default
443
+ let dest = CPlace :: for_addr( ptr, val. layout( ) ) ;
444
+ dest. write_cvalue( fx, val) ;
445
+ } ;
446
+
421
447
_ if intrinsic. starts_with( "atomic_fence" ) , ( ) { } ;
422
448
_ if intrinsic. starts_with( "atomic_singlethreadfence" ) , ( ) { } ;
423
449
_ if intrinsic. starts_with( "atomic_load" ) , ( c ptr) {
0 commit comments