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