Skip to content

Commit 9d9649a

Browse files
committed
move ModifiedStatic error to ConstEval errors, and generally adjust terminology from "static" to "global" where appropriate
1 parent 342c5f3 commit 9d9649a

File tree

11 files changed

+117
-105
lines changed

11 files changed

+117
-105
lines changed

src/librustc/mir/interpret/error.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -453,9 +453,6 @@ pub enum UnsupportedOpInfo {
453453
ReadForeignStatic(DefId),
454454
/// Could not find MIR for a function.
455455
NoMirFor(DefId),
456-
/// Modified a static during const-eval.
457-
/// FIXME: move this to `ConstEvalErrKind` through a machine hook.
458-
ModifiedStatic,
459456
/// Encountered a pointer where we needed raw bytes.
460457
ReadPointerAsBytes,
461458
/// Encountered raw bytes where we needed a pointer.
@@ -471,12 +468,6 @@ impl fmt::Debug for UnsupportedOpInfo {
471468
write!(f, "tried to read from foreign (extern) static {:?}", did)
472469
}
473470
NoMirFor(did) => write!(f, "could not load MIR for {:?}", did),
474-
ModifiedStatic => write!(
475-
f,
476-
"tried to modify a static's initial value from another static's \
477-
initializer"
478-
),
479-
480471
ReadPointerAsBytes => write!(f, "unable to turn pointer into raw bytes",),
481472
ReadBytesAsPointer => write!(f, "unable to turn bytes into a pointer"),
482473
}

src/librustc/ty/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,7 @@ pub struct GlobalCtxt<'tcx> {
984984
/// Stores the value of constants (and deduplicates the actual memory)
985985
allocation_interner: ShardedHashMap<&'tcx Allocation, ()>,
986986

987+
/// Stores memory for globals (statics/consts).
987988
pub alloc_map: Lock<interpret::AllocMap<'tcx>>,
988989

989990
layout_interner: ShardedHashMap<&'tcx LayoutDetails, ()>,

