Skip to content

Commit

Permalink
Copy undef_masks correctly for repeated bytes
Browse files Browse the repository at this point in the history
  • Loading branch information
wesleywiser committed Jun 30, 2018
1 parent 84fe0c4 commit faef6a3
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions src/librustc_mir/interpret/memory.rs
Expand Up @@ -666,7 +666,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
}
}

self.copy_undef_mask(src, dest, size * length)?;
self.copy_undef_mask(src, dest, size, length)?;
// copy back the relocations
self.get_mut(dest.alloc_id)?.relocations.insert_presorted(relocations);

Expand Down Expand Up @@ -887,6 +887,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
src: Pointer,
dest: Pointer,
size: Size,
repeat: u64,
) -> EvalResult<'tcx> {
// The bits have to be saved locally before writing to dest in case src and dest overlap.
assert_eq!(size.bytes() as usize as u64, size.bytes());
Expand All @@ -896,10 +897,13 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {

for i in 0..size.bytes() {
let defined = undef_mask.get(src.offset + Size::from_bytes(i));
dest_allocation.undef_mask.set(
dest.offset + Size::from_bytes(i),
defined
);

for j in 0..repeat {
dest_allocation.undef_mask.set(
dest.offset + Size::from_bytes(i + (size.bytes() * j)),
defined
);
}
}

Ok(())
Expand Down

0 comments on commit faef6a3

Please sign in to comment.