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