make it more clear which functions create fresh AllocId
This commit is contained in:
parent
0f8908da27
commit
430c386821
18 changed files with 45 additions and 45 deletions
|
@ -3,7 +3,7 @@
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::mir::interpret::{
|
use rustc_middle::mir::interpret::{
|
||||||
read_target_uint, AllocId, ConstAllocation, ConstValue, ErrorHandled, GlobalAlloc, Scalar,
|
read_target_uint, AllocId, ConstValue, ErrorHandled, GlobalAlloc, Scalar,
|
||||||
};
|
};
|
||||||
|
|
||||||
use cranelift_module::*;
|
use cranelift_module::*;
|
||||||
|
@ -200,17 +200,14 @@ pub(crate) fn codegen_const_value<'tcx>(
|
||||||
CValue::by_val(val, layout)
|
CValue::by_val(val, layout)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ConstValue::Indirect { alloc_id, offset } => {
|
ConstValue::Indirect { alloc_id, offset } => CValue::by_ref(
|
||||||
let alloc = fx.tcx.global_alloc(alloc_id).unwrap_memory();
|
pointer_for_allocation(fx, alloc_id)
|
||||||
// FIXME: avoid creating multiple allocations for the same AllocId?
|
|
||||||
CValue::by_ref(
|
|
||||||
pointer_for_allocation(fx, alloc)
|
|
||||||
.offset_i64(fx, i64::try_from(offset.bytes()).unwrap()),
|
.offset_i64(fx, i64::try_from(offset.bytes()).unwrap()),
|
||||||
layout,
|
layout,
|
||||||
)
|
),
|
||||||
}
|
|
||||||
ConstValue::Slice { data, start, end } => {
|
ConstValue::Slice { data, start, end } => {
|
||||||
let ptr = pointer_for_allocation(fx, data)
|
let alloc_id = fx.tcx.reserve_and_set_memory_alloc(data);
|
||||||
|
let ptr = pointer_for_allocation(fx, alloc_id)
|
||||||
.offset_i64(fx, i64::try_from(start).unwrap())
|
.offset_i64(fx, i64::try_from(start).unwrap())
|
||||||
.get_addr(fx);
|
.get_addr(fx);
|
||||||
let len = fx
|
let len = fx
|
||||||
|
@ -224,9 +221,9 @@ pub(crate) fn codegen_const_value<'tcx>(
|
||||||
|
|
||||||
fn pointer_for_allocation<'tcx>(
|
fn pointer_for_allocation<'tcx>(
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||||
alloc: ConstAllocation<'tcx>,
|
alloc_id: AllocId,
|
||||||
) -> crate::pointer::Pointer {
|
) -> crate::pointer::Pointer {
|
||||||
let alloc_id = fx.tcx.create_memory_alloc(alloc);
|
let alloc = fx.tcx.global_alloc(alloc_id).unwrap_memory();
|
||||||
let data_id = data_id_for_alloc_id(
|
let data_id = data_id_for_alloc_id(
|
||||||
&mut fx.constants_cx,
|
&mut fx.constants_cx,
|
||||||
&mut *fx.module,
|
&mut *fx.module,
|
||||||
|
@ -357,6 +354,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// FIXME: should we have a cache so we don't do this multiple times for the same `ConstAllocation`?
|
||||||
let data_id = *cx.anon_allocs.entry(alloc_id).or_insert_with(|| {
|
let data_id = *cx.anon_allocs.entry(alloc_id).or_insert_with(|| {
|
||||||
module.declare_anonymous_data(alloc.inner().mutability.is_mut(), false).unwrap()
|
module.declare_anonymous_data(alloc.inner().mutability.is_mut(), false).unwrap()
|
||||||
});
|
});
|
||||||
|
|
|
@ -105,7 +105,10 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
|
||||||
bug!("from_const: invalid ScalarPair layout: {:#?}", layout);
|
bug!("from_const: invalid ScalarPair layout: {:#?}", layout);
|
||||||
};
|
};
|
||||||
let a = Scalar::from_pointer(
|
let a = Scalar::from_pointer(
|
||||||
Pointer::new(bx.tcx().create_memory_alloc(data), Size::from_bytes(start)),
|
Pointer::new(
|
||||||
|
bx.tcx().reserve_and_set_memory_alloc(data),
|
||||||
|
Size::from_bytes(start),
|
||||||
|
),
|
||||||
&bx.tcx(),
|
&bx.tcx(),
|
||||||
);
|
);
|
||||||
let a_llval = bx.scalar_to_backend(
|
let a_llval = bx.scalar_to_backend(
|
||||||
|
@ -118,7 +121,6 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
|
||||||
}
|
}
|
||||||
ConstValue::Indirect { alloc_id, offset } => {
|
ConstValue::Indirect { alloc_id, offset } => {
|
||||||
let alloc = bx.tcx().global_alloc(alloc_id).unwrap_memory();
|
let alloc = bx.tcx().global_alloc(alloc_id).unwrap_memory();
|
||||||
// FIXME: should we attempt to avoid building the same AllocId multiple times?
|
|
||||||
return Self::from_const_alloc(bx, layout, alloc, offset);
|
return Self::from_const_alloc(bx, layout, alloc, offset);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -184,6 +186,8 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
|
||||||
_ if layout.is_zst() => OperandRef::zero_sized(layout),
|
_ if layout.is_zst() => OperandRef::zero_sized(layout),
|
||||||
_ => {
|
_ => {
|
||||||
// Neither a scalar nor scalar pair. Load from a place
|
// Neither a scalar nor scalar pair. Load from a place
|
||||||
|
// FIXME: should we cache `const_data_from_alloc` to avoid repeating this for the
|
||||||
|
// same `ConstAllocation`?
|
||||||
let init = bx.const_data_from_alloc(alloc);
|
let init = bx.const_data_from_alloc(alloc);
|
||||||
let base_addr = bx.static_addr_of(init, alloc_align, None);
|
let base_addr = bx.static_addr_of(init, alloc_align, None);
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
)
|
)
|
||||||
.ok_or_else(|| err_inval!(TooGeneric))?;
|
.ok_or_else(|| err_inval!(TooGeneric))?;
|
||||||
|
|
||||||
let fn_ptr = self.create_fn_alloc_ptr(FnVal::Instance(instance));
|
let fn_ptr = self.fn_ptr(FnVal::Instance(instance));
|
||||||
self.write_pointer(fn_ptr, dest)?;
|
self.write_pointer(fn_ptr, dest)?;
|
||||||
}
|
}
|
||||||
_ => span_bug!(self.cur_span(), "reify fn pointer on {:?}", src.layout.ty),
|
_ => span_bug!(self.cur_span(), "reify fn pointer on {:?}", src.layout.ty),
|
||||||
|
@ -116,7 +116,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
ty::ClosureKind::FnOnce,
|
ty::ClosureKind::FnOnce,
|
||||||
)
|
)
|
||||||
.ok_or_else(|| err_inval!(TooGeneric))?;
|
.ok_or_else(|| err_inval!(TooGeneric))?;
|
||||||
let fn_ptr = self.create_fn_alloc_ptr(FnVal::Instance(instance));
|
let fn_ptr = self.fn_ptr(FnVal::Instance(instance));
|
||||||
self.write_pointer(fn_ptr, dest)?;
|
self.write_pointer(fn_ptr, dest)?;
|
||||||
}
|
}
|
||||||
_ => span_bug!(self.cur_span(), "closure fn pointer on {:?}", src.layout.ty),
|
_ => span_bug!(self.cur_span(), "closure fn pointer on {:?}", src.layout.ty),
|
||||||
|
|
|
@ -555,7 +555,7 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
|
||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
) -> InterpResult<$tcx, Pointer> {
|
) -> InterpResult<$tcx, Pointer> {
|
||||||
// Use the `AllocId` associated with the `DefId`. Any actual *access* will fail.
|
// Use the `AllocId` associated with the `DefId`. Any actual *access* will fail.
|
||||||
Ok(Pointer::new(ecx.tcx.create_static_alloc(def_id), Size::ZERO))
|
Ok(Pointer::new(ecx.tcx.reserve_and_set_static_alloc(def_id), Size::ZERO))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|
|
@ -176,12 +176,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
M::adjust_alloc_base_pointer(self, ptr)
|
M::adjust_alloc_base_pointer(self, ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_fn_alloc_ptr(
|
pub fn fn_ptr(&mut self, fn_val: FnVal<'tcx, M::ExtraFnVal>) -> Pointer<M::Provenance> {
|
||||||
&mut self,
|
|
||||||
fn_val: FnVal<'tcx, M::ExtraFnVal>,
|
|
||||||
) -> Pointer<M::Provenance> {
|
|
||||||
let id = match fn_val {
|
let id = match fn_val {
|
||||||
FnVal::Instance(instance) => self.tcx.create_fn_alloc(instance),
|
FnVal::Instance(instance) => self.tcx.reserve_and_set_fn_alloc(instance),
|
||||||
FnVal::Other(extra) => {
|
FnVal::Other(extra) => {
|
||||||
// FIXME(RalfJung): Should we have a cache here?
|
// FIXME(RalfJung): Should we have a cache here?
|
||||||
let id = self.tcx.reserve_alloc_id();
|
let id = self.tcx.reserve_alloc_id();
|
||||||
|
|
|
@ -768,7 +768,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
// We rely on mutability being set correctly in `data` to prevent writes
|
// We rely on mutability being set correctly in `data` to prevent writes
|
||||||
// where none should happen.
|
// where none should happen.
|
||||||
let ptr = Pointer::new(
|
let ptr = Pointer::new(
|
||||||
self.tcx.create_memory_alloc(data),
|
self.tcx.reserve_and_set_memory_alloc(data),
|
||||||
Size::from_bytes(start), // offset: `start`
|
Size::from_bytes(start), // offset: `start`
|
||||||
);
|
);
|
||||||
Operand::Immediate(Immediate::new_slice(
|
Operand::Immediate(Immediate::new_slice(
|
||||||
|
|
|
@ -27,7 +27,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
ensure_monomorphic_enough(*self.tcx, ty)?;
|
ensure_monomorphic_enough(*self.tcx, ty)?;
|
||||||
ensure_monomorphic_enough(*self.tcx, poly_trait_ref)?;
|
ensure_monomorphic_enough(*self.tcx, poly_trait_ref)?;
|
||||||
|
|
||||||
let vtable_symbolic_allocation = self.tcx.create_vtable_alloc(ty, poly_trait_ref);
|
let vtable_symbolic_allocation = self.tcx.reserve_and_set_vtable_alloc(ty, poly_trait_ref);
|
||||||
let vtable_ptr = self.global_base_pointer(Pointer::from(vtable_symbolic_allocation))?;
|
let vtable_ptr = self.global_base_pointer(Pointer::from(vtable_symbolic_allocation))?;
|
||||||
Ok(vtable_ptr.into())
|
Ok(vtable_ptr.into())
|
||||||
}
|
}
|
||||||
|
|
|
@ -389,7 +389,7 @@ impl<'s> AllocDecodingSession<'s> {
|
||||||
trace!("creating fn alloc ID");
|
trace!("creating fn alloc ID");
|
||||||
let instance = ty::Instance::decode(decoder);
|
let instance = ty::Instance::decode(decoder);
|
||||||
trace!("decoded fn alloc instance: {:?}", instance);
|
trace!("decoded fn alloc instance: {:?}", instance);
|
||||||
let alloc_id = decoder.interner().create_fn_alloc(instance);
|
let alloc_id = decoder.interner().reserve_and_set_fn_alloc(instance);
|
||||||
alloc_id
|
alloc_id
|
||||||
}
|
}
|
||||||
AllocDiscriminant::VTable => {
|
AllocDiscriminant::VTable => {
|
||||||
|
@ -399,7 +399,8 @@ impl<'s> AllocDecodingSession<'s> {
|
||||||
let poly_trait_ref =
|
let poly_trait_ref =
|
||||||
<Option<ty::PolyExistentialTraitRef<'_>> as Decodable<D>>::decode(decoder);
|
<Option<ty::PolyExistentialTraitRef<'_>> as Decodable<D>>::decode(decoder);
|
||||||
trace!("decoded vtable alloc instance: {ty:?}, {poly_trait_ref:?}");
|
trace!("decoded vtable alloc instance: {ty:?}, {poly_trait_ref:?}");
|
||||||
let alloc_id = decoder.interner().create_vtable_alloc(ty, poly_trait_ref);
|
let alloc_id =
|
||||||
|
decoder.interner().reserve_and_set_vtable_alloc(ty, poly_trait_ref);
|
||||||
alloc_id
|
alloc_id
|
||||||
}
|
}
|
||||||
AllocDiscriminant::Static => {
|
AllocDiscriminant::Static => {
|
||||||
|
@ -407,7 +408,7 @@ impl<'s> AllocDecodingSession<'s> {
|
||||||
trace!("creating extern static alloc ID");
|
trace!("creating extern static alloc ID");
|
||||||
let did = <DefId as Decodable<D>>::decode(decoder);
|
let did = <DefId as Decodable<D>>::decode(decoder);
|
||||||
trace!("decoded static def-ID: {:?}", did);
|
trace!("decoded static def-ID: {:?}", did);
|
||||||
let alloc_id = decoder.interner().create_static_alloc(did);
|
let alloc_id = decoder.interner().reserve_and_set_static_alloc(did);
|
||||||
alloc_id
|
alloc_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -544,13 +545,13 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
|
|
||||||
/// Generates an `AllocId` for a static or return a cached one in case this function has been
|
/// Generates an `AllocId` for a static or return a cached one in case this function has been
|
||||||
/// called on the same static before.
|
/// called on the same static before.
|
||||||
pub fn create_static_alloc(self, static_id: DefId) -> AllocId {
|
pub fn reserve_and_set_static_alloc(self, static_id: DefId) -> AllocId {
|
||||||
self.reserve_and_set_dedup(GlobalAlloc::Static(static_id))
|
self.reserve_and_set_dedup(GlobalAlloc::Static(static_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generates an `AllocId` for a function. Depending on the function type,
|
/// Generates an `AllocId` for a function. Depending on the function type,
|
||||||
/// this might get deduplicated or assigned a new ID each time.
|
/// this might get deduplicated or assigned a new ID each time.
|
||||||
pub fn create_fn_alloc(self, instance: Instance<'tcx>) -> AllocId {
|
pub fn reserve_and_set_fn_alloc(self, instance: Instance<'tcx>) -> AllocId {
|
||||||
// Functions cannot be identified by pointers, as asm-equal functions can get deduplicated
|
// Functions cannot be identified by pointers, as asm-equal functions can get deduplicated
|
||||||
// by the linker (we set the "unnamed_addr" attribute for LLVM) and functions can be
|
// by the linker (we set the "unnamed_addr" attribute for LLVM) and functions can be
|
||||||
// duplicated across crates.
|
// duplicated across crates.
|
||||||
|
@ -575,7 +576,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generates an `AllocId` for a (symbolic, not-reified) vtable. Will get deduplicated.
|
/// Generates an `AllocId` for a (symbolic, not-reified) vtable. Will get deduplicated.
|
||||||
pub fn create_vtable_alloc(
|
pub fn reserve_and_set_vtable_alloc(
|
||||||
self,
|
self,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
poly_trait_ref: Option<ty::PolyExistentialTraitRef<'tcx>>,
|
poly_trait_ref: Option<ty::PolyExistentialTraitRef<'tcx>>,
|
||||||
|
@ -588,7 +589,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// Statics with identical content will still point to the same `Allocation`, i.e.,
|
/// Statics with identical content will still point to the same `Allocation`, i.e.,
|
||||||
/// their data will be deduplicated through `Allocation` interning -- but they
|
/// their data will be deduplicated through `Allocation` interning -- but they
|
||||||
/// are different places in memory and as such need different IDs.
|
/// are different places in memory and as such need different IDs.
|
||||||
pub fn create_memory_alloc(self, mem: ConstAllocation<'tcx>) -> AllocId {
|
pub fn reserve_and_set_memory_alloc(self, mem: ConstAllocation<'tcx>) -> AllocId {
|
||||||
let id = self.reserve_alloc_id();
|
let id = self.reserve_alloc_id();
|
||||||
self.set_alloc_id_memory(id, mem);
|
self.set_alloc_id_memory(id, mem);
|
||||||
id
|
id
|
||||||
|
|
|
@ -647,7 +647,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
// Create an allocation that just contains these bytes.
|
// Create an allocation that just contains these bytes.
|
||||||
let alloc = interpret::Allocation::from_bytes_byte_aligned_immutable(bytes);
|
let alloc = interpret::Allocation::from_bytes_byte_aligned_immutable(bytes);
|
||||||
let alloc = self.mk_const_alloc(alloc);
|
let alloc = self.mk_const_alloc(alloc);
|
||||||
self.create_memory_alloc(alloc)
|
self.reserve_and_set_memory_alloc(alloc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a range of the start/end indices specified with the
|
/// Returns a range of the start/end indices specified with the
|
||||||
|
|
|
@ -84,7 +84,7 @@ pub(super) fn vtable_allocation_provider<'tcx>(
|
||||||
let scalar = match entry {
|
let scalar = match entry {
|
||||||
VtblEntry::MetadataDropInPlace => {
|
VtblEntry::MetadataDropInPlace => {
|
||||||
let instance = ty::Instance::resolve_drop_in_place(tcx, ty);
|
let instance = ty::Instance::resolve_drop_in_place(tcx, ty);
|
||||||
let fn_alloc_id = tcx.create_fn_alloc(instance);
|
let fn_alloc_id = tcx.reserve_and_set_fn_alloc(instance);
|
||||||
let fn_ptr = Pointer::from(fn_alloc_id);
|
let fn_ptr = Pointer::from(fn_alloc_id);
|
||||||
Scalar::from_pointer(fn_ptr, &tcx)
|
Scalar::from_pointer(fn_ptr, &tcx)
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ pub(super) fn vtable_allocation_provider<'tcx>(
|
||||||
VtblEntry::Method(instance) => {
|
VtblEntry::Method(instance) => {
|
||||||
// Prepare the fn ptr we write into the vtable.
|
// Prepare the fn ptr we write into the vtable.
|
||||||
let instance = instance.polymorphize(tcx);
|
let instance = instance.polymorphize(tcx);
|
||||||
let fn_alloc_id = tcx.create_fn_alloc(instance);
|
let fn_alloc_id = tcx.reserve_and_set_fn_alloc(instance);
|
||||||
let fn_ptr = Pointer::from(fn_alloc_id);
|
let fn_ptr = Pointer::from(fn_alloc_id);
|
||||||
Scalar::from_pointer(fn_ptr, &tcx)
|
Scalar::from_pointer(fn_ptr, &tcx)
|
||||||
}
|
}
|
||||||
|
@ -112,5 +112,5 @@ pub(super) fn vtable_allocation_provider<'tcx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
vtable.mutability = Mutability::Not;
|
vtable.mutability = Mutability::Not;
|
||||||
tcx.create_memory_alloc(tcx.mk_const_alloc(vtable))
|
tcx.reserve_and_set_memory_alloc(tcx.mk_const_alloc(vtable))
|
||||||
}
|
}
|
||||||
|
|
|
@ -950,7 +950,7 @@ impl<'tcx> Cx<'tcx> {
|
||||||
let kind = if self.tcx.is_thread_local_static(id) {
|
let kind = if self.tcx.is_thread_local_static(id) {
|
||||||
ExprKind::ThreadLocalRef(id)
|
ExprKind::ThreadLocalRef(id)
|
||||||
} else {
|
} else {
|
||||||
let alloc_id = self.tcx.create_static_alloc(id);
|
let alloc_id = self.tcx.reserve_and_set_static_alloc(id);
|
||||||
ExprKind::StaticRef { alloc_id, ty, def_id: id }
|
ExprKind::StaticRef { alloc_id, ty, def_id: id }
|
||||||
};
|
};
|
||||||
ExprKind::Deref {
|
ExprKind::Deref {
|
||||||
|
|
|
@ -114,7 +114,7 @@ impl EnumSizeOpt {
|
||||||
tcx.data_layout.ptr_sized_integer().align(&tcx.data_layout).abi,
|
tcx.data_layout.ptr_sized_integer().align(&tcx.data_layout).abi,
|
||||||
Mutability::Not,
|
Mutability::Not,
|
||||||
);
|
);
|
||||||
let alloc = tcx.create_memory_alloc(tcx.mk_const_alloc(alloc));
|
let alloc = tcx.reserve_and_set_memory_alloc(tcx.mk_const_alloc(alloc));
|
||||||
Some((*adt_def, num_discrs, *alloc_cache.entry(ty).or_insert(alloc)))
|
Some((*adt_def, num_discrs, *alloc_cache.entry(ty).or_insert(alloc)))
|
||||||
}
|
}
|
||||||
fn optim<'tcx>(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
fn optim<'tcx>(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|
|
|
@ -45,7 +45,7 @@ pub fn new_allocation<'tcx>(
|
||||||
new_empty_allocation(align.abi)
|
new_empty_allocation(align.abi)
|
||||||
}
|
}
|
||||||
ConstValue::Slice { data, start, end } => {
|
ConstValue::Slice { data, start, end } => {
|
||||||
let alloc_id = tables.tcx.create_memory_alloc(data);
|
let alloc_id = tables.tcx.reserve_and_set_memory_alloc(data);
|
||||||
let ptr = Pointer::new(alloc_id, rustc_target::abi::Size::from_bytes(start));
|
let ptr = Pointer::new(alloc_id, rustc_target::abi::Size::from_bytes(start));
|
||||||
let scalar_ptr = rustc_middle::mir::interpret::Scalar::from_pointer(ptr, &tables.tcx);
|
let scalar_ptr = rustc_middle::mir::interpret::Scalar::from_pointer(ptr, &tables.tcx);
|
||||||
let scalar_len = rustc_middle::mir::interpret::Scalar::from_target_usize(
|
let scalar_len = rustc_middle::mir::interpret::Scalar::from_target_usize(
|
||||||
|
|
|
@ -382,7 +382,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let main_ptr = ecx.create_fn_alloc_ptr(FnVal::Instance(entry_instance));
|
let main_ptr = ecx.fn_ptr(FnVal::Instance(entry_instance));
|
||||||
|
|
||||||
// Inlining of `DEFAULT` from
|
// Inlining of `DEFAULT` from
|
||||||
// https://github.com/rust-lang/rust/blob/master/compiler/rustc_session/src/config/sigpipe.rs.
|
// https://github.com/rust-lang/rust/blob/master/compiler/rustc_session/src/config/sigpipe.rs.
|
||||||
|
|
|
@ -711,7 +711,7 @@ impl<'mir, 'tcx> MiriMachine<'mir, 'tcx> {
|
||||||
let layout = this.machine.layouts.const_raw_ptr;
|
let layout = this.machine.layouts.const_raw_ptr;
|
||||||
let dlsym = Dlsym::from_str("signal".as_bytes(), &this.tcx.sess.target.os)?
|
let dlsym = Dlsym::from_str("signal".as_bytes(), &this.tcx.sess.target.os)?
|
||||||
.expect("`signal` must be an actual dlsym on android");
|
.expect("`signal` must be an actual dlsym on android");
|
||||||
let ptr = this.create_fn_alloc_ptr(FnVal::Other(dlsym));
|
let ptr = this.fn_ptr(FnVal::Other(dlsym));
|
||||||
let val = ImmTy::from_scalar(Scalar::from_pointer(ptr, this), layout);
|
let val = ImmTy::from_scalar(Scalar::from_pointer(ptr, this), layout);
|
||||||
Self::alloc_extern_static(this, "signal", val)?;
|
Self::alloc_extern_static(this, "signal", val)?;
|
||||||
// A couple zero-initialized pointer-sized extern statics.
|
// A couple zero-initialized pointer-sized extern statics.
|
||||||
|
|
|
@ -63,7 +63,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||||
// to reconstruct the needed frame information in `handle_miri_resolve_frame`.
|
// to reconstruct the needed frame information in `handle_miri_resolve_frame`.
|
||||||
// Note that we never actually read or write anything from/to this pointer -
|
// Note that we never actually read or write anything from/to this pointer -
|
||||||
// all of the data is represented by the pointer value itself.
|
// all of the data is represented by the pointer value itself.
|
||||||
let fn_ptr = this.create_fn_alloc_ptr(FnVal::Instance(instance));
|
let fn_ptr = this.fn_ptr(FnVal::Instance(instance));
|
||||||
fn_ptr.wrapping_offset(Size::from_bytes(pos.0), this)
|
fn_ptr.wrapping_offset(Size::from_bytes(pos.0), this)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -159,7 +159,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||||
|
|
||||||
// Reconstruct the original function pointer,
|
// Reconstruct the original function pointer,
|
||||||
// which we pass to user code.
|
// which we pass to user code.
|
||||||
let fn_ptr = this.create_fn_alloc_ptr(FnVal::Instance(fn_instance));
|
let fn_ptr = this.fn_ptr(FnVal::Instance(fn_instance));
|
||||||
|
|
||||||
let num_fields = dest.layout.fields.count();
|
let num_fields = dest.layout.fields.count();
|
||||||
|
|
||||||
|
|
|
@ -232,7 +232,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||||
let symbol = this.read_pointer(symbol)?;
|
let symbol = this.read_pointer(symbol)?;
|
||||||
let symbol_name = this.read_c_str(symbol)?;
|
let symbol_name = this.read_c_str(symbol)?;
|
||||||
if let Some(dlsym) = Dlsym::from_str(symbol_name, &this.tcx.sess.target.os)? {
|
if let Some(dlsym) = Dlsym::from_str(symbol_name, &this.tcx.sess.target.os)? {
|
||||||
let ptr = this.create_fn_alloc_ptr(FnVal::Other(dlsym));
|
let ptr = this.fn_ptr(FnVal::Other(dlsym));
|
||||||
this.write_pointer(ptr, dest)?;
|
this.write_pointer(ptr, dest)?;
|
||||||
} else {
|
} else {
|
||||||
this.write_null(dest)?;
|
this.write_null(dest)?;
|
||||||
|
|
|
@ -335,7 +335,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||||
this.read_target_isize(hModule)?;
|
this.read_target_isize(hModule)?;
|
||||||
let name = this.read_c_str(this.read_pointer(lpProcName)?)?;
|
let name = this.read_c_str(this.read_pointer(lpProcName)?)?;
|
||||||
if let Some(dlsym) = Dlsym::from_str(name, &this.tcx.sess.target.os)? {
|
if let Some(dlsym) = Dlsym::from_str(name, &this.tcx.sess.target.os)? {
|
||||||
let ptr = this.create_fn_alloc_ptr(FnVal::Other(dlsym));
|
let ptr = this.fn_ptr(FnVal::Other(dlsym));
|
||||||
this.write_pointer(ptr, dest)?;
|
this.write_pointer(ptr, dest)?;
|
||||||
} else {
|
} else {
|
||||||
this.write_null(dest)?;
|
this.write_null(dest)?;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue