1
Fork 0

Add pointer masking convenience functions

This commit adds the following functions all of which have a signature
`pointer, usize -> pointer`:
- `<*mut T>::mask`
- `<*const T>::mask`
- `intrinsics::ptr_mask`

These functions are equivalent to `.map_addr(|a| a & mask)` but they
utilize `llvm.ptrmask` llvm intrinsic.

*masks your pointers*
This commit is contained in:
Maybe Waffle 2022-05-11 17:52:00 +04:00
parent 48853a361a
commit 10270f4b44
8 changed files with 65 additions and 1 deletions

View file

@ -575,6 +575,21 @@ impl<T: ?Sized> *mut T {
)
}
/// Masks out bits of the pointer according to a mask.
///
/// This is convenience for `ptr.map_addr(|a| a & mask)`.
///
/// For non-`Sized` pointees this operation changes only the data pointer,
/// leaving the metadata untouched.
#[cfg(not(bootstrap))]
#[unstable(feature = "ptr_mask", issue = "none")]
#[must_use = "returns a new pointer rather than modifying its argument"]
#[inline(always)]
pub fn mask(self, mask: usize) -> *mut T {
let this = intrinsics::ptr_mask(self.cast::<()>(), mask) as *mut ();
from_raw_parts_mut::<T>(this, metadata(self))
}
/// Returns `None` if the pointer is null, or else returns a unique reference to
/// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
/// must be used instead.