blob: 427cdf8520095e237ddfa4ff97ee21d06bdadf41 [file] [log] [blame] [edit]
// RUN: %clang_cc1 -triple aarch64-linux -fexperimental-pointer-field-protection-abi -fexperimental-pointer-field-protection-tagged -emit-llvm -o - %s | FileCheck %s
struct S {
int* ptr;
private:
int private_data;
}; // Not Standard-layout, mixed access
// CHECK-LABEL: load_pointers
int* load_pointers(S *t) {
// CHECK: %t.addr = alloca ptr, align 8
// CHECK: store ptr %t, ptr %t.addr, align 8
// CHECK: %0 = load ptr, ptr %t.addr, align 8
// CHECK: %ptr = getelementptr inbounds nuw %struct.S, ptr %0, i32 0, i32 0
// CHECK: %1 = call ptr @llvm.protected.field.ptr.p0(ptr %ptr, i64 63261, i1 true) [ "deactivation-symbol"(ptr @__pfp_ds__ZTS1S.ptr) ]
// CHECK: %2 = load ptr, ptr %1, align 8
// CHECK: ret ptr %2
return t->ptr;
}
// CHECK-LABEL: store_pointers
void store_pointers(S* t, int* p) {
// CHECK: %t.addr = alloca ptr, align 8
// CHECK: %p.addr = alloca ptr, align 8
// CHECK: store ptr %t, ptr %t.addr, align 8
// CHECK: store ptr %p, ptr %p.addr, align 8
// CHECK: %0 = load ptr, ptr %p.addr, align 8
// CHECK: %1 = load ptr, ptr %t.addr, align 8
// CHECK: %ptr = getelementptr inbounds nuw %struct.S, ptr %1, i32 0, i32 0
// CHECK: %2 = call ptr @llvm.protected.field.ptr.p0(ptr %ptr, i64 63261, i1 true) [ "deactivation-symbol"(ptr @__pfp_ds__ZTS1S.ptr) ]
// CHECK: store ptr %0, ptr %2, align 8
t->ptr = p;
}