xref: /llvm-project/clang/test/CodeGenCXX/ptrauth-virtual-function.cpp (revision a1d77caaabbb5279b734c061dab36b2138ec476d)
1*a1d77caaSDaniil Kovalev // RUN: %clang_cc1 -triple arm64-apple-ios   -fptrauth-calls -emit-llvm -std=c++11 %s -o - | FileCheck --check-prefixes=CHECK,DARWIN %s
2*a1d77caaSDaniil Kovalev // RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-calls -emit-llvm -std=c++11 %s -o - | FileCheck --check-prefixes=CHECK,ELF    %s
31b8ab2f0SOliver Hunt 
41b8ab2f0SOliver Hunt // Check virtual function pointers in vtables are signed.
51b8ab2f0SOliver Hunt 
61b8ab2f0SOliver Hunt // CHECK: %[[CLASS_B1:.*]] = type { ptr }
71b8ab2f0SOliver Hunt 
81b8ab2f0SOliver Hunt // CHECK: @_ZTV2B1 = unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI2B1, ptr ptrauth (ptr @_ZN2B12m0Ev, i32 0, i64 58196, ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTV2B1, i32 0, i32 0, i32 2))] }, align 8
91b8ab2f0SOliver Hunt 
101b8ab2f0SOliver Hunt // CHECK: @g_B1 = global %class.B1 { ptr ptrauth (ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTV2B1, i32 0, i32 0, i32 2), i32 2) }, align 8
111b8ab2f0SOliver Hunt 
121b8ab2f0SOliver Hunt // CHECK: @_ZTV2B0 = unnamed_addr constant { [7 x ptr] } { [7 x ptr] [ptr null, ptr @_ZTI2B0,
131b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [7 x ptr] }, ptr @_ZTV2B0, i32 0, i32 0, i32 2)),
141b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [7 x ptr] }, ptr @_ZTV2B0, i32 0, i32 0, i32 3)),
151b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [7 x ptr] }, ptr @_ZTV2B0, i32 0, i32 0, i32 4)),
161b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B0D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [7 x ptr] }, ptr @_ZTV2B0, i32 0, i32 0, i32 5)),
171b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B0D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [7 x ptr] }, ptr @_ZTV2B0, i32 0, i32 0, i32 6))] }, align 8
181b8ab2f0SOliver Hunt 
191b8ab2f0SOliver Hunt // CHECK: @_ZTV2D0 = unnamed_addr constant { [9 x ptr] } { [9 x ptr] [ptr null, ptr @_ZTI2D0,
201b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D02m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 2)),
211b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTch0_h4_N2D02m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 3)),
221b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 4)),
231b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D0D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 5)),
241b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D0D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 6)),
251b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D02m1Ev, i32 0, i64 35045, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 7)),
261b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D02m3Ev, i32 0, i64 10565, ptr getelementptr inbounds ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 8))] }, align 8
271b8ab2f0SOliver Hunt 
281b8ab2f0SOliver Hunt // CHECK: @_ZTV2D1 = unnamed_addr constant { [8 x ptr] } { [8 x ptr] [ptr null, ptr @_ZTI2D1,
291b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D12m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 2)),
301b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTch0_h4_N2D12m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 3)),
311b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 4)),
321b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D1D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 5)),
331b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D1D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 6)),
341b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D12m1Ev, i32 0, i64 52864, ptr getelementptr inbounds ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 7))] }, align 8
351b8ab2f0SOliver Hunt 
361b8ab2f0SOliver Hunt // CHECK: @_ZTV2D2 = unnamed_addr constant { [9 x ptr], [8 x ptr] } { [9 x ptr] [ptr null, ptr @_ZTI2D2,
371b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D22m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 2)),
381b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTch0_h4_N2D22m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 3)),
391b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 4)),
401b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D2D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 5)),
411b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D2D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 6)),
421b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D22m1Ev, i32 0, i64 35045, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 7)),
431b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D22m3Ev, i32 0, i64 10565, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 8))],
441b8ab2f0SOliver Hunt // CHECK-SAME: [8 x ptr] [ptr inttoptr (i64 -16 to ptr), ptr @_ZTI2D2,
451b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D22m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 2)),
461b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTchn16_h4_N2D22m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 3)),
471b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 4)),
481b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D2D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 5)),
491b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D2D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 6)),
501b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D22m1Ev, i32 0, i64 52864, ptr getelementptr inbounds ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 7))] }, align 8
511b8ab2f0SOliver Hunt 
521b8ab2f0SOliver Hunt // CHECK: @_ZTV2D3 = unnamed_addr constant { [7 x ptr], [7 x ptr], [11 x ptr] } { [7 x ptr] [ptr inttoptr (i64 32 to ptr), ptr null, ptr @_ZTI2D3,
531b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D32m0Ev, i32 0, i64 44578, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 0, i32 3)),
541b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D32m1Ev, i32 0, i64 30766, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 0, i32 4)),
551b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D3D1Ev, i32 0, i64 57279, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 0, i32 5)),
561b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2D3D0Ev, i32 0, i64 62452, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 0, i32 6))],
571b8ab2f0SOliver Hunt // CHECK-SAME: [7 x ptr] [ptr inttoptr (i64 16 to ptr), ptr inttoptr (i64 -16 to ptr), ptr @_ZTI2D3,
581b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D32m0Ev, i32 0, i64 49430, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 1, i32 3)),
591b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D32m1Ev, i32 0, i64 57119, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 1, i32 4)),
601b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D3D1Ev, i32 0, i64 60799, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 1, i32 5)),
611b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZThn16_N2D3D0Ev, i32 0, i64 52565, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 1, i32 6))],
621b8ab2f0SOliver Hunt // CHECK-SAME: [11 x ptr] [ptr inttoptr (i64 -32 to ptr), ptr null, ptr inttoptr (i64 -32 to ptr), ptr inttoptr (i64 -32 to ptr), ptr inttoptr (i64 -32 to ptr), ptr @_ZTI2D3,
631b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n24_N2D32m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 2, i32 6)),
641b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTcv0_n32_h4_N2D32m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 2, i32 7)),
651b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 2, i32 8)),
661b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n48_N2D3D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 2, i32 9)),
671b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n48_N2D3D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [7 x ptr], [7 x ptr], [11 x ptr] }, ptr @_ZTV2D3, i32 0, i32 2, i32 10))] }, align 8
681b8ab2f0SOliver Hunt 
691b8ab2f0SOliver Hunt // CHECK: @_ZTC2D30_2V0 = unnamed_addr constant { [7 x ptr], [11 x ptr] } { [7 x ptr] [ptr inttoptr (i64 32 to ptr), ptr null, ptr @_ZTI2V0,
701b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V02m0Ev, i32 0, i64 44578, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 0, i32 3)),
711b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V02m1Ev, i32 0, i64 30766, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 0, i32 4)),
721b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V0D1Ev, i32 0, i64 57279, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 0, i32 5)),
731b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V0D0Ev, i32 0, i64 62452, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 0, i32 6))],
741b8ab2f0SOliver Hunt // CHECK-SAME: [11 x ptr] [ptr inttoptr (i64 -32 to ptr), ptr null, ptr inttoptr (i64 -32 to ptr), ptr inttoptr (i64 -32 to ptr), ptr inttoptr (i64 -32 to ptr), ptr @_ZTI2V0,
751b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n24_N2V02m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 1, i32 6)),
761b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTcv0_n32_h4_N2V02m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 1, i32 7)),
771b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 1, i32 8)),
781b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n48_N2V0D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 1, i32 9)),
791b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n48_N2V0D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D30_2V0, i32 0, i32 1, i32 10))] }, align 8
801b8ab2f0SOliver Hunt 
811b8ab2f0SOliver Hunt // CHECK: @_ZTC2D316_2V1 = unnamed_addr constant { [7 x ptr], [11 x ptr] } { [7 x ptr] [ptr inttoptr (i64 16 to ptr), ptr null, ptr @_ZTI2V1,
821b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V12m0Ev, i32 0, i64 49430, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 0, i32 3)),
831b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V12m1Ev, i32 0, i64 57119, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 0, i32 4)),
841b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V1D1Ev, i32 0, i64 60799, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 0, i32 5)),
851b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2V1D0Ev, i32 0, i64 52565, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 0, i32 6))],
861b8ab2f0SOliver Hunt // CHECK-SAME: [11 x ptr] [ptr inttoptr (i64 -16 to ptr), ptr null, ptr inttoptr (i64 -16 to ptr), ptr inttoptr (i64 -16 to ptr), ptr inttoptr (i64 -16 to ptr), ptr @_ZTI2V1,
871b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n24_N2V12m0Ev, i32 0, i64 53119, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 1, i32 6)),
881b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTcv0_n32_h4_N2V12m1Ev, i32 0, i64 15165, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 1, i32 7)),
891b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZN2B02m2Ev, i32 0, i64 43073, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 1, i32 8)),
901b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n48_N2V1D1Ev, i32 0, i64 25525, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 1, i32 9)),
911b8ab2f0SOliver Hunt // CHECK-SAME: ptr ptrauth (ptr @_ZTv0_n48_N2V1D0Ev, i32 0, i64 21295, ptr getelementptr inbounds ({ [7 x ptr], [11 x ptr] }, ptr @_ZTC2D316_2V1, i32 0, i32 1, i32 10))] }, align 8
921b8ab2f0SOliver Hunt 
931b8ab2f0SOliver Hunt 
941b8ab2f0SOliver Hunt struct S0 {
951b8ab2f0SOliver Hunt   int f;
961b8ab2f0SOliver Hunt };
971b8ab2f0SOliver Hunt 
981b8ab2f0SOliver Hunt struct S1 {
991b8ab2f0SOliver Hunt   int f;
1001b8ab2f0SOliver Hunt };
1011b8ab2f0SOliver Hunt 
1021b8ab2f0SOliver Hunt struct S2 : S0, S1 {
1031b8ab2f0SOliver Hunt   int f;
1041b8ab2f0SOliver Hunt };
1051b8ab2f0SOliver Hunt 
1061b8ab2f0SOliver Hunt class B0 {
1071b8ab2f0SOliver Hunt public:
1081b8ab2f0SOliver Hunt   virtual void m0();
1091b8ab2f0SOliver Hunt   virtual S1 *m1();
1101b8ab2f0SOliver Hunt   virtual void m2();
1111b8ab2f0SOliver Hunt   virtual ~B0();
1121b8ab2f0SOliver Hunt   int f;
1131b8ab2f0SOliver Hunt };
1141b8ab2f0SOliver Hunt 
1151b8ab2f0SOliver Hunt class B1 {
1161b8ab2f0SOliver Hunt public:
1171b8ab2f0SOliver Hunt   virtual void m0();
1181b8ab2f0SOliver Hunt };
1191b8ab2f0SOliver Hunt 
1201b8ab2f0SOliver Hunt class D0 : public B0 {
1211b8ab2f0SOliver Hunt public:
1221b8ab2f0SOliver Hunt   void m0() override;
1231b8ab2f0SOliver Hunt   S2 *m1() override;
1241b8ab2f0SOliver Hunt   virtual void m3();
1251b8ab2f0SOliver Hunt   int f;
1261b8ab2f0SOliver Hunt };
1271b8ab2f0SOliver Hunt 
1281b8ab2f0SOliver Hunt class D1 : public B0 {
1291b8ab2f0SOliver Hunt public:
1301b8ab2f0SOliver Hunt   void m0() override;
1311b8ab2f0SOliver Hunt   S2 *m1() override;
1321b8ab2f0SOliver Hunt   int f;
1331b8ab2f0SOliver Hunt };
1341b8ab2f0SOliver Hunt 
1351b8ab2f0SOliver Hunt class D2 : public D0, public D1 {
1361b8ab2f0SOliver Hunt public:
1371b8ab2f0SOliver Hunt   void m0() override;
1381b8ab2f0SOliver Hunt   S2 *m1() override;
1391b8ab2f0SOliver Hunt   void m3() override;
1401b8ab2f0SOliver Hunt   int f;
1411b8ab2f0SOliver Hunt };
1421b8ab2f0SOliver Hunt 
1431b8ab2f0SOliver Hunt class V0 : public virtual B0 {
1441b8ab2f0SOliver Hunt public:
1451b8ab2f0SOliver Hunt   void m0() override;
1461b8ab2f0SOliver Hunt   S2 *m1() override;
1471b8ab2f0SOliver Hunt   int f;
1481b8ab2f0SOliver Hunt };
1491b8ab2f0SOliver Hunt 
1501b8ab2f0SOliver Hunt class V1 : public virtual B0 {
1511b8ab2f0SOliver Hunt public:
1521b8ab2f0SOliver Hunt   void m0() override;
1531b8ab2f0SOliver Hunt   S2 *m1() override;
1541b8ab2f0SOliver Hunt   ~V1();
1551b8ab2f0SOliver Hunt   int f;
1561b8ab2f0SOliver Hunt };
1571b8ab2f0SOliver Hunt 
1581b8ab2f0SOliver Hunt class D3 : public V0, public V1 {
1591b8ab2f0SOliver Hunt public:
1601b8ab2f0SOliver Hunt   void m0() override;
1611b8ab2f0SOliver Hunt   S2 *m1() override;
1621b8ab2f0SOliver Hunt   int f;
1631b8ab2f0SOliver Hunt };
1641b8ab2f0SOliver Hunt 
1651b8ab2f0SOliver Hunt B1 g_B1;
1661b8ab2f0SOliver Hunt 
1671b8ab2f0SOliver Hunt void B0::m0() {}
1681b8ab2f0SOliver Hunt 
1691b8ab2f0SOliver Hunt void B1::m0() {}
1701b8ab2f0SOliver Hunt 
1711b8ab2f0SOliver Hunt void D0::m0() {}
1721b8ab2f0SOliver Hunt 
1731b8ab2f0SOliver Hunt void D1::m0() {}
1741b8ab2f0SOliver Hunt 
1751b8ab2f0SOliver Hunt void D2::m0() {}
1761b8ab2f0SOliver Hunt 
1771b8ab2f0SOliver Hunt void D3::m0() {}
1781b8ab2f0SOliver Hunt 
1791b8ab2f0SOliver Hunt V1::~V1() {
1801b8ab2f0SOliver Hunt   m1();
1811b8ab2f0SOliver Hunt }
1821b8ab2f0SOliver Hunt 
1831b8ab2f0SOliver Hunt // Check sign/authentication of vtable pointers and authentication of virtual
1841b8ab2f0SOliver Hunt // functions.
1851b8ab2f0SOliver Hunt 
186*a1d77caaSDaniil Kovalev // DARWIN-LABEL: define noundef ptr @_ZN2V1D2Ev(
187*a1d77caaSDaniil Kovalev // ELF-LABEL:    define dso_local void @_ZN2V1D2Ev(
1881b8ab2f0SOliver Hunt // CHECK: %[[THIS1:.*]] = load ptr, ptr %{{.*}}
1891b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = load ptr, ptr %{{.*}}
1901b8ab2f0SOliver Hunt // CHECK: %[[T1:[0-9]+]] = ptrtoint ptr %[[T0]] to i64
1911b8ab2f0SOliver Hunt // CHECK: %[[T2:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T1]], i32 2, i64 0)
1921b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = inttoptr i64 %[[T2]] to ptr
1931b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[T3]] to i64
1941b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 %[[T6]], i32 2, i64 0)
1951b8ab2f0SOliver Hunt // CHECK: %[[SIGNED_VTADDR:[0-9]+]] = inttoptr i64 %[[T7]] to ptr
1961b8ab2f0SOliver Hunt // CHECK: store ptr %[[SIGNED_VTADDR]], ptr %[[THIS1]]
1971b8ab2f0SOliver Hunt 
198*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testB0m0P2B0(
1991b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2001b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2011b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2021b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2031b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 0
2041b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2051b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2061b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 53119)
2071b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2081b8ab2f0SOliver Hunt 
2091b8ab2f0SOliver Hunt void testB0m0(B0 *a) {
2101b8ab2f0SOliver Hunt   a->m0();
2111b8ab2f0SOliver Hunt }
2121b8ab2f0SOliver Hunt 
213*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testB0m1P2B0(
2141b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2151b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2161b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2171b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2181b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 1
2191b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2201b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2211b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 15165)
2221b8ab2f0SOliver Hunt // CHECK: call noundef ptr %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2231b8ab2f0SOliver Hunt 
2241b8ab2f0SOliver Hunt void testB0m1(B0 *a) {
2251b8ab2f0SOliver Hunt   a->m1();
2261b8ab2f0SOliver Hunt }
2271b8ab2f0SOliver Hunt 
228*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testB0m2P2B0(
2291b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2301b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2311b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2321b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2331b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 2
2341b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2351b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2361b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 43073)
2371b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2381b8ab2f0SOliver Hunt 
2391b8ab2f0SOliver Hunt void testB0m2(B0 *a) {
2401b8ab2f0SOliver Hunt   a->m2();
2411b8ab2f0SOliver Hunt }
2421b8ab2f0SOliver Hunt 
243*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD0m0P2D0(
2441b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2451b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2461b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2471b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2481b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 0
2491b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2501b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2511b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 53119)
2521b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(16) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2531b8ab2f0SOliver Hunt 
2541b8ab2f0SOliver Hunt void testD0m0(D0 *a) {
2551b8ab2f0SOliver Hunt   a->m0();
2561b8ab2f0SOliver Hunt }
2571b8ab2f0SOliver Hunt 
258*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD0m1P2D0(
2591b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2601b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2611b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2621b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2631b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 5
2641b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2651b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2661b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 35045)
2671b8ab2f0SOliver Hunt // CHECK: call noundef ptr %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(16) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2681b8ab2f0SOliver Hunt 
2691b8ab2f0SOliver Hunt void testD0m1(D0 *a) {
2701b8ab2f0SOliver Hunt   a->m1();
2711b8ab2f0SOliver Hunt }
2721b8ab2f0SOliver Hunt 
273*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD0m2P2D0(
2741b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2751b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2761b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2771b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2781b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 2
2791b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2801b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2811b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 43073)
2821b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2831b8ab2f0SOliver Hunt 
2841b8ab2f0SOliver Hunt void testD0m2(D0 *a) {
2851b8ab2f0SOliver Hunt   a->m2();
2861b8ab2f0SOliver Hunt }
2871b8ab2f0SOliver Hunt 
288*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD0m3P2D0(
2891b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
2901b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
2911b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
2921b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
2931b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 6
2941b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
2951b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
2961b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 10565)
2971b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(16) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
2981b8ab2f0SOliver Hunt 
2991b8ab2f0SOliver Hunt void testD0m3(D0 *a) {
3001b8ab2f0SOliver Hunt   a->m3();
3011b8ab2f0SOliver Hunt }
3021b8ab2f0SOliver Hunt 
3031b8ab2f0SOliver Hunt 
304*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD1m0P2D1(
3051b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
3061b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
3071b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
3081b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
3091b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 0
3101b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
3111b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
3121b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 53119)
3131b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(16) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
3141b8ab2f0SOliver Hunt 
3151b8ab2f0SOliver Hunt void testD1m0(D1 *a) {
3161b8ab2f0SOliver Hunt   a->m0();
3171b8ab2f0SOliver Hunt }
3181b8ab2f0SOliver Hunt 
319*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD1m1P2D1(
3201b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
3211b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
3221b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
3231b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
3241b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 5
3251b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
3261b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
3271b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 52864)
3281b8ab2f0SOliver Hunt // CHECK: call noundef ptr %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(16) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
3291b8ab2f0SOliver Hunt 
3301b8ab2f0SOliver Hunt void testD1m1(D1 *a) {
3311b8ab2f0SOliver Hunt   a->m1();
3321b8ab2f0SOliver Hunt }
3331b8ab2f0SOliver Hunt 
334*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD1m2P2D1(
3351b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
3361b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
3371b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
3381b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
3391b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 2
3401b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
3411b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
3421b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 43073)
3431b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
3441b8ab2f0SOliver Hunt 
3451b8ab2f0SOliver Hunt void testD1m2(D1 *a) {
3461b8ab2f0SOliver Hunt   a->m2();
3471b8ab2f0SOliver Hunt }
3481b8ab2f0SOliver Hunt 
3491b8ab2f0SOliver Hunt 
350*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD2m0P2D2(
3511b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
3521b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
3531b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
3541b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
3551b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 0
3561b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
3571b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
3581b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 53119)
3591b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(36) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
3601b8ab2f0SOliver Hunt 
3611b8ab2f0SOliver Hunt void testD2m0(D2 *a) {
3621b8ab2f0SOliver Hunt   a->m0();
3631b8ab2f0SOliver Hunt }
3641b8ab2f0SOliver Hunt 
365*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD2m1P2D2(
3661b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
3671b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
3681b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
3691b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
3701b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 5
3711b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
3721b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
3731b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 35045)
3741b8ab2f0SOliver Hunt // CHECK: call noundef ptr %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(36) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
3751b8ab2f0SOliver Hunt 
3761b8ab2f0SOliver Hunt void testD2m1(D2 *a) {
3771b8ab2f0SOliver Hunt   a->m1();
3781b8ab2f0SOliver Hunt }
3791b8ab2f0SOliver Hunt 
380*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z10testD2m2D0P2D2(
3811b8ab2f0SOliver Hunt // CHECK: call void @_ZN2B02m2Ev(ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}){{$}}
3821b8ab2f0SOliver Hunt 
3831b8ab2f0SOliver Hunt void testD2m2D0(D2 *a) {
3841b8ab2f0SOliver Hunt   a->D0::m2();
3851b8ab2f0SOliver Hunt }
3861b8ab2f0SOliver Hunt 
387*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z10testD2m2D1P2D2(
3881b8ab2f0SOliver Hunt // CHECK: call void @_ZN2B02m2Ev(ptr noundef nonnull align {{[0-9]+}} dereferenceable(12) %{{.*}}){{$}}
3891b8ab2f0SOliver Hunt 
3901b8ab2f0SOliver Hunt void testD2m2D1(D2 *a) {
3911b8ab2f0SOliver Hunt   a->D1::m2();
3921b8ab2f0SOliver Hunt }
3931b8ab2f0SOliver Hunt 
394*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD2m3P2D2(
3951b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
3961b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
3971b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
3981b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
3991b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 6
4001b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
4011b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
4021b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 10565)
4031b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(36) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
4041b8ab2f0SOliver Hunt 
4051b8ab2f0SOliver Hunt void testD2m3(D2 *a) {
4061b8ab2f0SOliver Hunt   a->m3();
4071b8ab2f0SOliver Hunt }
4081b8ab2f0SOliver Hunt 
409*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD3m0P2D3(
4101b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
4111b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
4121b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
4131b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
4141b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 0
4151b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
4161b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
4171b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 44578)
4181b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
4191b8ab2f0SOliver Hunt 
4201b8ab2f0SOliver Hunt void testD3m0(D3 *a) {
4211b8ab2f0SOliver Hunt   a->m0();
4221b8ab2f0SOliver Hunt }
4231b8ab2f0SOliver Hunt 
424*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z8testD3m1P2D3(
4251b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %{{.*}}
4261b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
4271b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T0]], i32 2, i64 0)
4281b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
4291b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 1
4301b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
4311b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
4321b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 30766)
4331b8ab2f0SOliver Hunt // CHECK: call noundef ptr %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) [ "ptrauth"(i32 0, i64 %[[T7]]) ]
4341b8ab2f0SOliver Hunt 
4351b8ab2f0SOliver Hunt void testD3m1(D3 *a) {
4361b8ab2f0SOliver Hunt   a->m1();
4371b8ab2f0SOliver Hunt }
4381b8ab2f0SOliver Hunt 
439*a1d77caaSDaniil Kovalev // CHECK: define{{.*}} void @_Z8testD3m2P2D3(ptr noundef %[[A:.*]])
4401b8ab2f0SOliver Hunt // CHECK: %[[A_ADDR:.*]] = alloca ptr, align 8
4411b8ab2f0SOliver Hunt // CHECK: store ptr %[[A]], ptr %[[A_ADDR]], align 8
4421b8ab2f0SOliver Hunt // CHECK: %[[V0:.*]] = load ptr, ptr %[[A_ADDR]], align 8
4431b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:.*]] = load ptr, ptr %[[V0]], align 8
4441b8ab2f0SOliver Hunt // CHECK: %[[V1:.*]] = ptrtoint ptr %[[VTABLE]] to i64
4451b8ab2f0SOliver Hunt // CHECK: %[[V2:.*]] = call i64 @llvm.ptrauth.auth(i64 %[[V1]], i32 2, i64 0)
4461b8ab2f0SOliver Hunt // CHECK: %[[V3:.*]] = inttoptr i64 %[[V2]] to ptr
4471b8ab2f0SOliver Hunt // CHECK: %[[VBASE_OFFSET_PTR:.*]] = getelementptr i8, ptr %[[V3]], i64 -24
4481b8ab2f0SOliver Hunt // CHECK: %[[VBASE_OFFSET:.*]] = load i64, ptr %[[VBASE_OFFSET_PTR]], align 8
4491b8ab2f0SOliver Hunt // CHECK: %[[ADD_PTR:.*]] = getelementptr inbounds i8, ptr %[[V0]], i64 %[[VBASE_OFFSET]]
4501b8ab2f0SOliver Hunt // CHECK: %[[VTABLE1:.*]] = load ptr, ptr %[[ADD_PTR]], align 8
4511b8ab2f0SOliver Hunt // CHECK: %[[V4:.*]] = ptrtoint ptr %[[VTABLE1]] to i64
4521b8ab2f0SOliver Hunt // CHECK: %[[V5:.*]] = call i64 @llvm.ptrauth.auth(i64 %[[V4]], i32 2, i64 0)
4531b8ab2f0SOliver Hunt // CHECK: %[[V6:.*]] = inttoptr i64 %[[V5]] to ptr
4541b8ab2f0SOliver Hunt // CHECK: %[[VFN:.*]] = getelementptr inbounds ptr, ptr %[[V6]], i64 2
4551b8ab2f0SOliver Hunt // CHECK: %[[V7:.*]] = load ptr, ptr %[[VFN]], align 8
4561b8ab2f0SOliver Hunt // CHECK: %[[V8:.*]] = ptrtoint ptr %[[VFN]] to i64
4571b8ab2f0SOliver Hunt // CHECK: %[[V9:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[V8]], i64 43073)
4581b8ab2f0SOliver Hunt // CHECK: call void %[[V7]](ptr noundef nonnull align 8 dereferenceable(12) %[[ADD_PTR]]) [ "ptrauth"(i32 0, i64 %[[V9]]) ]
4591b8ab2f0SOliver Hunt 
4601b8ab2f0SOliver Hunt void testD3m2(D3 *a) {
4611b8ab2f0SOliver Hunt   a->m2();
4621b8ab2f0SOliver Hunt }
4631b8ab2f0SOliver Hunt 
464*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z17testD3Destructor0P2D3(
4651b8ab2f0SOliver Hunt // CHECK: load ptr, ptr
4661b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:.*]] = load ptr, ptr %{{.*}}
4671b8ab2f0SOliver Hunt // CHECK: %[[T2:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
4681b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T2]], i32 2, i64 0)
4691b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
4701b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z]+]] = getelementptr inbounds ptr, ptr %[[T4]], i64 3
4711b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load ptr, ptr %[[VFN]]
4721b8ab2f0SOliver Hunt // CHECK: %[[T6:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
4731b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 62452)
4741b8ab2f0SOliver Hunt // CHECK: call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) #{{.*}} [ "ptrauth"(i32 0, i64 %[[T7]]) ]
4751b8ab2f0SOliver Hunt 
4761b8ab2f0SOliver Hunt void testD3Destructor0(D3 *a) {
4771b8ab2f0SOliver Hunt   delete a;
4781b8ab2f0SOliver Hunt }
4791b8ab2f0SOliver Hunt 
480*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z17testD3Destructor1P2D3(
4811b8ab2f0SOliver Hunt // CHECK: %[[T6:.*]] = load ptr, ptr %
4821b8ab2f0SOliver Hunt // CHECK: %[[VTABLE0:[a-z0-9]+]] = load ptr, ptr %
4831b8ab2f0SOliver Hunt // CHECK: %[[T2:[0-9]+]] = ptrtoint ptr %[[VTABLE0]] to i64
4841b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T2]], i32 2, i64 0)
4851b8ab2f0SOliver Hunt // CHECK: %[[T4:[0-9]+]] = inttoptr i64 %[[T3]] to ptr
4861b8ab2f0SOliver Hunt // CHECK: %[[COMPLETE_OFFSET_PTR:.*]] = getelementptr inbounds i64, ptr %[[T4]], i64 -2
4871b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = load i64, ptr %[[COMPLETE_OFFSET_PTR]]
4881b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = getelementptr inbounds i8, ptr %[[T6]], i64 %[[T5]]
4891b8ab2f0SOliver Hunt // CHECK: %[[VTABLE1:[a-z0-9]+]] = load ptr, ptr %[[T6]]
4901b8ab2f0SOliver Hunt // CHECK: %[[T9:[0-9]+]] = ptrtoint ptr %[[VTABLE1]] to i64
4911b8ab2f0SOliver Hunt // CHECK: %[[T10:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T9]], i32 2, i64 0)
4921b8ab2f0SOliver Hunt // CHECK: %[[T11:[0-9]+]] = inttoptr i64 %[[T10]] to ptr
4931b8ab2f0SOliver Hunt // CHECK: %[[VFN:[a-z0-9]+]] = getelementptr inbounds ptr, ptr %[[T11]], i64 2
4941b8ab2f0SOliver Hunt // CHECK: %[[T12:[0-9]+]] = load ptr, ptr %[[VFN]]
4951b8ab2f0SOliver Hunt // CHECK: %[[T13:[0-9]+]] = ptrtoint ptr %[[VFN]] to i64
4961b8ab2f0SOliver Hunt // CHECK: %[[T14:[0-9]+]] = call i64 @llvm.ptrauth.blend(i64 %[[T13]], i64 57279)
497*a1d77caaSDaniil Kovalev // DARWIN: %call = call noundef ptr %[[T12]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) #{{.*}} [ "ptrauth"(i32 0, i64 %[[T14]]) ]
498*a1d77caaSDaniil Kovalev // ELF:    call void %[[T12]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) #{{.*}} [ "ptrauth"(i32 0, i64 %[[T14]]) ]
4991b8ab2f0SOliver Hunt // CHECK: call void @_ZdlPv(ptr noundef %[[T7]])
5001b8ab2f0SOliver Hunt 
5011b8ab2f0SOliver Hunt void testD3Destructor1(D3 *a) {
5021b8ab2f0SOliver Hunt   ::delete a;
5031b8ab2f0SOliver Hunt }
5041b8ab2f0SOliver Hunt 
505*a1d77caaSDaniil Kovalev // CHECK-LABEL: define{{.*}} void @_Z17testD3Destructor2P2D3(
5061b8ab2f0SOliver Hunt // CHECK: load ptr, ptr
5071b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:.*]] = load ptr, ptr %
5081b8ab2f0SOliver Hunt // CHECK: %[[T2:.*]] = ptrtoint ptr %[[VTABLE]] to i64
5091b8ab2f0SOliver Hunt // CHECK: %[[T3:.*]] = call i64 @llvm.ptrauth.auth(i64 %[[T2]], i32 2, i64 0)
5101b8ab2f0SOliver Hunt // CHECK: %[[T4:.*]] = inttoptr i64 %[[T3]] to ptr
5111b8ab2f0SOliver Hunt // CHECK: %[[VFN:.*]] = getelementptr inbounds ptr, ptr %[[T4]], i64 2
5121b8ab2f0SOliver Hunt // CHECK: %[[T5:.*]] = load ptr, ptr %[[VFN]]
5131b8ab2f0SOliver Hunt // CHECK: %[[T6:.*]] = ptrtoint ptr %[[VFN]] to i64
5141b8ab2f0SOliver Hunt // CHECK: %[[T7:.*]] = call i64 @llvm.ptrauth.blend(i64 %[[T6]], i64 57279)
515*a1d77caaSDaniil Kovalev // DARWIN: %call = call noundef ptr %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) #{{.*}} [ "ptrauth"(i32 0, i64 %[[T7]]) ]
516*a1d77caaSDaniil Kovalev // ELF:    call void %[[T5]](ptr noundef nonnull align {{[0-9]+}} dereferenceable(32) %{{.*}}) #{{.*}} [ "ptrauth"(i32 0, i64 %[[T7]]) ]
5171b8ab2f0SOliver Hunt 
5181b8ab2f0SOliver Hunt void testD3Destructor2(D3 *a) {
5191b8ab2f0SOliver Hunt   a->~D3();
5201b8ab2f0SOliver Hunt }
5211b8ab2f0SOliver Hunt 
5221b8ab2f0SOliver Hunt void materializeConstructors() {
5231b8ab2f0SOliver Hunt   B0 B0;
5241b8ab2f0SOliver Hunt   B1 B1;
5251b8ab2f0SOliver Hunt   D0 D0;
5261b8ab2f0SOliver Hunt   D1 D1;
5271b8ab2f0SOliver Hunt   D2 D2;
5281b8ab2f0SOliver Hunt   D3 D3;
5291b8ab2f0SOliver Hunt   V0 V0;
5301b8ab2f0SOliver Hunt   V1 V1;
5311b8ab2f0SOliver Hunt }
5321b8ab2f0SOliver Hunt 
533*a1d77caaSDaniil Kovalev // DARWIN-LABEL: define linkonce_odr noundef ptr @_ZN2B0C2Ev(
534*a1d77caaSDaniil Kovalev // ELF-LABEL:    define linkonce_odr void @_ZN2B0C2Ev(
5351b8ab2f0SOliver Hunt // CHECK: %[[THIS:.*]] = load ptr, ptr %
5361b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr getelementptr inbounds inrange(-16, 40) ({ [7 x ptr] }, ptr @_ZTV2B0, i32 0, i32 0, i32 2) to i64), i32 2, i64 0)
5371b8ab2f0SOliver Hunt // CHECK: %[[SIGNED_VTADDR:[0-9]+]] = inttoptr i64 %[[T0]] to ptr
5381b8ab2f0SOliver Hunt // CHECK: store ptr %[[SIGNED_VTADDR]], ptr %[[THIS]]
5391b8ab2f0SOliver Hunt 
540*a1d77caaSDaniil Kovalev // DARWIN-LABEL: define linkonce_odr noundef ptr @_ZN2D0C2Ev(
541*a1d77caaSDaniil Kovalev // ELF-LABEL:    define linkonce_odr void @_ZN2D0C2Ev(
5421b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr getelementptr inbounds inrange(-16, 56) ({ [9 x ptr] }, ptr @_ZTV2D0, i32 0, i32 0, i32 2) to i64), i32 2, i64 0)
5431b8ab2f0SOliver Hunt // CHECK: %[[SIGNED_VTADDR:[0-9]+]] = inttoptr i64 %[[T0]] to ptr
5441b8ab2f0SOliver Hunt // CHECK: store ptr %[[SIGNED_VTADDR]], ptr %[[THIS]]
5451b8ab2f0SOliver Hunt 
546*a1d77caaSDaniil Kovalev // DARWIN-LABEL: define linkonce_odr noundef ptr @_ZN2D1C2Ev(
547*a1d77caaSDaniil Kovalev // ELF-LABEL:    define linkonce_odr void @_ZN2D1C2Ev(
5481b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr getelementptr inbounds inrange(-16, 48) ({ [8 x ptr] }, ptr @_ZTV2D1, i32 0, i32 0, i32 2) to i64), i32 2, i64 0)
5491b8ab2f0SOliver Hunt // CHECK: %[[SIGNED_VTADDR:[0-9]+]] = inttoptr i64 %[[T0]] to ptr
5501b8ab2f0SOliver Hunt // CHECK: store ptr %[[SIGNED_VTADDR]], ptr %[[THIS]]
5511b8ab2f0SOliver Hunt 
552*a1d77caaSDaniil Kovalev // DARWIN-LABEL: define linkonce_odr noundef ptr @_ZN2D2C2Ev(
553*a1d77caaSDaniil Kovalev // ELF-LABEL:    define linkonce_odr void @_ZN2D2C2Ev(
5541b8ab2f0SOliver Hunt // CHECK: %[[SLOT0:.*]] = load ptr, ptr
5551b8ab2f0SOliver Hunt // CHECK: %[[SIGN_VTADDR0:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr getelementptr inbounds inrange(-16, 56) ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 0, i32 2) to i64), i32 2, i64 0)
5561b8ab2f0SOliver Hunt // CHECK: %[[T1:[0-9]+]] = inttoptr i64 %[[SIGN_VTADDR0]] to ptr
5571b8ab2f0SOliver Hunt // CHECK: store ptr %[[T1]], ptr %[[SLOT0]]
5581b8ab2f0SOliver Hunt // CHECK: %[[T3:[a-z0-9.]+]] = getelementptr inbounds i8, ptr %[[SLOT0]], i64 16
5591b8ab2f0SOliver Hunt // CHECK: %[[SIGN_VTADDR1:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr getelementptr inbounds inrange(-16, 48) ({ [9 x ptr], [8 x ptr] }, ptr @_ZTV2D2, i32 0, i32 1, i32 2) to i64), i32 2, i64 0)
5601b8ab2f0SOliver Hunt // CHECK: %[[T5:[0-9]+]] = inttoptr i64 %[[SIGN_VTADDR1]] to ptr
5611b8ab2f0SOliver Hunt // CHECK: store ptr %[[T5]], ptr %[[T3]]
5621b8ab2f0SOliver Hunt 
563*a1d77caaSDaniil Kovalev // DARWIN-LABEL: define linkonce_odr noundef ptr @_ZN2V0C2Ev(
564*a1d77caaSDaniil Kovalev // ELF-LABEL:    define linkonce_odr void @_ZN2V0C2Ev(
5651b8ab2f0SOliver Hunt // CHECK: %[[THIS1]] = load ptr, ptr %
5661b8ab2f0SOliver Hunt // CHECK: %[[VTT:[a-z0-9]+]] = load ptr, ptr %{{.*}}
5671b8ab2f0SOliver Hunt // CHECK: %[[T0:[0-9]+]] = load ptr, ptr %[[VTT]]
5681b8ab2f0SOliver Hunt // CHECK: %[[T1:[0-9]+]] = ptrtoint ptr %[[T0]] to i64
5691b8ab2f0SOliver Hunt // CHECK: %[[T2:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T1]], i32 2, i64 0)
5701b8ab2f0SOliver Hunt // CHECK: %[[T3:[0-9]+]] = inttoptr i64 %[[T2]] to ptr
5711b8ab2f0SOliver Hunt // CHECK: %[[VTADDR0:[0-9]+]] = ptrtoint ptr %[[T3]] to i64
5721b8ab2f0SOliver Hunt // CHECK: %[[T7:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 %[[VTADDR0]], i32 2, i64 0)
5731b8ab2f0SOliver Hunt // CHECK: %[[SIGN_VTADDR0:[0-9]+]] = inttoptr i64 %[[T7]] to ptr
5741b8ab2f0SOliver Hunt // CHECK: store ptr %[[SIGN_VTADDR0]], ptr %[[SLOT0]]
5751b8ab2f0SOliver Hunt // CHECK: %[[T9:[0-9]+]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 1
5761b8ab2f0SOliver Hunt // CHECK: %[[T10:[0-9]+]] = load ptr, ptr %[[T9]]
5771b8ab2f0SOliver Hunt // CHECK: %[[T11:[0-9]+]] = ptrtoint ptr %[[T10]] to i64
5781b8ab2f0SOliver Hunt // CHECK: %[[T12:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T11]], i32 2, i64 0)
5791b8ab2f0SOliver Hunt // CHECK: %[[T13:[0-9]+]] = inttoptr i64 %[[T12]] to ptr
5801b8ab2f0SOliver Hunt // CHECK: %[[VTABLE:[a-z]+]] = load ptr, ptr %[[THIS1]]
5811b8ab2f0SOliver Hunt // CHECK: %[[T15:[0-9]+]] = ptrtoint ptr %[[VTABLE]] to i64
5821b8ab2f0SOliver Hunt // CHECK: %[[T16:[0-9]+]] = call i64 @llvm.ptrauth.auth(i64 %[[T15]], i32 2, i64 0)
5831b8ab2f0SOliver Hunt // CHECK: %[[T17:[0-9]+]] = inttoptr i64 %[[T16]] to ptr
5841b8ab2f0SOliver Hunt // CHECK: %[[VBASE_OFFSET_PTR:[a-z.]+]] = getelementptr i8, ptr %[[T17]], i64 -24
5851b8ab2f0SOliver Hunt // CHECK: %[[VBASE_OFFSET:[a-z.]+]] = load i64, ptr %[[VBASE_OFFSET_PTR]]
5861b8ab2f0SOliver Hunt // CHECK: %[[T20:[a-z.]+]] = getelementptr inbounds i8, ptr %[[THIS1]], i64 %[[VBASE_OFFSET]]
5871b8ab2f0SOliver Hunt // CHECK: %[[VTADDR1:[0-9]+]] = ptrtoint ptr %[[T13]] to i64
5881b8ab2f0SOliver Hunt // CHECK: %[[T23:[0-9]+]] = call i64 @llvm.ptrauth.sign(i64 %[[VTADDR1]], i32 2, i64 0)
5891b8ab2f0SOliver Hunt // CHECK: %[[SIGN_VTADDR1:[0-9]+]] = inttoptr i64 %[[T23]] to ptr
5901b8ab2f0SOliver Hunt // CHECK: store ptr %[[SIGN_VTADDR1]], ptr %[[T20]]
591