diff options
| author | Maybe Waffle <waffle.lapkin@gmail.com> | 2022-05-11 17:52:00 +0400 |
|---|---|---|
| committer | Maybe Waffle <waffle.lapkin@gmail.com> | 2022-08-21 05:27:14 +0400 |
| commit | 10270f4b442207b23b28f776b8dda297bd03570a (patch) | |
| tree | 64993fc370f2192d32582e631d5cf924fa77bb98 /compiler/rustc_codegen_llvm/src | |
| parent | 48853a361a5ff0e8215301c62f259a26eed7aa72 (diff) | |
| download | rust-10270f4b442207b23b28f776b8dda297bd03570a.tar.gz rust-10270f4b442207b23b28f776b8dda297bd03570a.zip | |
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*
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/context.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/intrinsic.rs | 1 |
2 files changed, 5 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs index d4d84147239..bbb6bacc452 100644 --- a/compiler/rustc_codegen_llvm/src/context.rs +++ b/compiler/rustc_codegen_llvm/src/context.rs @@ -644,6 +644,7 @@ impl<'ll> CodegenCx<'ll, '_> { let i8p = self.type_i8p(); let void = self.type_void(); + let voidp = self.type_ptr_to(void); let i1 = self.type_i1(); let t_i8 = self.type_i8(); let t_i16 = self.type_i16(); @@ -886,6 +887,9 @@ impl<'ll> CodegenCx<'ll, '_> { ifn!("llvm.dbg.declare", fn(t_metadata, t_metadata) -> void); ifn!("llvm.dbg.value", fn(t_metadata, t_i64, t_metadata) -> void); } + + ifn!("llvm.ptrmask", fn(voidp, t_isize) -> voidp); + None } diff --git a/compiler/rustc_codegen_llvm/src/intrinsic.rs b/compiler/rustc_codegen_llvm/src/intrinsic.rs index 9f364749287..1a0e44fdc5b 100644 --- a/compiler/rustc_codegen_llvm/src/intrinsic.rs +++ b/compiler/rustc_codegen_llvm/src/intrinsic.rs @@ -71,6 +71,7 @@ fn get_simple_intrinsic<'ll>( sym::nearbyintf64 => "llvm.nearbyint.f64", sym::roundf32 => "llvm.round.f32", sym::roundf64 => "llvm.round.f64", + sym::ptr_mask => "llvm.ptrmask", _ => return None, }; Some(cx.get_intrinsic(llvm_name)) |
