Auto merge of #15571 - Veykril:mir-alloc, r=Veykril
Remove allocation on mir eval memory write
This commit is contained in:
commit
d5b6ab2fa5
@ -215,9 +215,7 @@ impl Interval {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn write_from_interval(&self, memory: &mut Evaluator<'_>, interval: Interval) -> Result<()> {
|
fn write_from_interval(&self, memory: &mut Evaluator<'_>, interval: Interval) -> Result<()> {
|
||||||
// FIXME: this could be more efficient
|
memory.copy_from_interval(self.addr, interval)
|
||||||
let bytes = &interval.get(memory)?.to_vec();
|
|
||||||
memory.write_memory(self.addr, bytes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn slice(self, range: Range<usize>) -> Interval {
|
fn slice(self, range: Range<usize>) -> Interval {
|
||||||
@ -1760,6 +1758,48 @@ impl Evaluator<'_> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn copy_from_interval(&mut self, addr: Address, r: Interval) -> Result<()> {
|
||||||
|
if r.size == 0 {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let oob = || MirEvalError::UndefinedBehavior("out of bounds memory write".to_string());
|
||||||
|
|
||||||
|
match (addr, r.addr) {
|
||||||
|
(Stack(dst), Stack(src)) => {
|
||||||
|
if self.stack.len() < src + r.size || self.stack.len() < dst + r.size {
|
||||||
|
return Err(oob());
|
||||||
|
}
|
||||||
|
self.stack.copy_within(src..src + r.size, dst)
|
||||||
|
}
|
||||||
|
(Heap(dst), Heap(src)) => {
|
||||||
|
if self.stack.len() < src + r.size || self.stack.len() < dst + r.size {
|
||||||
|
return Err(oob());
|
||||||
|
}
|
||||||
|
self.heap.copy_within(src..src + r.size, dst)
|
||||||
|
}
|
||||||
|
(Stack(dst), Heap(src)) => {
|
||||||
|
self.stack
|
||||||
|
.get_mut(dst..dst + r.size)
|
||||||
|
.ok_or_else(oob)?
|
||||||
|
.copy_from_slice(self.heap.get(src..src + r.size).ok_or_else(oob)?);
|
||||||
|
}
|
||||||
|
(Heap(dst), Stack(src)) => {
|
||||||
|
self.heap
|
||||||
|
.get_mut(dst..dst + r.size)
|
||||||
|
.ok_or_else(oob)?
|
||||||
|
.copy_from_slice(self.stack.get(src..src + r.size).ok_or_else(oob)?);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return Err(MirEvalError::UndefinedBehavior(format!(
|
||||||
|
"invalid memory write at address {addr:?}"
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn size_align_of(&self, ty: &Ty, locals: &Locals) -> Result<Option<(usize, usize)>> {
|
fn size_align_of(&self, ty: &Ty, locals: &Locals) -> Result<Option<(usize, usize)>> {
|
||||||
if let Some(layout) = self.layout_cache.borrow().get(ty) {
|
if let Some(layout) = self.layout_cache.borrow().get(ty) {
|
||||||
return Ok(layout
|
return Ok(layout
|
||||||
|
Loading…
x
Reference in New Issue
Block a user