]> git.lizzy.rs Git - rust.git/commitdiff
Revert "uninit intrinsic is gone"
authorRalf Jung <post@ralfj.de>
Wed, 7 Aug 2019 08:24:27 +0000 (10:24 +0200)
committerRalf Jung <post@ralfj.de>
Wed, 7 Aug 2019 08:49:36 +0000 (10:49 +0200)
This reverts commit fa290f1a481b0f98ed1de06206e643af8e04acd5.
Uninit is being reinstated because it breaks some broken code.

src/shims/intrinsics.rs

index c96869c80cee7c1c549a5294272bd435bcd4a793..4e957f792b7513721902d334d126f742c76d28d8 100644 (file)
@@ -522,6 +522,37 @@ fn call_intrinsic(
                 this.write_scalar(res, dest)?;
             }
 
+            "uninit" => {
+                // Check fast path: we don't want to force an allocation in case the destination is a simple value,
+                // but we also do not want to create a new allocation with 0s and then copy that over.
+                // FIXME: We do not properly validate in case of ZSTs and when doing it in memory!
+                // However, this only affects direct calls of the intrinsic; calls to the stable
+                // functions wrapping them do get their validation.
+                // FIXME: should we check alignment for ZSTs?
+                use crate::ScalarMaybeUndef;
+                if !dest.layout.is_zst() {
+                    match dest.layout.abi {
+                        layout::Abi::Scalar(..) => {
+                            let x = ScalarMaybeUndef::Undef;
+                            this.write_immediate(Immediate::Scalar(x), dest)?;
+                        }
+                        layout::Abi::ScalarPair(..) => {
+                            let x = ScalarMaybeUndef::Undef;
+                            this.write_immediate(Immediate::ScalarPair(x, x), dest)?;
+                        }
+                        _ => {
+                            // Do it in memory
+                            let mplace = this.force_allocation(dest)?;
+                            assert!(mplace.meta.is_none());
+                            let ptr = mplace.ptr.to_ptr()?;
+                            this.memory_mut()
+                                .get_mut(ptr.alloc_id)?
+                                .mark_definedness(ptr, dest.layout.size, false);
+                        }
+                    }
+                }
+            }
+
             "write_bytes" => {
                 let ty = substs.type_at(0);
                 let ty_layout = this.layout_of(ty)?;