CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
220 lines
11 KiB
C
220 lines
11 KiB
C
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics -emit-llvm %s -O0 -o - | FileCheck %s
|
|
|
|
#define __ptrauth(...) __ptrauth(__VA_ARGS__)
|
|
|
|
__INTPTR_TYPE__ __ptrauth(1, 0, 56) g1 = 0;
|
|
// CHECK: @g1 = global i64 0
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 1272) g2 = 0;
|
|
// CHECK: @g2 = global i64 0
|
|
extern __UINTPTR_TYPE__ test_int;
|
|
__UINTPTR_TYPE__ __ptrauth(3, 1, 23) g3 = (__UINTPTR_TYPE__)&test_int;
|
|
// CHECK: @test_int = external global i64
|
|
// CHECK: @g3 = global i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 3, i64 23, ptr @g3) to i64)
|
|
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 712) ga[3] = {0,0,(__UINTPTR_TYPE__)&test_int};
|
|
|
|
// CHECK: @ga = global [3 x i64] [i64 0, i64 0, i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 1, i64 712, ptr getelementptr inbounds ([3 x i64], ptr @ga, i32 0, i32 2)) to i64)]
|
|
|
|
struct A {
|
|
__INTPTR_TYPE__ __ptrauth(1, 0, 431) f0;
|
|
__INTPTR_TYPE__ __ptrauth(1, 0, 9182) f1;
|
|
__INTPTR_TYPE__ __ptrauth(1, 0, 783) f2;
|
|
};
|
|
|
|
struct A gs1 = {0, 0, (__UINTPTR_TYPE__)&test_int};
|
|
// CHECK: @gs1 = global %struct.A { i64 0, i64 0, i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 1, i64 783) to i64) }
|
|
|
|
struct B {
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 1276) f0;
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 23674) f1;
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 163) f2;
|
|
};
|
|
|
|
struct B gs2 = {0, 0, (__UINTPTR_TYPE__)&test_int};
|
|
// CHECK: @gs2 = global %struct.B { i64 0, i64 0, i64 ptrtoint (ptr ptrauth (ptr @test_int, i32 1, i64 163, ptr getelementptr inbounds (%struct.B, ptr @gs2, i32 0, i32 2)) to i64) }
|
|
|
|
// CHECK-LABEL: i64 @test_read_globals
|
|
__INTPTR_TYPE__ test_read_globals() {
|
|
__INTPTR_TYPE__ result = g1 + g2 + g3;
|
|
// CHECK: [[A:%.*]] = load i64, ptr @g1
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[A]], i32 1, i64 56)
|
|
// CHECK: [[B:%.*]] = load i64, ptr @g2
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @g2 to i64), i64 1272)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[B]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr @g3
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @g3 to i64), i64 23)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 3, i64 [[BLENDED]])
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
result += ga[i];
|
|
}
|
|
// CHECK: for.cond:
|
|
// CHECK: [[TEMP:%.*]] = load i32, ptr [[IDX_ADDR:%.*]]
|
|
|
|
// CHECK: for.body:
|
|
// CHECK: [[IDX:%.*]] = load i32, ptr [[IDX_ADDR]]
|
|
// CHECK: [[IDXPROM:%.*]] = sext i32 [[IDX]] to i64
|
|
// CHECK: [[ARRAYIDX:%.*]] = getelementptr inbounds [3 x i64], ptr @ga, i64 0, i64 [[IDXPROM]]
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr [[ARRAYIDX]]
|
|
// CHECK: [[CASTIDX:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTIDX]], i64 712)
|
|
// CHECK: resign.nonnull6:
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: resign.cont7
|
|
|
|
result += gs1.f0 + gs1.f1 + gs1.f2;
|
|
// CHECK: resign.cont10:
|
|
// CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (i8, ptr @gs1, i64 8)
|
|
// CHECK: resign.nonnull11:
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 9182)
|
|
// CHECK: resign.cont12:
|
|
// CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (i8, ptr @gs1, i64 16)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 783)
|
|
result += gs2.f0 + gs2.f1 + gs2.f2;
|
|
// CHECK: [[ADDR:%.*]] = load i64, ptr @gs2
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @gs2 to i64), i64 1276)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (i8, ptr @gs2, i64 8)
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @gs2, i64 8) to i64), i64 23674)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[ADDR]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[ADDR:%.*]] = load i64, ptr getelementptr inbounds nuw (i8, ptr @gs2, i64 16)
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @gs2, i64 16) to i64), i64 163)
|
|
|
|
return result;
|
|
}
|
|
|
|
// CHECK-LABEL: void @test_write_globals
|
|
void test_write_globals(int i, __INTPTR_TYPE__ j) {
|
|
g1 = i;
|
|
g2 = j;
|
|
g3 = 0;
|
|
ga[0] = i;
|
|
ga[1] = j;
|
|
ga[2] = 0;
|
|
gs1.f0 = i;
|
|
gs1.f1 = j;
|
|
gs1.f2 = 0;
|
|
gs2.f0 = i;
|
|
gs2.f1 = j;
|
|
gs2.f2 = 0;
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test_set_A
|
|
void test_set_A(struct A *a, __INTPTR_TYPE__ x, int y) {
|
|
a->f0 = x;
|
|
// CHECK: [[XADDR:%.*]] = load i64, ptr %x.addr
|
|
// CHECK: [[SIGNED_X:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[XADDR]], i32 1, i64 431)
|
|
a->f1 = y;
|
|
// CHECK: [[Y:%.*]] = load i32, ptr %y.addr
|
|
// CHECK: [[CONV:%.*]] = sext i32 [[Y]] to i64
|
|
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[CONV]], i32 1, i64 9182)
|
|
a->f2 = 0;
|
|
// CHECK: [[A:%.*]] = load ptr, ptr %a.addr
|
|
// CHECK: [[F2:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 2
|
|
// CHECK: store i64 0, ptr [[F2]]
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test_set_B
|
|
void test_set_B(struct B *b, __INTPTR_TYPE__ x, int y) {
|
|
b->f0 = x;
|
|
// CHECK: [[X:%.*]] = load i64, ptr %x.addr
|
|
// CHECK: [[F0_ADDR:%.*]] = ptrtoint ptr %f0 to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[F0_ADDR]], i64 1276)
|
|
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[X]], i32 1, i64 [[BLENDED]])
|
|
b->f1 = y;
|
|
// CHECK: [[B:%.*]] = load ptr, ptr %b.addr
|
|
// CHECK: [[F1_ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 1
|
|
// CHECK: [[Y:%.*]] = load i32, ptr %y.addr, align 4
|
|
// CHECK: [[CONV:%.*]] = sext i32 [[Y]] to i64
|
|
// CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr [[F1_ADDR]] to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 23674)
|
|
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[CONV]], i32 1, i64 [[BLENDED]])
|
|
b->f2 = 0;
|
|
// CHECK: [[B:%.*]] = load ptr, ptr %b.addr
|
|
// CHECK: [[F2_ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 2
|
|
// CHECK: store i64 0, ptr [[F2_ADDR]]
|
|
}
|
|
|
|
// CHECK-LABEL: define i64 @test_get_A
|
|
__INTPTR_TYPE__ test_get_A(struct A *a) {
|
|
return a->f0 + a->f1 + a->f2;
|
|
// CHECK: [[A:%.*]] = load ptr, ptr %a.addr
|
|
// CHECK: [[F0_ADDR:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 0
|
|
// CHECK: [[F0:%.*]] = load i64, ptr [[F0_ADDR]]
|
|
// CHECK: [[AUTH:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[F0]], i32 1, i64 431)
|
|
// CHECK: [[A:%.*]] = load ptr, ptr %a.addr
|
|
// CHECK: [[F1_ADDR:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 1
|
|
// CHECK: [[F1:%.*]] = load i64, ptr [[F1_ADDR]]
|
|
// CHECK: [[AUTH:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[F1]], i32 1, i64 9182)
|
|
// CHECK: [[A:%.*]] = load ptr, ptr %a.addr
|
|
// CHECK: [[F2_ADDR:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 2
|
|
// CHECK: [[F2:%.*]] = load i64, ptr [[F2_ADDR]]
|
|
// CHECK: [[AUTH:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[F2]], i32 1, i64 783)
|
|
}
|
|
|
|
// CHECK-LABEL: define i64 @test_get_B
|
|
__INTPTR_TYPE__ test_get_B(struct B *b) {
|
|
return b->f0 + b->f1 + b->f2;
|
|
// CHECK: [[B:%.*]] = load ptr, ptr %b.addr
|
|
// CHECK: [[F0:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 0
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr [[F0]]
|
|
// CHECK: [[CASTF0:%.*]] = ptrtoint ptr %f0 to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTF0]], i64 1276)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[B:%.*]] = load ptr, ptr %b.addr
|
|
// CHECK: [[ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 1
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr [[ADDR]]
|
|
// CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr [[ADDR]] to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 23674)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[B:%.*]] = load ptr, ptr %b.addr
|
|
// CHECK: [[ADDR:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 2
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr [[ADDR]]
|
|
// CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr [[ADDR]] to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 163)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test_resign
|
|
void test_resign(struct A* a, const struct B *b) {
|
|
a->f0 = b->f0;
|
|
// CHECK: [[A:%.*]] = load ptr, ptr %a.addr, align 8
|
|
// CHECK: [[F0:%.*]] = getelementptr inbounds nuw %struct.A, ptr [[A]], i32 0, i32 0
|
|
// CHECK: [[B:%.*]] = load ptr, ptr %b.addr, align 8
|
|
// CHECK: [[F01:%.*]] = getelementptr inbounds nuw %struct.B, ptr [[B]], i32 0, i32 0
|
|
// CHECK: [[F01VALUE:%.*]] = load i64, ptr [[F01]]
|
|
// CHECK: [[CASTF01:%.*]] = ptrtoint ptr %f01 to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTF01]], i64 1276)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[F01VALUE]], i32 1, i64 [[BLENDED]], i32 1, i64 431)
|
|
}
|
|
|
|
// CHECK-LABEL: define i64 @other_test
|
|
__INTPTR_TYPE__ other_test(__INTPTR_TYPE__ i) {
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 42) j = 0;
|
|
// CHECK: [[J_ADDR:%.*]] = ptrtoint ptr %j to i64
|
|
// CHECK: store i64 0, ptr %j
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 43) k = 1234;
|
|
// CHECK: [[ADDR:%.*]] = ptrtoint ptr %k to i64
|
|
// CHECK: [[JBLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 43)
|
|
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 1234, i32 1, i64 [[JBLENDED]])
|
|
__INTPTR_TYPE__ __ptrauth(1, 1, 44) l = i;
|
|
// CHECK: [[I:%.*]] = load i64, ptr %i.addr
|
|
// CHECK: [[ADDR:%.*]] = ptrtoint ptr %l to i64
|
|
// CHECK: [[LBLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 44)
|
|
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[I]], i32 1, i64 [[LBLENDED]])
|
|
asm volatile ("" ::: "memory");
|
|
return j + k + l;
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr %j
|
|
// CHECK: [[CAST_ADDR:%.*]] = ptrtoint ptr %j to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST_ADDR]], i64 42)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr %k
|
|
// CHECK: [[CASTK:%.*]] = ptrtoint ptr %k to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTK]], i64 43)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
// CHECK: [[VALUE:%.*]] = load i64, ptr %l
|
|
// CHECK: [[CASTL:%.*]] = ptrtoint ptr %l to i64
|
|
// CHECK: [[BLENDED:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CASTL]], i64 44)
|
|
// CHECK: [[AUTHED:%.*]] = call i64 @llvm.ptrauth.auth(i64 [[VALUE]], i32 1, i64 [[BLENDED]])
|
|
}
|