about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorOliver Schneider <oli-obk@users.noreply.github.com>2017-09-15 14:14:46 +0200
committerGitHub <noreply@github.com>2017-09-15 14:14:46 +0200
commitf13455af2b2afb6caf4599a2dc6c67dd864c974c (patch)
tree9e8b2adb7cdcb7cd129927c6b9802108e41be773 /src
parente8ea7da20111ce4e57031dc959678ec5429ee9b9 (diff)
parent8cbfbf77f86ad242395bc283d784514b3398de25 (diff)
downloadrust-f13455af2b2afb6caf4599a2dc6c67dd864c974c.tar.gz
rust-f13455af2b2afb6caf4599a2dc6c67dd864c974c.zip
Merge pull request #340 from solson/babysteps
Remove `#[linkage(foo)]` statics from core miri
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/interpret/const_eval.rs10
-rw-r--r--src/librustc_mir/interpret/machine.rs8
-rw-r--r--src/librustc_mir/interpret/step.rs18
3 files changed, 19 insertions, 17 deletions
diff --git a/src/librustc_mir/interpret/const_eval.rs b/src/librustc_mir/interpret/const_eval.rs
index c6483ff1783..7fa28dccbab 100644
--- a/src/librustc_mir/interpret/const_eval.rs
+++ b/src/librustc_mir/interpret/const_eval.rs
@@ -245,4 +245,14 @@ impl<'tcx> super::Machine<'tcx> for CompileTimeFunctionEvaluator {
             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(),
+        )
+    }
 }
diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs
index 2d607005fe7..debb17fc0a7 100644
--- a/src/librustc_mir/interpret/machine.rs
+++ b/src/librustc_mir/interpret/machine.rs
@@ -6,6 +6,7 @@ use super::{EvalResult, EvalContext, Lvalue, PrimVal, ValTy};
 
 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 @@ pub trait Machine<'tcx>: Sized {
         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>;
 }
diff --git a/src/librustc_mir/interpret/step.rs b/src/librustc_mir/interpret/step.rs
index 05f1bd10e87..1f538707527 100644
--- a/src/librustc_mir/interpret/step.rs
+++ b/src/librustc_mir/interpret/step.rs
@@ -205,23 +205,7 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
             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)?;