Author: Timm Bäder Date: 2024-06-24T13:02:55+02:00 New Revision: 6b41de3605658069eb69b8684c2760e54bd1bea3
URL: https://github.com/llvm/llvm-project/commit/6b41de3605658069eb69b8684c2760e54bd1bea3 DIFF: https://github.com/llvm/llvm-project/commit/6b41de3605658069eb69b8684c2760e54bd1bea3.diff LOG: [clang][Interp] Implement ptrauth builtins Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/InterpBuiltin.cpp clang/test/CodeGen/ptrauth-intrinsics.c Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index cb5962466f35f..3c96059375360 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -3572,6 +3572,7 @@ bool ByteCodeExprGen<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) { unsigned Builtin = E->getBuiltinCallee(); if (Builtin == Builtin::BI__builtin___CFStringMakeConstantString || Builtin == Builtin::BI__builtin___NSStringMakeConstantString || + Builtin == Builtin::BI__builtin_ptrauth_sign_constant || Builtin == Builtin::BI__builtin_function_start) { if (std::optional<unsigned> GlobalOffset = P.createGlobal(E)) return this->emitGetPtrGlobal(*GlobalOffset, E); diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp index af8841c8b4ef8..aeb6ec42eb39e 100644 --- a/clang/lib/AST/Interp/InterpBuiltin.cpp +++ b/clang/lib/AST/Interp/InterpBuiltin.cpp @@ -13,6 +13,7 @@ #include "clang/AST/RecordLayout.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/TargetInfo.h" +#include "llvm/Support/SipHash.h" namespace clang { namespace interp { @@ -1100,6 +1101,18 @@ static bool interp__builtin_os_log_format_buffer_size(InterpState &S, return true; } +static bool interp__builtin_ptrauth_string_discriminator( + InterpState &S, CodePtr OpPC, const InterpFrame *Frame, + const Function *Func, const CallExpr *Call) { + const auto &Ptr = S.Stk.peek<Pointer>(); + assert(Ptr.getFieldDesc()->isPrimitiveArray()); + + StringRef R(&Ptr.deref<char>(), Ptr.getFieldDesc()->getNumElems() - 1); + uint64_t Result = getPointerAuthStableSipHash(R); + pushInteger(S, Result, Call->getType()); + return true; +} + bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F, const CallExpr *Call) { const InterpFrame *Frame = S.Current; @@ -1424,6 +1437,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F, return false; break; + case Builtin::BI__builtin_ptrauth_string_discriminator: + if (!interp__builtin_ptrauth_string_discriminator(S, OpPC, Frame, F, Call)) + return false; + break; + default: S.FFDiag(S.Current->getLocation(OpPC), diag::note_invalid_subexpr_in_const_expr) diff --git a/clang/test/CodeGen/ptrauth-intrinsics.c b/clang/test/CodeGen/ptrauth-intrinsics.c index db37d78553769..50bf1898e4b37 100644 --- a/clang/test/CodeGen/ptrauth-intrinsics.c +++ b/clang/test/CodeGen/ptrauth-intrinsics.c @@ -1,5 +1,8 @@ // RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s // RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s +// +// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s +// RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s void (*fnptr)(void); long int_discriminator; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits