| // 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; | |
| } |