]> git.lizzy.rs Git - rust.git/commitdiff
Implement intrinsic init
authorbjorn3 <bjorn3@users.noreply.github.com>
Tue, 2 Oct 2018 16:40:58 +0000 (18:40 +0200)
committerbjorn3 <bjorn3@users.noreply.github.com>
Tue, 2 Oct 2018 16:41:16 +0000 (18:41 +0200)
src/abi.rs

index 7b9b0a18025130325af3ebeb0a6fd2699792efff..ea4275e50b0ec8e1dfede62883fd32f896f049f0 100644 (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);