1
Fork 0

Update cranelift

This commit is contained in:
kadmin 2020-12-29 02:00:04 +00:00
parent 37a6c04718
commit 982382dc03
9 changed files with 52 additions and 1309 deletions

View file

@ -832,6 +832,16 @@ fn codegen_stmt<'tcx>(
} }
} }
StatementKind::Coverage { .. } => fx.tcx.sess.fatal("-Zcoverage is unimplemented"), StatementKind::Coverage { .. } => fx.tcx.sess.fatal("-Zcoverage is unimplemented"),
StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping {
src,
dst,
count,
}) => {
let dst = codegen_operand(fx, dst).load_scalar(fx);
let src = codegen_operand(fx, src).load_scalar(fx);
let count = codegen_operand(fx, count).load_scalar(fx);
fx.bcx.call_memcpy(fx.cx.module.target_config(), dst, src, count);
}
} }
} }

View file

@ -11,6 +11,7 @@
#![warn(rust_2018_idioms)] #![warn(rust_2018_idioms)]
#![warn(unused_lifetimes)] #![warn(unused_lifetimes)]
#![warn(unreachable_pub)] #![warn(unreachable_pub)]
#![feature(box_patterns)]
extern crate snap; extern crate snap;
#[macro_use] #[macro_use]

View file

@ -118,23 +118,22 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
mir::StatementKind::CopyNonOverlapping(box mir::CopyNonOverlapping { mir::StatementKind::CopyNonOverlapping(box mir::CopyNonOverlapping {
ref src, ref src,
ref dst, ref dst,
ref size, ref count,
}) => { }) => {
let dst_val = self.codegen_operand(&mut bx, dst); let dst_val = self.codegen_operand(&mut bx, dst);
let src_val = self.codegen_operand(&mut bx, src); let src_val = self.codegen_operand(&mut bx, src);
let size_val = self.codegen_operand(&mut bx, size); let count_val = self.codegen_operand(&mut bx, count);
let size = size_val.immediate_or_packed_pair(&mut bx); let count = count_val.immediate_or_packed_pair(&mut bx);
let dst = dst_val.immediate_or_packed_pair(&mut bx); let dst = dst_val.immediate_or_packed_pair(&mut bx);
let src = src_val.immediate_or_packed_pair(&mut bx); let src = src_val.immediate_or_packed_pair(&mut bx);
use crate::MemFlags; use crate::MemFlags;
let flags = let flags = MemFlags::empty();
(!MemFlags::UNALIGNED) & (!MemFlags::VOLATILE) & (!MemFlags::NONTEMPORAL);
bx.memcpy( bx.memcpy(
dst, dst,
dst_val.layout.layout.align.pref, dst_val.layout.layout.align.pref,
src, src,
src_val.layout.layout.align.pref, src_val.layout.layout.align.pref,
size, count,
flags, flags,
); );
bx bx

View file

@ -1667,8 +1667,10 @@ impl Debug for Statement<'_> {
CopyNonOverlapping(box crate::mir::CopyNonOverlapping { CopyNonOverlapping(box crate::mir::CopyNonOverlapping {
ref src, ref src,
ref dst, ref dst,
ref size, ref count,
}) => write!(fmt, "copy_nonoverlapping(src={:?}, dst={:?}, size={:?})", src, dst, size), }) => {
write!(fmt, "copy_nonoverlapping(src={:?}, dst={:?}, count={:?})", src, dst, count)
}
Nop => write!(fmt, "nop"), Nop => write!(fmt, "nop"),
} }
} }
@ -1684,7 +1686,8 @@ pub struct Coverage {
pub struct CopyNonOverlapping<'tcx> { pub struct CopyNonOverlapping<'tcx> {
pub src: Operand<'tcx>, pub src: Operand<'tcx>,
pub dst: Operand<'tcx>, pub dst: Operand<'tcx>,
pub size: Operand<'tcx>, /// Number of elements to copy from src to dest, not bytes.
pub count: Operand<'tcx>,
} }
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////

View file

