Skip to content

Commit 717e4eb

Browse files
committed
Address review feedback.
- add missing sema test - also test ELF codegen for intrinsics - various capitalization and type nits
1 parent 5e0ea2e commit 717e4eb

File tree

4 files changed

+32
-19
lines changed

4 files changed

+32
-19
lines changed

clang/lib/AST/ExprConstant.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12585,9 +12585,10 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1258512585
return Visit(E->getArg(0));
1258612586

1258712587
case Builtin::BI__builtin_ptrauth_string_discriminator: {
12588-
auto literal = cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts());
12589-
auto result = getPointerAuthStableSipHash16(literal->getString());
12590-
return Success(result, E);
12588+
const auto *Literal =
12589+
cast<StringLiteral>(E->getArg(0)->IgnoreParenImpCasts());
12590+
uint64_t Result = getPointerAuthStableSipHash16(Literal->getString());
12591+
return Success(Result, E);
1259112592
}
1259212593

1259312594
case Builtin::BI__builtin_ffs:

clang/lib/Sema/SemaChecking.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,22 +2156,22 @@ static ExprResult PointerAuthAuthAndResign(Sema &S, CallExpr *Call) {
21562156
return Call;
21572157
}
21582158

2159-
static ExprResult PointerAuthStringDiscriminator(Sema &S, CallExpr *call) {
2160-
if (checkPointerAuthEnabled(S, call)) return ExprError();
2159+
static ExprResult PointerAuthStringDiscriminator(Sema &S, CallExpr *Call) {
2160+
if (checkPointerAuthEnabled(S, Call)) return ExprError();
21612161

21622162
// We've already performed normal call type-checking.
2163-
Expr *arg = call->getArgs()[0]->IgnoreParenImpCasts();
2163+
const Expr *Arg = Call->getArg(0)->IgnoreParenImpCasts();
21642164

21652165
// Operand must be an ordinary or UTF-8 string literal.
2166-
auto literal = dyn_cast<StringLiteral>(arg);
2167-
if (!literal || literal->getCharByteWidth() != 1) {
2168-
S.Diag(arg->getExprLoc(), diag::err_ptrauth_string_not_literal)
2169-
<< (literal ? 1 : 0)
2170-
<< arg->getSourceRange();
2166+
const auto *Literal = dyn_cast<StringLiteral>(Arg);
2167+
if (!Literal || Literal->getCharByteWidth() != 1) {
2168+
S.Diag(Arg->getExprLoc(), diag::err_ptrauth_string_not_literal)
2169+
<< (Literal ? 1 : 0)
2170+
<< Arg->getSourceRange();
21712171
return ExprError();
21722172
}
21732173

2174-
return call;
2174+
return Call;
21752175
}
21762176

21772177
static ExprResult BuiltinLaunder(Sema &S, CallExpr *TheCall) {

clang/test/CodeGen/ptrauth-intrinsics.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s
2+
// RUN: %clang_cc1 -triple aarch64-elf -fptrauth-intrinsics -emit-llvm %s -o - | FileCheck %s
23

34
void (*fnptr)(void);
45
long int_discriminator;
56
void *ptr_discriminator;
67
long signature;
78

8-
// CHECK-LABEL: define void @test_auth()
9+
// CHECK-LABEL: define {{.*}}void @test_auth()
910
void test_auth() {
1011
// CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,
1112
// CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,
@@ -17,7 +18,7 @@ void test_auth() {
1718
fnptr = __builtin_ptrauth_auth(fnptr, 0, ptr_discriminator);
1819
}
1920

20-
// CHECK-LABEL: define void @test_strip()
21+
// CHECK-LABEL: define {{.*}}void @test_strip()
2122
void test_strip() {
2223
// CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,
2324
// CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[PTR]] to i64
@@ -27,7 +28,7 @@ void test_strip() {
2728
fnptr = __builtin_ptrauth_strip(fnptr, 0);
2829
}
2930

30-
// CHECK-LABEL: define void @test_sign_unauthenticated()
31+
// CHECK-LABEL: define {{.*}}void @test_sign_unauthenticated()
3132
void test_sign_unauthenticated() {
3233
// CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,
3334
// CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,
@@ -39,7 +40,7 @@ void test_sign_unauthenticated() {
3940
fnptr = __builtin_ptrauth_sign_unauthenticated(fnptr, 0, ptr_discriminator);
4041
}
4142

42-
// CHECK-LABEL: define void @test_auth_and_resign()
43+
// CHECK-LABEL: define {{.*}}void @test_auth_and_resign()
4344
void test_auth_and_resign() {
4445
// CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,
4546
// CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,
@@ -51,7 +52,7 @@ void test_auth_and_resign() {
5152
fnptr = __builtin_ptrauth_auth_and_resign(fnptr, 0, ptr_discriminator, 3, 15);
5253
}
5354

54-
// CHECK-LABEL: define void @test_blend_discriminator()
55+
// CHECK-LABEL: define {{.*}}void @test_blend_discriminator()
5556
void test_blend_discriminator() {
5657
// CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,
5758
// CHECK-NEXT: [[DISC:%.*]] = load i64, ptr @int_discriminator,
@@ -61,7 +62,7 @@ void test_blend_discriminator() {
6162
int_discriminator = __builtin_ptrauth_blend_discriminator(fnptr, int_discriminator);
6263
}
6364

64-
// CHECK-LABEL: define void @test_sign_generic_data()
65+
// CHECK-LABEL: define {{.*}}void @test_sign_generic_data()
6566
void test_sign_generic_data() {
6667
// CHECK: [[PTR:%.*]] = load ptr, ptr @fnptr,
6768
// CHECK-NEXT: [[DISC0:%.*]] = load ptr, ptr @ptr_discriminator,
@@ -72,7 +73,7 @@ void test_sign_generic_data() {
7273
signature = __builtin_ptrauth_sign_generic_data(fnptr, ptr_discriminator);
7374
}
7475

75-
// CHECK-LABEL: define void @test_string_discriminator()
76+
// CHECK-LABEL: define {{.*}}void @test_string_discriminator()
7677
void test_string_discriminator() {
7778
// CHECK: [[X:%.*]] = alloca i32
7879

clang/test/Sema/ptrauth.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,17 @@ void test_blend_discriminator(int *dp, int (*fp)(int), int value) {
4747
float *mismatch = __builtin_ptrauth_blend_discriminator(dp, value); // expected-error {{incompatible integer to pointer conversion initializing 'float *' with an expression of type}}
4848
}
4949

50+
void test_string_discriminator(const char *str) {
51+
__builtin_ptrauth_string_discriminator(); // expected-error {{too few arguments}}
52+
__builtin_ptrauth_string_discriminator(str, str); // expected-error {{too many arguments}}
53+
(void) __builtin_ptrauth_string_discriminator("test string"); // no warning
54+
55+
__builtin_ptrauth_string_discriminator(str); // expected-error {{argument must be a string literal}}
56+
57+
void *mismatch = __builtin_ptrauth_string_discriminator("test string"); // expected-error {{incompatible integer to pointer conversion initializing 'void *' with an expression of type 'unsigned long'}}
58+
}
59+
60+
5061
void test_sign_unauthenticated(int *dp, int (*fp)(int)) {
5162
__builtin_ptrauth_sign_unauthenticated(dp, VALID_DATA_KEY); // expected-error {{too few arguments}}
5263
__builtin_ptrauth_sign_unauthenticated(dp, VALID_DATA_KEY, dp, dp); // expected-error {{too many arguments}}

0 commit comments

Comments
 (0)