Rollup merge of #75394 - oli-obk:get_static, r=RalfJung
Add a function to `TyCtxt` for computing an `Allocation` for a `static` item's initializer r? @RalfJung miri-side: https://github.com/rust-lang/miri/issues/1507 split out of https://github.com/rust-lang/rust/pull/74949#discussion_r468100991 to make that PR leaner
This commit is contained in:
commit
5ef0a0a7f8
3 changed files with 28 additions and 17 deletions
|
@ -74,4 +74,27 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
self.const_eval_validated(inputs)
|
||||
}
|
||||
}
|
||||
|
||||
/// Evaluate a static's initializer, returning the allocation of the initializer's memory.
|
||||
pub fn eval_static_initializer(
|
||||
self,
|
||||
def_id: DefId,
|
||||
) -> Result<&'tcx mir::Allocation, ErrorHandled> {
|
||||
trace!("eval_static_initializer: Need to compute {:?}", def_id);
|
||||
assert!(self.is_static(def_id));
|
||||
let instance = ty::Instance::mono(self, def_id);
|
||||
let gid = GlobalId { instance, promoted: None };
|
||||
self.eval_to_allocation(gid, ty::ParamEnv::reveal_all())
|
||||
}
|
||||
|
||||
/// Evaluate anything constant-like, returning the allocation of the final memory.
|
||||
fn eval_to_allocation(
|
||||
self,
|
||||
gid: GlobalId<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
) -> Result<&'tcx mir::Allocation, ErrorHandled> {
|
||||
trace!("eval_to_allocation: Need to compute {:?}", gid);
|
||||
let raw_const = self.const_eval_raw(param_env.and(gid))?;
|
||||
Ok(self.global_alloc(raw_const.alloc_id).unwrap_memory())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,13 +14,12 @@ use std::ptr;
|
|||
|
||||
use rustc_ast::ast::Mutability;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_middle::ty::{self, Instance, ParamEnv, TyCtxt};
|
||||
use rustc_middle::ty::{Instance, ParamEnv, TyCtxt};
|
||||
use rustc_target::abi::{Align, HasDataLayout, Size, TargetDataLayout};
|
||||
|
||||
use super::{
|
||||
AllocId, AllocMap, Allocation, AllocationExtra, CheckInAllocMsg, GlobalAlloc, GlobalId,
|
||||
InterpResult, Machine, MayLeak, Pointer, PointerArithmetic, Scalar,
|
||||
AllocId, AllocMap, Allocation, AllocationExtra, CheckInAllocMsg, GlobalAlloc, InterpResult,
|
||||
Machine, MayLeak, Pointer, PointerArithmetic, Scalar,
|
||||
};
|
||||
use crate::util::pretty;
|
||||
|
||||
|
@ -119,17 +118,6 @@ pub struct Memory<'mir, 'tcx, M: Machine<'mir, 'tcx>> {
|
|||
pub tcx: TyCtxt<'tcx>,
|
||||
}
|
||||
|
||||
/// Return the `tcx` allocation containing the initial value of the given static
|
||||
pub fn get_static(tcx: TyCtxt<'tcx>, def_id: DefId) -> InterpResult<'tcx, &'tcx Allocation> {
|
||||
trace!("get_static: Need to compute {:?}", def_id);
|
||||
let instance = Instance::mono(tcx, def_id);
|
||||
let gid = GlobalId { instance, promoted: None };
|
||||
// Use the raw query here to break validation cycles. Later uses of the static
|
||||
// will call the full query anyway.
|
||||
let raw_const = tcx.const_eval_raw(ty::ParamEnv::reveal_all().and(gid))?;
|
||||
Ok(tcx.global_alloc(raw_const.alloc_id).unwrap_memory())
|
||||
}
|
||||
|
||||
impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> HasDataLayout for Memory<'mir, 'tcx, M> {
|
||||
#[inline]
|
||||
fn data_layout(&self) -> &TargetDataLayout {
|
||||
|
@ -489,7 +477,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {
|
|||
throw_unsup!(ReadExternStatic(def_id));
|
||||
}
|
||||
|
||||
(get_static(tcx, def_id)?, Some(def_id))
|
||||
(tcx.eval_static_initializer(def_id)?, Some(def_id))
|
||||
}
|
||||
};
|
||||
M::before_access_global(memory_extra, id, alloc, def_id, is_write)?;
|
||||
|
|
|
@ -21,7 +21,7 @@ pub use rustc_middle::mir::interpret::*; // have all the `interpret` symbols in
|
|||
pub use self::eval_context::{Frame, FrameInfo, InterpCx, LocalState, LocalValue, StackPopCleanup};
|
||||
pub use self::intern::{intern_const_alloc_recursive, InternKind};
|
||||
pub use self::machine::{compile_time_machine, AllocMap, Machine, MayLeak, StackPopJump};
|
||||
pub use self::memory::{get_static, AllocCheck, FnVal, Memory, MemoryKind};
|
||||
pub use self::memory::{AllocCheck, FnVal, Memory, MemoryKind};
|
||||
pub use self::operand::{ImmTy, Immediate, OpTy, Operand};
|
||||
pub use self::place::{MPlaceTy, MemPlace, MemPlaceMeta, Place, PlaceTy};
|
||||
pub use self::validity::RefTracking;
|
||||
|
|
Loading…
Add table
Reference in a new issue