@ -439,17 +439,11 @@ macro_rules! make_mir_visitor {
StatementKind::CopyNonOverlapping(box crate::mir::CopyNonOverlapping{ StatementKind::CopyNonOverlapping(box crate::mir::CopyNonOverlapping{
ref $($mutability)? src, ref $($mutability)? src,
ref $($mutability)? dst, ref $($mutability)? dst,
ref $($mutability)? size, ref $($mutability)? count,
}) => { }) => {
self.visit_operand( self.visit_operand(src, location);
src, self.visit_operand(dst, location);
location self.visit_operand(count, location)
);
self.visit_operand(
dst,
location
);
self.visit_operand(size, location)
} }
StatementKind::Nop => {} StatementKind::Nop => {}
} }

View file

@ -95,11 +95,11 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> {
StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping {
ref src, ref src,
ref dst, ref dst,
ref size, ref count,
}) => { }) => {
self.consume_operand(location, src); self.consume_operand(location, src);
self.consume_operand(location, dst); self.consume_operand(location, dst);
self.consume_operand(location, size); self.consume_operand(location, count);
match dst { match dst {
Operand::Move(ref place) | Operand::Copy(ref place) => { Operand::Move(ref place) | Operand::Copy(ref place) => {
self.mutate_place(location, *place, Deep, JustWrite); self.mutate_place(location, *place, Deep, JustWrite);

View file

@ -114,28 +114,36 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
} }
// Call CopyNonOverlapping // Call CopyNonOverlapping
CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { dst, src, size }) => { CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { dst, src, count }) => {
let size = self.eval_operand(size, None)?; let (src, size) = {
let src = self.eval_operand(src, None)?;
let size = src.layout.layout.size;
let mplace = *src.assert_mem_place(self);
let ptr = match mplace.ptr {
Scalar::Ptr(ptr) => ptr,
_ => panic!(),
};
(ptr, size)
};
let dst = { let dst = {
let dst = self.eval_operand(dst, None)?; let dst = self.eval_operand(dst, None)?;
let mplace = *dst.assert_mem_place(self); let mplace = *dst.assert_mem_place(self);
match mplace.ptr { match mplace.ptr {
Scalar::Ptr(ptr) => ptr, Scalar::Ptr(ptr) => ptr,
_ => panic!(), _ => panic!(),
} }
}; };
let src = {
let src = self.eval_operand(src, None)?; let count = self.eval_operand(count, None)?;
let mplace = *src.assert_mem_place(self); let count = self.read_immediate(count)?.to_scalar()?;
match mplace.ptr { let count = if let Scalar::Int(i) = count {
Scalar::Ptr(ptr) => ptr, core::convert::TryFrom::try_from(i).unwrap()
_ => panic!(), } else {
} panic!();
}; };
// Not sure how to convert an MPlaceTy<'_, <M as Machine<'_, '_>>::PointerTag>
// to a pointer, or OpTy to a size self.memory.copy_repeatedly(src, dst, size, count, /*nonoverlapping*/ true)?;
self.memory.copy(src, dst, size.layout.layout.size, /*nonoverlapping*/ true)?;
} }
// Statements we do not track. // Statements we do not track.

File diff suppressed because it is too large Load diff

View file

@ -219,11 +219,11 @@ fn check_statement(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, def_id: DefId, statemen
StatementKind::LlvmInlineAsm { .. } => Err((span, "cannot use inline assembly in const fn".into())), StatementKind::LlvmInlineAsm { .. } => Err((span, "cannot use inline assembly in const fn".into())),
StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping{ StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping{
dst, src, size, dst, src, count,
}) => { }) => {
check_operand(tcx, dst, span, body)?; check_operand(tcx, dst, span, body)?;
check_operand(tcx, src, span, body)?; check_operand(tcx, src, span, body)?;
check_operand(tcx, size, span, body) check_operand(tcx, count, span, body)
}, },
// These are all NOPs // These are all NOPs
StatementKind::StorageLive(_) StatementKind::StorageLive(_)