Implement intrinsic init

This commit is contained in:
bjorn3 2018-10-02 18:40:58 +02:00
parent fce5fa5231
commit 1694b07b87

View file

@ -821,6 +821,24 @@ fn codegen_intrinsic_call<'a, 'tcx: 'a>(
let dst_layout = fx.layout_of(dst_ty);
ret.write_cvalue(fx, CValue::ByRef(addr, dst_layout))
}
"init" => {
assert_eq!(args.len(), 0);
let ty = substs.type_at(0);
let layout = fx.layout_of(ty);
let stack_slot = fx.bcx.create_stack_slot(StackSlotData {
kind: StackSlotKind::ExplicitSlot,
size: layout.size.bytes() as u32,
offset: None,
});
let addr = fx.bcx.ins().stack_addr(pointer_ty(fx.tcx), stack_slot, 0);
let zero_val = fx.bcx.ins().iconst(types::I8, 0);
let len_val = fx.bcx.ins().iconst(pointer_ty(fx.tcx), layout.size.bytes() as i64);
fx.bcx.call_memset(fx.isa, addr, zero_val, len_val);
let uninit_place = CPlace::from_stack_slot(fx, stack_slot, ty);
let uninit_val = uninit_place.to_cvalue(fx);
ret.write_cvalue(fx, uninit_val);
}
"uninit" => {
assert_eq!(args.len(), 0);
let ty = substs.type_at(0);