]> git.lizzy.rs Git - rust.git/commitdiff
Remove `#[linkage(foo)]` statics from core miri
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Fri, 15 Sep 2017 11:02:33 +0000 (13:02 +0200)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Fri, 15 Sep 2017 11:03:07 +0000 (13:03 +0200)
miri/lib.rs
src/librustc_mir/interpret/const_eval.rs
src/librustc_mir/interpret/machine.rs
src/librustc_mir/interpret/step.rs

index a824f47a509f54cf410c1f223ca8c0243117109f..428724f7de5d9b047f94a33b61559483d40b37f8 100644 (file)
@@ -239,4 +239,32 @@ fn box_alloc<'a>(
                 .map(PrimVal::Ptr)
         }
     }
+
+    fn global_item_with_linkage<'a>(
+        ecx: &mut EvalContext<'a, 'tcx, Self>,
+        instance: ty::Instance<'tcx>,
+        mutability: Mutability,
+    ) -> EvalResult<'tcx> {
+        // FIXME: check that it's `#[linkage = "extern_weak"]`
+        trace!("Initializing an extern global with NULL");
+        let ptr_size = ecx.memory.pointer_size();
+        let ptr = ecx.memory.allocate(
+            ptr_size,
+            ptr_size,
+            MemoryKind::UninitializedStatic,
+        )?;
+        ecx.memory.write_ptr_sized_unsigned(ptr, PrimVal::Bytes(0))?;
+        ecx.memory.mark_static_initalized(ptr.alloc_id, mutability)?;
+        ecx.globals.insert(
+            GlobalId {
+                instance,
+                promoted: None,
+            },
+            PtrAndAlign {
+                ptr: ptr.into(),
+                aligned: true,
+            },
+        );
+        Ok(())
+    }
 }
index c6483ff178333f7ad60f02e1fd52dff1ad9e5627..7fa28dccbabe4991d926b98e795f06fa9548c12a 100644 (file)
@@ -245,4 +245,14 @@ fn box_alloc<'a>(
             ConstEvalError::NeedsRfc("Heap allocations via `box` keyword".to_string()).into(),
         )
     }
+
+    fn global_item_with_linkage<'a>(
+        _ecx: &mut EvalContext<'a, 'tcx, Self>,
+        _instance: ty::Instance<'tcx>,
+        _mutability: Mutability,
+    ) -> EvalResult<'tcx> {
+        Err(
+            ConstEvalError::NotConst("statics with `linkage` attribute".to_string()).into(),
+        )
+    }
 }
index 2d607005fe7d7091f8c31790fd6d146d7aa3afb1..debb17fc0a7f96fd9e3938a1f95cd80bebaa2440 100644 (file)
@@ -6,6 +6,7 @@
 
 use rustc::{mir, ty};
 use syntax::codemap::Span;
+use syntax::ast::Mutability;
 
 /// Methods of this trait signifies a point where CTFE evaluation would fail
 /// and some use case dependent behaviour can instead be applied
@@ -70,4 +71,11 @@ fn box_alloc<'a>(
         ecx: &mut EvalContext<'a, 'tcx, Self>,
         ty: ty::Ty<'tcx>,
     ) -> EvalResult<'tcx, PrimVal>;
+
+    /// Called when trying to access a global declared with a `linkage` attribute
+    fn global_item_with_linkage<'a>(
+        ecx: &mut EvalContext<'a, 'tcx, Self>,
+        instance: ty::Instance<'tcx>,
+        mutability: Mutability,
+    ) -> EvalResult<'tcx>;
 }
index 05f1bd10e87e85efac1f516f15896001a9f38c05..1f538707527f2b074be9a0b8b67b53c0a60cd591 100644 (file)
@@ -205,23 +205,7 @@ fn global_item(
             return Ok(false);
         }
         if self.tcx.has_attr(def_id, "linkage") {
-            // FIXME: check that it's `#[linkage = "extern_weak"]`
-            trace!("Initializing an extern global with NULL");
-            let ptr_size = self.memory.pointer_size();
-            let ptr = self.memory.allocate(
-                ptr_size,
-                ptr_size,
-                MemoryKind::UninitializedStatic,
-            )?;
-            self.memory.write_ptr_sized_unsigned(ptr, PrimVal::Bytes(0))?;
-            self.memory.mark_static_initalized(ptr.alloc_id, mutability)?;
-            self.globals.insert(
-                cid,
-                PtrAndAlign {
-                    ptr: ptr.into(),
-                    aligned: true,
-                },
-            );
+            M::global_item_with_linkage(self, cid.instance, mutability)?;
             return Ok(false);
         }
         let mir = self.load_mir(instance.def)?;