src/librustc_mir/const_eval/error.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::interpret::{ConstEvalErr, InterpErrorInfo, Machine};
1212
pub enum ConstEvalErrKind {
1313
NeedsRfc(String),
1414
ConstAccessesStatic,
15+
ModifiedGlobal,
1516
AssertFailure(AssertKind<u64>),
1617
Panic { msg: Symbol, line: u32, col: u32, file: Symbol },
1718
}
@@ -33,6 +34,11 @@ impl fmt::Display for ConstEvalErrKind {
3334
write!(f, "\"{}\" needs an rfc before being allowed inside constants", msg)
3435
}
3536
ConstAccessesStatic => write!(f, "constant accesses static"),
37+
ModifiedGlobal => write!(
38+
f,
39+
"modifying a static's initial value from another static's \
40+
initializer"
41+
),
3642
AssertFailure(ref msg) => write!(f, "{:?}", msg),
3743
Panic { msg, line, col, file } => {
3844
write!(f, "the evaluated program panicked at '{}', {}:{}:{}", msg, file, line, col)

src/librustc_mir/const_eval/machine.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use std::hash::Hash;
88
use rustc_data_structures::fx::FxHashMap;
99

1010
use rustc::mir::AssertMessage;
11-
use rustc_span::source_map::Span;
1211
use rustc_span::symbol::Symbol;
12+
use rustc_span::{def_id::DefId, Span};
1313

1414
use crate::interpret::{
1515
self, AllocId, Allocation, GlobalId, ImmTy, InterpCx, InterpResult, Memory, MemoryKind, OpTy,
@@ -167,7 +167,7 @@ impl interpret::MayLeak for ! {
167167
}
168168

169169
impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter {
170-
type MemoryKinds = !;
170+
type MemoryKind = !;
171171
type PointerTag = ();
172172
type ExtraFnVal = !;
173173

@@ -177,7 +177,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter {
177177

178178
type MemoryMap = FxHashMap<AllocId, (MemoryKind<!>, Allocation)>;
179179

180-
const STATIC_KIND: Option<!> = None; // no copying of statics allowed
180+
const GLOBAL_KIND: Option<!> = None; // no copying of globals allowed
181181

182182
// We do not check for alignment to avoid having to carry an `Align`
183183
// in `ConstValue::ByRef`.
@@ -317,7 +317,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter {
317317
}
318318

319319
#[inline(always)]
320-
fn tag_static_base_pointer(_memory_extra: &MemoryExtra, _id: AllocId) -> Self::PointerTag {}
320+
fn tag_global_base_pointer(_memory_extra: &MemoryExtra, _id: AllocId) -> Self::PointerTag {}
321321

322322
fn box_alloc(
323323
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
@@ -345,11 +345,15 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter {
345345
Ok(())
346346
}
347347

348-
fn before_access_static(
348+
fn before_access_global(
349349
memory_extra: &MemoryExtra,
350350
_allocation: &Allocation,
351+
def_id: Option<DefId>,
352+
is_write: bool,
351353
) -> InterpResult<'tcx> {
352-
if memory_extra.can_access_statics {
354+
if is_write {
355+
Err(ConstEvalErrKind::ModifiedGlobal.into())
356+
} else if memory_extra.can_access_statics || def_id.is_none() {
353357
Ok(())
354358
} else {
355359
Err(ConstEvalErrKind::ConstAccessesStatic.into())

src/librustc_mir/interpret/eval_context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
253253
/// This represents a *direct* access to that memory, as opposed to access
254254
/// through a pointer that was created by the program.
255255
#[inline(always)]
256-
pub fn tag_static_base_pointer(&self, ptr: Pointer) -> Pointer<M::PointerTag> {
257-
self.memory.tag_static_base_pointer(ptr)
256+
pub fn tag_global_base_pointer(&self, ptr: Pointer) -> Pointer<M::PointerTag> {
257+
self.memory.tag_global_base_pointer(ptr)
258258
}
259259

260260
#[inline(always)]

src/librustc_mir/interpret/intern.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use super::{AllocId, Allocation, InterpCx, MPlaceTy, Machine, MemoryKind, Scalar
1616
pub trait CompileTimeMachine<'mir, 'tcx> = Machine<
1717
'mir,
1818
'tcx,
19-
MemoryKinds = !,
19+
MemoryKind = !,
2020
PointerTag = (),
2121
ExtraFnVal = !,
2222
FrameExtra = (),
@@ -104,7 +104,7 @@ fn intern_shallow<'rt, 'mir, 'tcx, M: CompileTimeMachine<'mir, 'tcx>>(
104104
MemoryKind::Stack | MemoryKind::Vtable | MemoryKind::CallerLocation => {}
105105
}
106106
// Set allocation mutability as appropriate. This is used by LLVM to put things into
107-
// read-only memory, and also by Miri when evluating other constants/statics that
107+
// read-only memory, and also by Miri when evaluating other globals that
108108
// access this one.
109109
if mode == InternMode::Static {
110110
// When `ty` is `None`, we assume no interior mutability.

src/librustc_mir/interpret/machine.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::hash::Hash;
77

88
use rustc::mir;
99
use rustc::ty::{self, Ty};
10-
use rustc_span::Span;
10+
use rustc_span::{def_id::DefId, Span};
1111

1212
use super::{
1313
AllocId, Allocation, AllocationExtra, Frame, ImmTy, InterpCx, InterpResult, Memory, MemoryKind,
@@ -79,7 +79,7 @@ pub trait AllocMap<K: Hash + Eq, V> {
7979
/// and some use case dependent behaviour can instead be applied.
8080
pub trait Machine<'mir, 'tcx>: Sized {
8181
/// Additional memory kinds a machine wishes to distinguish from the builtin ones
82-
type MemoryKinds: ::std::fmt::Debug + MayLeak + Eq + 'static;
82+
type MemoryKind: ::std::fmt::Debug + MayLeak + Eq + 'static;
8383

8484
/// Tag tracked alongside every pointer. This is used to implement "Stacked Borrows"
8585
/// <https://www.ralfj.de/blog/2018/08/07/stacked-borrows.html>.
@@ -105,16 +105,17 @@ pub trait Machine<'mir, 'tcx>: Sized {
105105
/// Memory's allocation map
106106
type MemoryMap: AllocMap<
107107
AllocId,
108-
(MemoryKind<Self::MemoryKinds>, Allocation<Self::PointerTag, Self::AllocExtra>),
108+
(MemoryKind<Self::MemoryKind>, Allocation<Self::PointerTag, Self::AllocExtra>),
109109
> + Default
110110
+ Clone;
111111

112-
/// The memory kind to use for copied statics -- or None if statics should not be mutated
113-
/// and thus any such attempt will cause a `ModifiedStatic` error to be raised.
112+
/// The memory kind to use for copied global memory (held in `tcx`) --
113+
/// or None if such memory should not be mutated and thus any such attempt will cause
114+
/// a `ModifiedStatic` error to be raised.
114115
/// Statics are copied under two circumstances: When they are mutated, and when
115-
/// `tag_allocation` or `find_foreign_static` (see below) returns an owned allocation
116+
/// `tag_allocation` (see below) returns an owned allocation
116117
/// that is added to the memory so that the work is not done twice.
117-
const STATIC_KIND: Option<Self::MemoryKinds>;
118+
const GLOBAL_KIND: Option<Self::MemoryKind>;
118119

119120
/// Whether memory accesses should be alignment-checked.
120121
const CHECK_ALIGN: bool;
@@ -207,11 +208,13 @@ pub trait Machine<'mir, 'tcx>: Sized {
207208
Ok(())
208209
}
209210

210-
/// Called before a `Static` value is accessed.
211+
/// Called before a global allocation is accessed.
211212
#[inline]
212-
fn before_access_static(
213+
fn before_access_global(
213214
_memory_extra: &Self::MemoryExtra,
214215
_allocation: &Allocation,
216+
_def_id: Option<DefId>,
217+
_is_write: bool,
215218
) -> InterpResult<'tcx> {
216219
Ok(())
217220
}
@@ -231,10 +234,10 @@ pub trait Machine<'mir, 'tcx>: Sized {
231234
/// it contains (in relocations) tagged. The way we construct allocations is
232235
/// to always first construct it without extra and then add the extra.
233236
/// This keeps uniform code paths for handling both allocations created by CTFE
234-
/// for statics, and allocations created by Miri during evaluation.
237+
/// for globals, and allocations created by Miri during evaluation.
235238
///
236239
/// `kind` is the kind of the allocation being tagged; it can be `None` when
237-
/// it's a static and `STATIC_KIND` is `None`.
240+
/// it's a global and `GLOBAL_KIND` is `None`.
238241
///
239242
/// This should avoid copying if no work has to be done! If this returns an owned
240243
/// allocation (because a copy had to be done to add tags or metadata), machine memory will
@@ -243,20 +246,20 @@ pub trait Machine<'mir, 'tcx>: Sized {
243246
///
244247
/// Also return the "base" tag to use for this allocation: the one that is used for direct
245248
/// accesses to this allocation. If `kind == STATIC_KIND`, this tag must be consistent
246-
/// with `tag_static_base_pointer`.
249+
/// with `tag_global_base_pointer`.
247250
fn init_allocation_extra<'b>(
248251
memory_extra: &Self::MemoryExtra,
249252
id: AllocId,
250253
alloc: Cow<'b, Allocation>,
251-
kind: Option<MemoryKind<Self::MemoryKinds>>,
254+
kind: Option<MemoryKind<Self::MemoryKind>>,
252255
) -> (Cow<'b, Allocation<Self::PointerTag, Self::AllocExtra>>, Self::PointerTag);
253256

254-
/// Return the "base" tag for the given *static* allocation: the one that is used for direct
255-
/// accesses to this static/const/fn allocation. If `id` is not a static allocation,
257+
/// Return the "base" tag for the given *global* allocation: the one that is used for direct
258+
/// accesses to this static/const/fn allocation. If `id` is not a global allocation,
256259
/// this will return an unusable tag (i.e., accesses will be UB)!
257260
///
258261
/// Expects `id` to be already canonical, if needed.
259-
fn tag_static_base_pointer(memory_extra: &Self::MemoryExtra, id: AllocId) -> Self::PointerTag;
262+
fn tag_global_base_pointer(memory_extra: &Self::MemoryExtra, id: AllocId) -> Self::PointerTag;
260263

261264
/// Executes a retagging operation
262265
#[inline]

0 commit comments

Comments
 (0)