Reuse the Pointer type instead of passing reassembling it at many use sites
This commit is contained in:
parent
b2bf37aec0
commit
f7c493121d
11 changed files with 20 additions and 23 deletions
|
|
@ -307,7 +307,7 @@ impl_stable_hash_for!(
|
|||
impl<'tcx> for enum mir::interpret::ConstValue<'tcx> [ mir::interpret::ConstValue ] {
|
||||
Scalar(val),
|
||||
Slice(a, b),
|
||||
ByRef(id, alloc, offset),
|
||||
ByRef(ptr, alloc),
|
||||
}
|
||||
);
|
||||
impl_stable_hash_for!(struct crate::mir::interpret::RawConst<'tcx> {
|
||||
|
|
|
|||
|
|
@ -31,9 +31,8 @@ pub enum ConstValue<'tcx> {
|
|||
/// it.
|
||||
Slice(Scalar, u64),
|
||||
|
||||
/// An allocation together with an offset into the allocation.
|
||||
/// Invariant: the `AllocId` matches the allocation.
|
||||
ByRef(AllocId, &'tcx Allocation, Size),
|
||||
/// An allocation together with a pointer into the allocation.
|
||||
ByRef(Pointer, &'tcx Allocation),
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
|
|
|
|||
|
|
@ -499,8 +499,8 @@ impl<'a, 'tcx> Lift<'tcx> for ConstValue<'a> {
|
|||
match *self {
|
||||
ConstValue::Scalar(x) => Some(ConstValue::Scalar(x)),
|
||||
ConstValue::Slice(x, y) => Some(ConstValue::Slice(x, y)),
|
||||
ConstValue::ByRef(x, alloc, z) => Some(ConstValue::ByRef(
|
||||
x, alloc.lift_to_tcx(tcx)?, z,
|
||||
ConstValue::ByRef(ptr, alloc) => Some(ConstValue::ByRef(
|
||||
ptr, alloc.lift_to_tcx(tcx)?,
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ pub fn codegen_static_initializer(
|
|||
let static_ = cx.tcx.const_eval(param_env.and(cid))?;
|
||||
|
||||
let alloc = match static_.val {
|
||||
ConstValue::ByRef(_, alloc, n) if n.bytes() == 0 => alloc,
|
||||
ConstValue::ByRef(ptr, alloc) if ptr.offset.bytes() == 0 => alloc,
|
||||
_ => bug!("static const eval returned {:#?}", static_),
|
||||
};
|
||||
Ok((const_alloc_to_llvm(cx, alloc), alloc))
|
||||
|
|
|
|||
|
|
@ -101,8 +101,8 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> {
|
|||
let b_llval = bx.cx().const_usize(b);
|
||||
OperandValue::Pair(a_llval, b_llval)
|
||||
},
|
||||
ConstValue::ByRef(_, alloc, offset) => {
|
||||
return Ok(bx.load_operand(bx.cx().from_const_alloc(layout, alloc, offset)));
|
||||
ConstValue::ByRef(ptr, alloc) => {
|
||||
return Ok(bx.load_operand(bx.cx().from_const_alloc(layout, alloc, ptr.offset)));
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -417,8 +417,8 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
let layout = cx.layout_of(self.monomorphize(&ty));
|
||||
match bx.tcx().const_eval(param_env.and(cid)) {
|
||||
Ok(val) => match val.val {
|
||||
mir::interpret::ConstValue::ByRef(_, alloc, offset) => {
|
||||
bx.cx().from_const_alloc(layout, alloc, offset)
|
||||
mir::interpret::ConstValue::ByRef(ptr, alloc) => {
|
||||
bx.cx().from_const_alloc(layout, alloc, ptr.offset)
|
||||
}
|
||||
_ => bug!("promoteds should have an allocation: {:?}", val),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ pub fn op_to_const<'tcx>(
|
|||
// FIXME shouldn't it be the case that `mark_static_initialized` has already
|
||||
// interned this? I thought that is the entire point of that `FinishStatic` stuff?
|
||||
let alloc = ecx.tcx.intern_const_alloc(alloc);
|
||||
ConstValue::ByRef(ptr.alloc_id, alloc, ptr.offset)
|
||||
ConstValue::ByRef(ptr, alloc)
|
||||
},
|
||||
Ok(Immediate::Scalar(x)) =>
|
||||
ConstValue::Scalar(x.not_undef()?),
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ use rustc::ty::{self, Ty, TyCtxt, TypeFoldable, Const};
|
|||
use rustc::ty::layout::{Integer, IntegerExt, VariantIdx, Size};
|
||||
|
||||
use rustc::mir::Field;
|
||||
use rustc::mir::interpret::{ConstValue, Pointer, Scalar};
|
||||
use rustc::mir::interpret::{ConstValue, Scalar};
|
||||
use rustc::util::common::ErrorReported;
|
||||
|
||||
use syntax::attr::{SignedInt, UnsignedInt};
|
||||
|
|
@ -214,9 +214,8 @@ impl<'a, 'tcx> LiteralExpander<'a, 'tcx> {
|
|||
match (val, &crty.sty, &rty.sty) {
|
||||
// the easy case, deref a reference
|
||||
(ConstValue::Scalar(Scalar::Ptr(p)), x, y) if x == y => ConstValue::ByRef(
|
||||
p.alloc_id,
|
||||
p,
|
||||
self.tcx.alloc_map.lock().unwrap_memory(p.alloc_id),
|
||||
p.offset,
|
||||
),
|
||||
// unsize array to slice if pattern is array but match value or other patterns are slice
|
||||
(ConstValue::Scalar(Scalar::Ptr(p)), ty::Array(t, n), ty::Slice(u)) => {
|
||||
|
|
@ -1428,7 +1427,7 @@ fn slice_pat_covered_by_const<'tcx>(
|
|||
suffix: &[Pattern<'tcx>]
|
||||
) -> Result<bool, ErrorReported> {
|
||||
let data: &[u8] = match (const_val.val, &const_val.ty.sty) {
|
||||
(ConstValue::ByRef(id, alloc, offset), ty::Array(t, n)) => {
|
||||
(ConstValue::ByRef(ptr, alloc), ty::Array(t, n)) => {
|
||||
if *t != tcx.types.u8 {
|
||||
// FIXME(oli-obk): can't mix const patterns with slice patterns and get
|
||||
// any sort of exhaustiveness/unreachable check yet
|
||||
|
|
@ -1436,7 +1435,6 @@ fn slice_pat_covered_by_const<'tcx>(
|
|||
// are definitely unreachable.
|
||||
return Ok(false);
|
||||
}
|
||||
let ptr = Pointer::new(id, offset);
|
||||
let n = n.assert_usize(tcx).unwrap();
|
||||
alloc.get_bytes(&tcx, ptr, Size::from_bytes(n)).unwrap()
|
||||
},
|
||||
|
|
@ -1778,8 +1776,8 @@ fn specialize<'p, 'a: 'p, 'tcx: 'a>(
|
|||
let (opt_ptr, n, ty) = match value.ty.sty {
|
||||
ty::TyKind::Array(t, n) => {
|
||||
match value.val {
|
||||
ConstValue::ByRef(id, alloc, offset) => (
|
||||
Some((Pointer::new(id, offset), alloc)),
|
||||
ConstValue::ByRef(ptr, alloc) => (
|
||||
Some((ptr, alloc)),
|
||||
n.unwrap_usize(cx.tcx),
|
||||
t,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -591,11 +591,11 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
|
|||
self.layout_of(ty)
|
||||
})?;
|
||||
let op = match val.val {
|
||||
ConstValue::ByRef(id, alloc, offset) => {
|
||||
ConstValue::ByRef(ptr, alloc) => {
|
||||
// We rely on mutability being set correctly in that allocation to prevent writes
|
||||
// where none should happen -- and for `static mut`, we copy on demand anyway.
|
||||
Operand::Indirect(
|
||||
MemPlace::from_ptr(Pointer::new(id, offset), alloc.align)
|
||||
MemPlace::from_ptr(ptr, alloc.align)
|
||||
).with_default_tag()
|
||||
},
|
||||
ConstValue::Slice(a, b) =>
|
||||
|
|
|
|||
|
|
@ -1257,7 +1257,7 @@ fn collect_const<'a, 'tcx>(
|
|||
ConstValue::Slice(Scalar::Ptr(ptr), _) |
|
||||
ConstValue::Scalar(Scalar::Ptr(ptr)) =>
|
||||
collect_miri(tcx, ptr.alloc_id, output),
|
||||
ConstValue::ByRef(_id, alloc, _offset) => {
|
||||
ConstValue::ByRef(_ptr, alloc) => {
|
||||
for &((), id) in alloc.relocations.values() {
|
||||
collect_miri(tcx, id, output);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1464,7 +1464,7 @@ fn maybe_check_static_with_link_section(tcx: TyCtxt, id: DefId, span: Span) {
|
|||
};
|
||||
let param_env = ty::ParamEnv::reveal_all();
|
||||
if let Ok(static_) = tcx.const_eval(param_env.and(cid)) {
|
||||
let alloc = if let ConstValue::ByRef(_, allocation, _) = static_.val {
|
||||
let alloc = if let ConstValue::ByRef(_, allocation) = static_.val {
|
||||
allocation
|
||||
} else {
|
||||
bug!("Matching on non-ByRef static")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue