Skip to content

Commit 6b41de3

Browse files
committed
[clang][Interp] Implement ptrauth builtins
1 parent 4e6c8f1 commit 6b41de3

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

clang/lib/AST/Interp/ByteCodeExprGen.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3572,6 +3572,7 @@ bool ByteCodeExprGen<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) {
35723572
unsigned Builtin = E->getBuiltinCallee();
35733573
if (Builtin == Builtin::BI__builtin___CFStringMakeConstantString ||
35743574
Builtin == Builtin::BI__builtin___NSStringMakeConstantString ||
3575+
Builtin == Builtin::BI__builtin_ptrauth_sign_constant ||
35753576
Builtin == Builtin::BI__builtin_function_start) {
35763577
if (std::optional<unsigned> GlobalOffset = P.createGlobal(E))
35773578
return this->emitGetPtrGlobal(*GlobalOffset, E);

clang/lib/AST/Interp/InterpBuiltin.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "clang/AST/RecordLayout.h"
1414
#include "clang/Basic/Builtins.h"
1515
#include "clang/Basic/TargetInfo.h"
16+
#include "llvm/Support/SipHash.h"
1617

1718
namespace clang {
1819
namespace interp {
@@ -1100,6 +1101,18 @@ static bool interp__builtin_os_log_format_buffer_size(InterpState &S,
11001101
return true;
11011102
}
11021103

1104+
static bool interp__builtin_ptrauth_string_discriminator(
1105+
InterpState &S, CodePtr OpPC, const InterpFrame *Frame,
1106+
const Function *Func, const CallExpr *Call) {
1107+
const auto &Ptr = S.Stk.peek<Pointer>();
1108+
assert(Ptr.getFieldDesc()->isPrimitiveArray());
1109+
1110+
StringRef R(&Ptr.deref<char>(), Ptr.getFieldDesc()->getNumElems() - 1);
1111+
uint64_t Result = getPointerAuthStableSipHash(R);
1112+
pushInteger(S, Result, Call->getType());
1113+
return true;
1114+
}
1115+
11031116
bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
11041117
const CallExpr *Call) {
11051118
const InterpFrame *Frame = S.Current;
@@ -1424,6 +1437,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
14241437
return false;
14251438
break;
14261439

1440+
case Builtin::BI__builtin_ptrauth_string_discriminator:
1441+
if (!interp__builtin_ptrauth_string_discriminator(S, OpPC, Frame, F, Call))
1442+
return false;
1443+
break;
1444+
14271445
default:
14281446
S.FFDiag(S.Current->getLocation(OpPC),
14291447
diag::note_invalid_subexpr_in_const_expr)

clang/test/CodeGen/ptrauth-intrinsics.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s
22
// RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s
3+
//
4+
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s
5+
// RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s
36

47
void (*fnptr)(void);
58
long int_discriminator;

0 commit comments

Comments
 (0)