diff options
| author | bors <bors@rust-lang.org> | 2022-10-27 22:48:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-10-27 22:48:45 +0000 |
| commit | bd4a56bce872b3238502d20bb17d6590b73bcf99 (patch) | |
| tree | 239e7b78f17aaa4d521c0ca51c13e89094cadcee | |
| parent | d795f7e479d1988215912b65f6a9256b399028da (diff) | |
| parent | 7663305dff3b6634de90a9f3bc726e976357dc48 (diff) | |
| download | rust-bd4a56bce872b3238502d20bb17d6590b73bcf99.tar.gz rust-bd4a56bce872b3238502d20bb17d6590b73bcf99.zip | |
Auto merge of #2624 - WaffleLapkin:iforgor💀, r=RalfJung
Implement `ptr_mask` intrinsic I promised I'll implement it, but then forgot 😅
| -rw-r--r-- | src/tools/miri/src/shims/intrinsics/mod.rs | 13 | ||||
| -rw-r--r-- | src/tools/miri/tests/pass/shims/ptr_mask.rs | 18 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/tools/miri/src/shims/intrinsics/mod.rs b/src/tools/miri/src/shims/intrinsics/mod.rs index e0985ace5be..6004e2078ad 100644 --- a/src/tools/miri/src/shims/intrinsics/mod.rs +++ b/src/tools/miri/src/shims/intrinsics/mod.rs @@ -11,7 +11,7 @@ use rustc_middle::{ mir, ty::{self, FloatTy, Ty}, }; -use rustc_target::abi::Integer; +use rustc_target::abi::{Integer, Size}; use crate::*; use atomic::EvalContextExt as _; @@ -120,6 +120,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { this.write_bytes_ptr(ptr, iter::repeat(val_byte).take(byte_count.bytes_usize()))?; } + "ptr_mask" => { + let [ptr, mask] = check_arg_count(args)?; + + let ptr = this.read_pointer(ptr)?; + let mask = this.read_scalar(mask)?.to_machine_usize(this)?; + + let masked_addr = Size::from_bytes(ptr.addr().bytes() & mask); + + this.write_pointer(Pointer::new(ptr.provenance, masked_addr), dest)?; + } + // Floating-point operations "fabsf32" => { let [f] = check_arg_count(args)?; diff --git a/src/tools/miri/tests/pass/shims/ptr_mask.rs b/src/tools/miri/tests/pass/shims/ptr_mask.rs new file mode 100644 index 00000000000..fb8bb6b13db --- /dev/null +++ b/src/tools/miri/tests/pass/shims/ptr_mask.rs @@ -0,0 +1,18 @@ +#![feature(ptr_mask)] +#![feature(strict_provenance)] + +fn main() { + let v: u32 = 0xABCDABCD; + let ptr: *const u32 = &v; + + // u32 is 4 aligned, + // so the lower `log2(4) = 2` bits of the address are always 0 + assert_eq!(ptr.addr() & 0b11, 0); + + let tagged_ptr = ptr.map_addr(|a| a | 0b11); + let tag = tagged_ptr.addr() & 0b11; + let masked_ptr = tagged_ptr.mask(!0b11); + + assert_eq!(tag, 0b11); + assert_eq!(unsafe { *masked_ptr }, 0xABCDABCD); +} |
