Skip to content

Commit bd4a56b

Browse files
committed
Auto merge of #2624 - WaffleLapkin:iforgor💀, r=RalfJung
Implement `ptr_mask` intrinsic I promised I'll implement it, but then forgot 😅
2 parents d795f7e + 7663305 commit bd4a56b

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/tools/miri/src/shims/intrinsics/mod.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_middle::{
1111
mir,
1212
ty::{self, FloatTy, Ty},
1313
};
14-
use rustc_target::abi::Integer;
14+
use rustc_target::abi::{Integer, Size};
1515

1616
use crate::*;
1717
use atomic::EvalContextExt as _;
@@ -120,6 +120,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
120120
this.write_bytes_ptr(ptr, iter::repeat(val_byte).take(byte_count.bytes_usize()))?;
121121
}
122122

123+
"ptr_mask" => {
124+
let [ptr, mask] = check_arg_count(args)?;
125+
126+
let ptr = this.read_pointer(ptr)?;
127+
let mask = this.read_scalar(mask)?.to_machine_usize(this)?;
128+
129+
let masked_addr = Size::from_bytes(ptr.addr().bytes() & mask);
130+
131+
this.write_pointer(Pointer::new(ptr.provenance, masked_addr), dest)?;
132+
}
133+
123134
// Floating-point operations
124135
"fabsf32" => {
125136
let [f] = check_arg_count(args)?;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#![feature(ptr_mask)]
2+
#![feature(strict_provenance)]
3+
4+
fn main() {
5+
let v: u32 = 0xABCDABCD;
6+
let ptr: *const u32 = &v;
7+
8+
// u32 is 4 aligned,
9+
// so the lower `log2(4) = 2` bits of the address are always 0
10+
assert_eq!(ptr.addr() & 0b11, 0);
11+
12+
let tagged_ptr = ptr.map_addr(|a| a | 0b11);
13+
let tag = tagged_ptr.addr() & 0b11;
14+
let masked_ptr = tagged_ptr.mask(!0b11);
15+
16+
assert_eq!(tag, 0b11);
17+
assert_eq!(unsafe { *masked_ptr }, 0xABCDABCD);
18+
}

0 commit comments

Comments
 (0)