Miri: add helper fn to allocate string; simplify alloc_caller_location
This commit is contained in:
parent
cde17d9158
commit
56356a0745
|
@ -552,7 +552,7 @@ pub fn const_caller_location<'tcx>(
|
|||
tcx.type_of(tcx.require_lang_item(PanicLocationLangItem, None))
|
||||
.subst(tcx, tcx.mk_substs([tcx.lifetimes.re_static.into()].iter())),
|
||||
);
|
||||
let loc_place = ecx.alloc_caller_location(file, line, col).unwrap();
|
||||
let loc_place = ecx.alloc_caller_location(file, line, col);
|
||||
intern_const_alloc_recursive(&mut ecx, None, loc_place).unwrap();
|
||||
let loc_const = ty::Const {
|
||||
ty: loc_ty,
|
||||
|
|
|
@ -110,7 +110,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
|
||||
match intrinsic_name {
|
||||
"caller_location" => {
|
||||
let location = self.alloc_caller_location_for_span(span)?;
|
||||
let location = self.alloc_caller_location_for_span(span);
|
||||
self.write_scalar(location.ptr, dest)?;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
use rustc::middle::lang_items::PanicLocationLangItem;
|
||||
use rustc::mir::interpret::{Pointer, PointerArithmetic, Scalar};
|
||||
use rustc::ty::subst::Subst;
|
||||
use rustc_target::abi::{LayoutOf, Size};
|
||||
use rustc_target::abi::LayoutOf;
|
||||
use syntax_pos::{Symbol, Span};
|
||||
|
||||
use crate::interpret::{MemoryKind, MPlaceTy, intrinsics::{InterpCx, InterpResult, Machine}};
|
||||
use crate::interpret::{Scalar, MemoryKind, MPlaceTy, intrinsics::{InterpCx, Machine}};
|
||||
|
||||
impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
crate fn alloc_caller_location(
|
||||
|
@ -12,46 +11,32 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
filename: Symbol,
|
||||
line: u32,
|
||||
col: u32,
|
||||
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> {
|
||||
) -> MPlaceTy<'tcx, M::PointerTag> {
|
||||
let file = self.allocate_str(&filename.as_str(), MemoryKind::CallerLocation);
|
||||
let line = Scalar::from_u32(line);
|
||||
let col = Scalar::from_u32(col);
|
||||
|
||||
let ptr_size = self.pointer_size();
|
||||
let u32_size = Size::from_bits(32);
|
||||
|
||||
// Allocate memory for `CallerLocation` struct.
|
||||
let loc_ty = self.tcx.type_of(self.tcx.require_lang_item(PanicLocationLangItem, None))
|
||||
.subst(*self.tcx, self.tcx.mk_substs([self.tcx.lifetimes.re_static.into()].iter()));
|
||||
let loc_layout = self.layout_of(loc_ty)?;
|
||||
|
||||
let file_alloc = self.tcx.allocate_bytes(filename.as_str().as_bytes());
|
||||
let file_ptr = Pointer::new(file_alloc, Size::ZERO);
|
||||
let file = Scalar::Ptr(self.tag_static_base_pointer(file_ptr));
|
||||
let file_len = Scalar::from_uint(filename.as_str().len() as u128, ptr_size);
|
||||
|
||||
let loc_layout = self.layout_of(loc_ty).unwrap();
|
||||
let location = self.allocate(loc_layout, MemoryKind::CallerLocation);
|
||||
|
||||
let file_out = self.mplace_field(location, 0)?;
|
||||
let file_ptr_out = self.force_ptr(self.mplace_field(file_out, 0)?.ptr)?;
|
||||
let file_len_out = self.force_ptr(self.mplace_field(file_out, 1)?.ptr)?;
|
||||
let line_out = self.force_ptr(self.mplace_field(location, 1)?.ptr)?;
|
||||
let col_out = self.force_ptr(self.mplace_field(location, 2)?.ptr)?;
|
||||
// Initialize fields.
|
||||
self.write_immediate(file.to_ref(), self.mplace_field(location, 0).unwrap().into())
|
||||
.expect("writing to memory we just allocated cannot fail");
|
||||
self.write_scalar(line, self.mplace_field(location, 1).unwrap().into())
|
||||
.expect("writing to memory we just allocated cannot fail");
|
||||
self.write_scalar(col, self.mplace_field(location, 2).unwrap().into())
|
||||
.expect("writing to memory we just allocated cannot fail");
|
||||
|
||||
let layout = &self.tcx.data_layout;
|
||||
// We just allocated this, so we can skip the bounds checks.
|
||||
let alloc = self.memory.get_raw_mut(file_ptr_out.alloc_id)?;
|
||||
|
||||
alloc.write_scalar(layout, file_ptr_out, file.into(), ptr_size)?;
|
||||
alloc.write_scalar(layout, file_len_out, file_len.into(), ptr_size)?;
|
||||
alloc.write_scalar(layout, line_out, line.into(), u32_size)?;
|
||||
alloc.write_scalar(layout, col_out, col.into(), u32_size)?;
|
||||
|
||||
Ok(location)
|
||||
location
|
||||
}
|
||||
|
||||
pub fn alloc_caller_location_for_span(
|
||||
&mut self,
|
||||
span: Span,
|
||||
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> {
|
||||
) -> MPlaceTy<'tcx, M::PointerTag> {
|
||||
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
||||
let caller = self.tcx.sess.source_map().lookup_char_pos(topmost.lo());
|
||||
self.alloc_caller_location(
|
||||
|
|
|
@ -331,7 +331,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
Ok(self.read_immediate(op)?.to_scalar_or_undef())
|
||||
}
|
||||
|
||||
// Turn the MPlace into a string (must already be dereferenced!)
|
||||
// Turn the fat MPlace into a string (must already be dereferenced!)
|
||||
pub fn read_str(
|
||||
&self,
|
||||
mplace: MPlaceTy<'tcx, M::PointerTag>,
|
||||
|
|
|
@ -1034,6 +1034,24 @@ where
|
|||
MPlaceTy::from_aligned_ptr(ptr, layout)
|
||||
}
|
||||
|
||||
/// Returns a fat MPlace.
|
||||
pub fn allocate_str(
|
||||
&mut self,
|
||||
str: &str,
|
||||
kind: MemoryKind<M::MemoryKinds>,
|
||||
) -> MPlaceTy<'tcx, M::PointerTag> {
|
||||
let ptr = self.memory.allocate_static_bytes(str.as_bytes(), kind);
|
||||
let meta = Scalar::from_uint(str.len() as u128, self.pointer_size());
|
||||
let mplace = MemPlace {
|
||||
ptr: ptr.into(),
|
||||
align: Align::from_bytes(1).unwrap(),
|
||||
meta: Some(meta),
|
||||
};
|
||||
|
||||
let layout = self.layout_of(self.tcx.mk_static_str()).unwrap();
|
||||
MPlaceTy { mplace, layout }
|
||||
}
|
||||
|
||||
pub fn write_discriminant_index(
|
||||
&mut self,
|
||||
variant_index: VariantIdx,
|
||||
|
|
Loading…
Reference in New Issue