Update cranelift
This commit is contained in:
parent
37a6c04718
commit
982382dc03
9 changed files with 52 additions and 1309 deletions
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -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 => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
@ -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(_)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue