From 8bcda8f67bbab0cdaecede0dc4996fec1c0bb7f5 Mon Sep 17 00:00:00 2001 From: Artyom Tetyukhin <51746822+arttet@users.noreply.github.com> Date: Thu, 7 Dec 2023 16:29:59 +0400 Subject: [PATCH] Add pointer authentication intrinsics --- compiler/rustc_codegen_llvm/src/context.rs | 8 ++++++++ compiler/rustc_codegen_llvm/src/intrinsic.rs | 19 +++++++++++++++++++ .../rustc_hir_analysis/src/check/intrinsic.rs | 5 +++++ compiler/rustc_span/src/symbol.rs | 4 ++++ 4 files changed, 36 insertions(+) diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs index 92a8c00510b94..0539e4696ace0 100644 --- a/compiler/rustc_codegen_llvm/src/context.rs +++ b/compiler/rustc_codegen_llvm/src/context.rs @@ -931,6 +931,14 @@ impl<'ll> CodegenCx<'ll, '_> { ifn!("llvm.va_end", fn(ptr) -> void); ifn!("llvm.va_copy", fn(ptr, ptr) -> void); + // pointer authentication intrinsics + ifn!("llvm.ptrauth.sign.i64", fn(t_i64, t_i32, t_i64) -> t_i64); + ifn!("llvm.ptrauth.auth.i64", fn(t_i64, t_i32, t_i64) -> t_i64); + ifn!("llvm.ptrauth.strip.i64", fn(t_i64, t_i32) -> t_i64); + ifn!("llvm.ptrauth.resign.i64", fn(t_i64, t_i32, t_i64, t_i32, t_i64) -> t_i64); + ifn!("llvm.ptrauth.sign_generic.i64", fn(t_i64, t_i64) -> t_i64); + ifn!("llvm.ptrauth.blend.i64", fn(t_i64, t_i64) -> t_i64); + if self.sess().instrument_coverage() { ifn!("llvm.instrprof.increment", fn(ptr, t_i64, t_i32, t_i32) -> void); } diff --git a/compiler/rustc_codegen_llvm/src/intrinsic.rs b/compiler/rustc_codegen_llvm/src/intrinsic.rs index cc7e78b9c62bf..2a01c793c39ad 100644 --- a/compiler/rustc_codegen_llvm/src/intrinsic.rs +++ b/compiler/rustc_codegen_llvm/src/intrinsic.rs @@ -295,6 +295,25 @@ impl<'ll, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'_, 'll, 'tcx> { } } + sym::ptrauth_sign_key_asia + | sym::ptrauth_sign_key_asib + | sym::ptrauth_sign_key_asda + | sym::ptrauth_sign_key_asdb => { + + let key = self.const_i32(match name { + sym::ptrauth_sign_key_asia => 0, + sym::ptrauth_sign_key_asib => 1, + sym::ptrauth_sign_key_asda => 2, + sym::ptrauth_sign_key_asdb => 3, + _ => bug!("Unknown PAuth key"), + }); + + let value = args[0].immediate() + let discriminator = args[1].immediate() + + self.call_intrinsic("llvm.ptrauth.sign.i64", &[value, key, discriminator]) + } + sym::raw_eq => { use abi::Abi::*; let tp_ty = fn_args.type_at(0); diff --git a/compiler/rustc_hir_analysis/src/check/intrinsic.rs b/compiler/rustc_hir_analysis/src/check/intrinsic.rs index 7ea21b24fc821..573d149b155b1 100644 --- a/compiler/rustc_hir_analysis/src/check/intrinsic.rs +++ b/compiler/rustc_hir_analysis/src/check/intrinsic.rs @@ -440,6 +440,11 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) { None => bug!("`va_list` language item needed for C-variadic intrinsics"), }, + ptrauth_sign_key_asda + | ptrauth_sign_key_asdb + | ptrauth_sign_key_asia + | ptrauth_sign_key_asib => (0, vec![tcx.types.i64, tcx.types.i64], tcx.types.i64), + sym::nontemporal_store => { (1, vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], Ty::new_unit(tcx)) } diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index d7e822382ef92..f356f902664cf 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1260,6 +1260,10 @@ symbols! { ptr_write_bytes, ptr_write_unaligned, ptr_write_volatile, + ptrauth_sign_key_asda, + ptrauth_sign_key_asdb, + ptrauth_sign_key_asia, + ptrauth_sign_key_asib, pub_macro_rules, pub_restricted, public,