557 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -fclangir -emit-cir %s -o %t.cir2// RUN: FileCheck --check-prefixes=CIR-NO-RTTI,CIR-COMMON --input-file=%t.cir %s3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -fclangir -emit-llvm %s -o %t-cir.ll4// RUN: FileCheck --check-prefixes=LLVM-NO-RTTI,LLVM-COMMON --input-file=%t-cir.ll %s5// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -emit-llvm %s -o %t.ll6// RUN: FileCheck --check-prefixes=OGCG-NO-RTTI,OGCG-COMMON --input-file=%t.ll %s7 8// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t-rtti.cir9// RUN: FileCheck --check-prefixes=CIR-RTTI,CIR-COMMON --input-file=%t-rtti.cir %s10// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir-rtti.ll11// RUN: FileCheck --check-prefixes=LLVM-RTTI,LLVM-COMMON --input-file=%t-cir-rtti.ll %s12// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t-rtti.ll13// RUN: FileCheck --check-prefixes=OGCG-RTTI,OGCG-COMMON --input-file=%t-rtti.ll %s14 15// Note: This test will be expanded to verify VTT emission and VTT implicit16// argument handling. For now, it's just test the record layout.17 18class A {19public:20 int a;21 virtual void v();22};23 24class B : public virtual A {25public:26 int b;27 virtual void w();28};29 30class C : public virtual A {31public:32 long c;33 virtual void x();34};35 36class D : public B, public C {37public:38 long d;39 D();40 virtual void y();41};42 43// This is just here to force the record types to be emitted.44void f(D *d) {}45 46// Trigger vtable and VTT emission for D.47void D::y() {}48 49// CIR-COMMON: !rec_A2Ebase = !cir.record<struct "A.base" packed {!cir.vptr, !s32i}>50// CIR-COMMON: !rec_B2Ebase = !cir.record<struct "B.base" packed {!cir.vptr, !s32i}>51// CIR-COMMON: !rec_C2Ebase = !cir.record<struct "C.base" {!cir.vptr, !s64i}>52// CIR-COMMON: !rec_A = !cir.record<class "A" packed padded {!cir.vptr, !s32i, !cir.array<!u8i x 4>}>53// CIR-COMMON: !rec_B = !cir.record<class "B" packed padded {!cir.vptr, !s32i, !cir.array<!u8i x 4>, !rec_A2Ebase, !cir.array<!u8i x 4>}>54// CIR-COMMON: !rec_C = !cir.record<class "C" {!cir.vptr, !s64i, !rec_A2Ebase}>55// CIR-COMMON: !rec_D = !cir.record<class "D" {!rec_B2Ebase, !rec_C2Ebase, !s64i, !rec_A2Ebase}>56 57// CIR-RTTI: ![[REC_TYPE_INFO_VTABLE:.*]]= !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !u32i, !u32i, !cir.ptr<!u8i>, !s64i, !cir.ptr<!u8i>, !s64i}>58// CIR-COMMON: ![[REC_D_VTABLE:.*]] = !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>, !cir.array<!cir.ptr<!u8i> x 4>, !cir.array<!cir.ptr<!u8i> x 4>}>59// CIR-COMMON: ![[REC_B_OR_C_IN_D_VTABLE:.*]]= !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 4>, !cir.array<!cir.ptr<!u8i> x 4>}>60 61// Vtable for D62 63// CIR-COMMON: cir.global{{.*}} @_ZTV1D = #cir.vtable<{64// CIR-COMMON-SAME: #cir.const_array<[65// CIR-COMMON-SAME: #cir.ptr<40 : i64> : !cir.ptr<!u8i>,66// CIR-COMMON-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,67// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,68// CIR-RTTI-SAME: #cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>,69// CIR-COMMON-SAME: #cir.global_view<@_ZN1B1wEv> : !cir.ptr<!u8i>,70// CIR-COMMON-SAME: #cir.global_view<@_ZN1D1yEv> : !cir.ptr<!u8i>71// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 5>,72// CIR-COMMON-SAME: #cir.const_array<[73// CIR-COMMON-SAME: #cir.ptr<24 : i64> : !cir.ptr<!u8i>,74// CIR-COMMON-SAME: #cir.ptr<-16 : i64> : !cir.ptr<!u8i>,75// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,76// CIR-RTTI-SAME: #cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>,77// CIR-COMMON-SAME: #cir.global_view<@_ZN1C1xEv> : !cir.ptr<!u8i>78// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>,79// CIR-COMMON-SAME: #cir.const_array<[80// CIR-COMMON-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,81// CIR-COMMON-SAME: #cir.ptr<-40 : i64> : !cir.ptr<!u8i>,82// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,83// CIR-RTTI-SAME: #cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>,84// CIR-COMMON-SAME: #cir.global_view<@_ZN1A1vEv> : !cir.ptr<!u8i>85// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>86// CIR-COMMON-SAME: }> : ![[REC_D_VTABLE]] {alignment = 8 : i64}87 88// LLVM-COMMON: @_ZTV1D = global { [5 x ptr], [4 x ptr], [4 x ptr] } {89// LLVM-NO-RTTI-SAME: [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr null, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv],90// LLVM-RTTI-SAME: [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr @_ZTI1D, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv],91// LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr inttoptr (i64 -16 to ptr), ptr null, ptr @_ZN1C1xEv],92// LLVM-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr inttoptr (i64 -16 to ptr), ptr @_ZTI1D, ptr @_ZN1C1xEv],93// LLVM-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr null, ptr @_ZN1A1vEv]94// LLVM-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr @_ZTI1D, ptr @_ZN1A1vEv]95// LLVM-COMMON-SAME: }, align 896 97// OGCG-COMMON: @_ZTV1D = unnamed_addr constant { [5 x ptr], [4 x ptr], [4 x ptr] } {98// OGCG-NO-RTTI-SAME: [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr null, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv],99// OGCG-RTTI-SAME: [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr @_ZTI1D, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv],100// OGCG-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr inttoptr (i64 -16 to ptr), ptr null, ptr @_ZN1C1xEv],101// OGCG-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr inttoptr (i64 -16 to ptr), ptr @_ZTI1D, ptr @_ZN1C1xEv],102// OGCG-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr null, ptr @_ZN1A1vEv]103// OGCG-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr @_ZTI1D, ptr @_ZN1A1vEv]104// OGCG-COMMON-SAME: }, align 8105 106// VTT for D107 108// CIR-COMMON: cir.global{{.*}} @_ZTT1D = #cir.const_array<[109// CIR-COMMON-SAME: #cir.global_view<@_ZTV1D, [0 : i32, 3 : i32]> : !cir.ptr<!u8i>,110// CIR-COMMON-SAME: #cir.global_view<@_ZTC1D0_1B, [0 : i32, 3 : i32]> : !cir.ptr<!u8i>,111// CIR-COMMON-SAME: #cir.global_view<@_ZTC1D0_1B, [1 : i32, 3 : i32]> : !cir.ptr<!u8i>,112// CIR-COMMON-SAME: #cir.global_view<@_ZTC1D16_1C, [0 : i32, 3 : i32]> : !cir.ptr<!u8i>,113// CIR-COMMON-SAME: #cir.global_view<@_ZTC1D16_1C, [1 : i32, 3 : i32]> : !cir.ptr<!u8i>,114// CIR-COMMON-SAME: #cir.global_view<@_ZTV1D, [2 : i32, 3 : i32]> : !cir.ptr<!u8i>,115// CIR-COMMON-SAME: #cir.global_view<@_ZTV1D, [1 : i32, 3 : i32]> : !cir.ptr<!u8i>116// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 7> {alignment = 8 : i64}117 118// LLVM-COMMON: @_ZTT1D = global [7 x ptr] [119// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 24),120// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D0_1B, i64 24),121// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D0_1B, i64 56),122// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D16_1C, i64 24),123// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D16_1C, i64 56),124// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 96),125// LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 64)126// LLVM-COMMON-SAME: ], align 8127 128// OGCG-COMMON: @_ZTT1D = unnamed_addr constant [7 x ptr] [129// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 16) ({ [5 x ptr], [4 x ptr], [4 x ptr] }, ptr @_ZTV1D, i32 0, i32 0, i32 3),130// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 8) ({ [4 x ptr], [4 x ptr] }, ptr @_ZTC1D0_1B, i32 0, i32 0, i32 3),131// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 8) ({ [4 x ptr], [4 x ptr] }, ptr @_ZTC1D0_1B, i32 0, i32 1, i32 3),132// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 8) ({ [4 x ptr], [4 x ptr] }, ptr @_ZTC1D16_1C, i32 0, i32 0, i32 3),133// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 8) ({ [4 x ptr], [4 x ptr] }, ptr @_ZTC1D16_1C, i32 0, i32 1, i32 3),134// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 8) ({ [5 x ptr], [4 x ptr], [4 x ptr] }, ptr @_ZTV1D, i32 0, i32 2, i32 3),135// OGCG-COMMON-SAME: ptr getelementptr inbounds inrange(-24, 8) ({ [5 x ptr], [4 x ptr], [4 x ptr] }, ptr @_ZTV1D, i32 0, i32 1, i32 3)136// OGCG-COMMON-SAME: ], align 8137 138// Construction vtable for B-in-D139 140// CIR-COMMON: cir.global{{.*}} @_ZTC1D0_1B = #cir.vtable<{141// CIR-COMMON-SAME: #cir.const_array<[142// CIR-COMMON-SAME: #cir.ptr<40 : i64> : !cir.ptr<!u8i>,143// CIR-COMMON-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,144// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,145// CIR-RTTI-SAME: #cir.global_view<@_ZTI1B> : !cir.ptr<!u8i>,146// CIR-COMMON-SAME: #cir.global_view<@_ZN1B1wEv> : !cir.ptr<!u8i>147// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>,148// CIR-COMMON-SAME: #cir.const_array<[149// CIR-COMMON-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,150// CIR-COMMON-SAME: #cir.ptr<-40 : i64> : !cir.ptr<!u8i>,151// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,152// CIR-RTTI-SAME: #cir.global_view<@_ZTI1B> : !cir.ptr<!u8i>,153// CIR-COMMON-SAME: #cir.global_view<@_ZN1A1vEv> : !cir.ptr<!u8i>154// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>155// CIR-COMMON-SAME: }> : ![[REC_B_OR_C_IN_D_VTABLE]]156 157// LLVM-COMMON: @_ZTC1D0_1B = global { [4 x ptr], [4 x ptr] } {158// LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr null, ptr @_ZN1B1wEv],159// LLVM-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr @_ZTI1B, ptr @_ZN1B1wEv],160// LLVM-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr null, ptr @_ZN1A1vEv]161// LLVM-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr @_ZTI1B, ptr @_ZN1A1vEv]162// LLVM-COMMON-SAME: }, align 8163 164// OGCG-COMMON: @_ZTC1D0_1B = unnamed_addr constant { [4 x ptr], [4 x ptr] } {165// OGCG-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr null, ptr @_ZN1B1wEv],166// OGCG-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr @_ZTI1B, ptr @_ZN1B1wEv],167// OGCG-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr null, ptr @_ZN1A1vEv]168// OGCG-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr @_ZTI1B, ptr @_ZN1A1vEv]169// OGCG-COMMON-SAME: }, align 8170 171// CIR-RTTI: cir.global{{.*}} @_ZTI1B : !cir.ptr<!u8i>172 173// LLVM-RTTI: @_ZTI1B = external constant ptr174 175// OGCG-RTTI: @_ZTI1B = external constant ptr176 177// Construction vtable for C-in-D178 179// CIR-COMMON: cir.global{{.*}} @_ZTC1D16_1C = #cir.vtable<{180// CIR-COMMON-SAME: #cir.const_array<[181// CIR-COMMON-SAME: #cir.ptr<24 : i64> : !cir.ptr<!u8i>,182// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,183// CIR-RTTI-SAME: #cir.global_view<@_ZTI1C> : !cir.ptr<!u8i>,184// CIR-COMMON-SAME: #cir.global_view<@_ZN1C1xEv> : !cir.ptr<!u8i>185// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>,186// CIR-COMMON-SAME: #cir.const_array<[187// CIR-COMMON-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,188// CIR-COMMON-SAME: #cir.ptr<-24 : i64> : !cir.ptr<!u8i>,189// CIR-NO-RTTI-SAME: #cir.ptr<null> : !cir.ptr<!u8i>,190// CIR-RTTI-SAME: #cir.global_view<@_ZTI1C> : !cir.ptr<!u8i>,191// CIR-COMMON-SAME: #cir.global_view<@_ZN1A1vEv> : !cir.ptr<!u8i>192// CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>}>193// CIR-COMMON-SAME: : ![[REC_B_OR_C_IN_D_VTABLE]]194 195// LLVM-COMMON: @_ZTC1D16_1C = global { [4 x ptr], [4 x ptr] } {196// LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr null, ptr @_ZN1C1xEv],197// LLVM-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr @_ZTI1C, ptr @_ZN1C1xEv],198// LLVM-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -24 to ptr), ptr null, ptr @_ZN1A1vEv]199// LLVM-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -24 to ptr), ptr @_ZTI1C, ptr @_ZN1A1vEv]200// LLVM-COMMON-SAME: }, align 8201 202// OGCG-COMMON: @_ZTC1D16_1C = unnamed_addr constant { [4 x ptr], [4 x ptr] } {203// OGCG-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr null, ptr @_ZN1C1xEv],204// OGCG-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr @_ZTI1C, ptr @_ZN1C1xEv],205// OGCG-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -24 to ptr), ptr null, ptr @_ZN1A1vEv]206// OGCG-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -24 to ptr), ptr @_ZTI1C, ptr @_ZN1A1vEv]207// OGCG-COMMON-SAME: }, align 8208 209// RTTI class type info for D210 211// CIR-RTTI: cir.globa{{.*}} @_ZTVN10__cxxabiv121__vmi_class_type_infoE : !cir.ptr<!cir.ptr<!u8i>>212 213// CIR-RTTI: cir.global{{.*}} @_ZTS1D = #cir.const_array<"1D" : !cir.array<!s8i x 2>> : !cir.array<!s8i x 2>214 215// CIR-RTTI: cir.global{{.*}} @_ZTI1D = #cir.typeinfo<{216// CIR-RTTI-SAME: #cir.global_view<@_ZTVN10__cxxabiv121__vmi_class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>,217// CIR-RTTI-SAME: #cir.global_view<@_ZTS1D> : !cir.ptr<!u8i>,218// CIR-RTTI-SAME: #cir.int<2> : !u32i, #cir.int<2> : !u32i,219// CIR-RTTI-SAME: #cir.global_view<@_ZTI1B> : !cir.ptr<!u8i>,220// CIR-RTTI-SAME: #cir.int<2> : !s64i,221// CIR-RTTI-SAME: #cir.global_view<@_ZTI1C> : !cir.ptr<!u8i>,222// CIR-RTTI-SAME: #cir.int<4098> : !s64i}> : !rec_anon_struct223 224// CIR-RTTI: cir.global{{.*}} @_ZTV1A : !rec_anon_struct3225 226// LLVM-RTTI: @_ZTVN10__cxxabiv121__vmi_class_type_infoE = external global ptr227// LLVM-RTTI: @_ZTS1D = global [2 x i8] c"1D", align 1228 229// LLVM-RTTI: @_ZTI1D = constant { ptr, ptr, i32, i32, ptr, i64, ptr, i64 } {230// LLVM-RTTI-SAME: ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 16),231// LLVM-RTTI-SAME: ptr @_ZTS1D, i32 2, i32 2, ptr @_ZTI1B, i64 2, ptr @_ZTI1C, i64 4098 }232 233// OGCG-RTTI: @_ZTI1D = constant { ptr, ptr, i32, i32, ptr, i64, ptr, i64 } {234// OGCG-RTTI-SAME: ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 2),235// OGCG-RTTI-SAME: ptr @_ZTS1D, i32 2, i32 2, ptr @_ZTI1B, i64 2, ptr @_ZTI1C, i64 4098 }, align 8236 237// OGCG-RTTI: @_ZTVN10__cxxabiv121__vmi_class_type_infoE = external global [0 x ptr]238// OGCG-RTTI: @_ZTS1D = constant [3 x i8] c"1D\00", align 1239// OGCG-RTTI: @_ZTV1A = external unnamed_addr constant { [3 x ptr] }, align 8240 241D::D() {}242 243// In CIR, this gets emitted after the B and C constructors. See below.244// Base (C2) constructor for D245 246// OGCG-COMMON: define {{.*}} void @_ZN1DC2Ev(ptr {{.*}} %[[THIS_ARG:.*]], ptr {{.*}} %[[VTT_ARG:.*]])247// OGCG-COMMON: %[[THIS_ADDR:.*]] = alloca ptr248// OGCG-COMMON: %[[VTT_ADDR:.*]] = alloca ptr249// OGCG-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]250// OGCG-COMMON: store ptr %[[VTT_ARG]], ptr %[[VTT_ADDR]]251// OGCG-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]252// OGCG-COMMON: %[[VTT:.*]] = load ptr, ptr %[[VTT_ADDR]]253// OGCG-COMMON: %[[B_VTT:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 1254// OGCG-COMMON: call void @_ZN1BC2Ev(ptr {{.*}} %[[THIS]], ptr {{.*}} %[[B_VTT]])255// OGCG-COMMON: %[[C_ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 16256// OGCG-COMMON: %[[C_VTT:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 3257// OGCG-COMMON: call void @_ZN1CC2Ev(ptr {{.*}} %[[C_ADDR]], ptr {{.*}} %[[C_VTT]])258// OGCG-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[VTT]]259// OGCG-COMMON: store ptr %[[VPTR]], ptr %[[THIS]]260// OGCG-COMMON: %[[D_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 5261// OGCG-COMMON: %[[D_VPTR:.*]] = load ptr, ptr %[[D_VPTR_ADDR]]262// OGCG-COMMON: %[[D_VPTR_ADDR2:.*]] = load ptr, ptr %[[THIS]]263// OGCG-COMMON: %[[BASE_OFFSET_ADDR:.*]] = getelementptr i8, ptr %[[D_VPTR_ADDR2]], i64 -24264// OGCG-COMMON: %[[BASE_OFFSET:.*]] = load i64, ptr %[[BASE_OFFSET_ADDR]]265// OGCG-COMMON: %[[BASE_PTR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 %[[BASE_OFFSET]]266// OGCG-COMMON: store ptr %[[D_VPTR]], ptr %[[BASE_PTR]]267// OGCG-COMMON: %[[C_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 6268// OGCG-COMMON: %[[C_VPTR:.*]] = load ptr, ptr %[[C_VPTR_ADDR]]269// OGCG-COMMON: %[[C_ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 16270// OGCG-COMMON: store ptr %[[C_VPTR]], ptr %[[C_ADDR]]271 272// Base (C2) constructor for B273 274// CIR-COMMON: cir.func {{.*}} @_ZN1BC2Ev275// CIR-COMMON-SAME: %[[THIS_ARG:.*]]: !cir.ptr<!rec_B>276// CIR-COMMON-SAME: %[[VTT_ARG:.*]]: !cir.ptr<!cir.ptr<!void>>277// CIR-COMMON: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]278// CIR-COMMON: %[[VTT_ADDR:.*]] = cir.alloca {{.*}} ["vtt", init]279// CIR-COMMON: cir.store %[[THIS_ARG]], %[[THIS_ADDR]]280// CIR-COMMON: cir.store %[[VTT_ARG]], %[[VTT_ADDR]]281// CIR-COMMON: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]282// CIR-COMMON: %[[VTT:.*]] = cir.load{{.*}} %[[VTT_ADDR]]283// CIR-COMMON: %[[VTT_ADDR_POINT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 0 -> !cir.ptr<!cir.ptr<!void>>284// CIR-COMMON: %[[VPTR_ADDR:.*]] = cir.cast bitcast %[[VTT_ADDR_POINT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>285// CIR-COMMON: %[[VPTR:.*]] = cir.load{{.*}} %[[VPTR_ADDR]]286// CIR-COMMON: %[[B_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]]287// CIR-COMMON: cir.store{{.*}} %[[VPTR]], %[[B_VPTR_ADDR]]288// CIR-COMMON: %[[B_VTT_ADDR_POINT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 1 -> !cir.ptr<!cir.ptr<!void>>289// CIR-COMMON: %[[B_VPTR_ADDR:.*]] = cir.cast bitcast %[[B_VTT_ADDR_POINT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>290// CIR-COMMON: %[[B_VPTR:.*]] = cir.load{{.*}} %[[B_VPTR_ADDR]]291// CIR-COMMON: %[[B_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]]292// CIR-COMMON: %[[VPTR:.*]] = cir.load{{.*}} %[[B_VPTR_ADDR]]293// CIR-COMMON: %[[VPTR_ADDR2:.*]] = cir.cast bitcast %[[VPTR]] : !cir.vptr -> !cir.ptr<!u8i>294// CIR-COMMON: %[[CONST_24:.*]] = cir.const #cir.int<-24>295// CIR-COMMON: %[[BASE_OFFSET_ADDR:.*]] = cir.ptr_stride %[[VPTR_ADDR2]], %[[CONST_24]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>296// CIR-COMMON: %[[BASE_OFFSET_PTR:.*]] = cir.cast bitcast %[[BASE_OFFSET_ADDR]] : !cir.ptr<!u8i> -> !cir.ptr<!s64i>297// CIR-COMMON: %[[BASE_OFFSET:.*]] = cir.load{{.*}} %[[BASE_OFFSET_PTR]] : !cir.ptr<!s64i>, !s64i298// CIR-COMMON: %[[THIS_PTR:.*]] = cir.cast bitcast %[[THIS]] : !cir.ptr<!rec_B> -> !cir.ptr<!u8i>299// CIR-COMMON: %[[BASE_PTR:.*]] = cir.ptr_stride %[[THIS_PTR]], %[[BASE_OFFSET]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>300// CIR-COMMON: %[[BASE_CAST:.*]] = cir.cast bitcast %[[BASE_PTR]] : !cir.ptr<!u8i> -> !cir.ptr<!rec_B>301// CIR-COMMON: %[[BASE_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[BASE_CAST]]302// CIR-COMMON: cir.store{{.*}} %[[B_VPTR]], %[[BASE_VPTR_ADDR]]303 304// LLVM-COMMON: define {{.*}} void @_ZN1BC2Ev(ptr %[[THIS_ARG:.*]], ptr %[[VTT_ARG:.*]])305// LLVM-COMMON: %[[THIS_ADDR:.*]] = alloca ptr306// LLVM-COMMON: %[[VTT_ADDR:.*]] = alloca ptr307// LLVM-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]308// LLVM-COMMON: store ptr %[[VTT_ARG]], ptr %[[VTT_ADDR]]309// LLVM-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]310// LLVM-COMMON: %[[VTT:.*]] = load ptr, ptr %[[VTT_ADDR]]311// LLVM-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[VTT]]312// LLVM-COMMON: store ptr %[[VPTR]], ptr %[[THIS]]313// LLVM-COMMON: %[[B_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i32 1314// LLVM-COMMON: %[[B_VPTR:.*]] = load ptr, ptr %[[B_VPTR_ADDR]]315// LLVM-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[THIS]]316// LLVM-COMMON: %[[BASE_OFFSET_ADDR:.*]] = getelementptr i8, ptr %[[VPTR]], i64 -24317// LLVM-COMMON: %[[BASE_OFFSET:.*]] = load i64, ptr %[[BASE_OFFSET_ADDR]]318// LLVM-COMMON: %[[BASE_PTR:.*]] = getelementptr i8, ptr %[[THIS]], i64 %[[BASE_OFFSET]]319// LLVM-COMMON: store ptr %[[B_VPTR]], ptr %[[BASE_PTR]]320 321// OGCG-COMMON: define {{.*}} void @_ZN1BC2Ev(ptr {{.*}} %[[THIS_ARG:.*]], ptr {{.*}} %[[VTT_ARG:.*]])322// OGCG-COMMON: %[[THIS_ADDR:.*]] = alloca ptr323// OGCG-COMMON: %[[VTT_ADDR:.*]] = alloca ptr324// OGCG-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]325// OGCG-COMMON: store ptr %[[VTT_ARG]], ptr %[[VTT_ADDR]]326// OGCG-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]327// OGCG-COMMON: %[[VTT:.*]] = load ptr, ptr %[[VTT_ADDR]]328// OGCG-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[VTT]]329// OGCG-COMMON: store ptr %[[VPTR]], ptr %[[THIS]]330// OGCG-COMMON: %[[B_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 1331// OGCG-COMMON: %[[B_VPTR:.*]] = load ptr, ptr %[[B_VPTR_ADDR]]332// OGCG-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[THIS]]333// OGCG-COMMON: %[[BASE_OFFSET_ADDR:.*]] = getelementptr i8, ptr %[[VPTR]], i64 -24334// OGCG-COMMON: %[[BASE_OFFSET:.*]] = load i64, ptr %[[BASE_OFFSET_ADDR]]335// OGCG-COMMON: %[[BASE_PTR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 %[[BASE_OFFSET]]336// OGCG-COMMON: store ptr %[[B_VPTR]], ptr %[[BASE_PTR]]337 338// Base (C2) constructor for C339 340// CIR-COMMON: cir.func {{.*}} @_ZN1CC2Ev341// CIR-COMMON-SAME: %[[THIS_ARG:.*]]: !cir.ptr<!rec_C>342// CIR-COMMON-SAME: %[[VTT_ARG:.*]]: !cir.ptr<!cir.ptr<!void>>343// CIR-COMMON: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]344// CIR-COMMON: %[[VTT_ADDR:.*]] = cir.alloca {{.*}} ["vtt", init]345// CIR-COMMON: cir.store %[[THIS_ARG]], %[[THIS_ADDR]]346// CIR-COMMON: cir.store %[[VTT_ARG]], %[[VTT_ADDR]]347// CIR-COMMON: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]348// CIR-COMMON: %[[VTT:.*]] = cir.load{{.*}} %[[VTT_ADDR]]349// CIR-COMMON: %[[VTT_ADDR_POINT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 0 -> !cir.ptr<!cir.ptr<!void>>350// CIR-COMMON: %[[VPTR_ADDR:.*]] = cir.cast bitcast %[[VTT_ADDR_POINT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>351// CIR-COMMON: %[[VPTR:.*]] = cir.load{{.*}} %[[VPTR_ADDR]]352// CIR-COMMON: %[[C_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]]353// CIR-COMMON: cir.store{{.*}} %[[VPTR]], %[[C_VPTR_ADDR]]354// CIR-COMMON: %[[C_VTT_ADDR_POINT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 1 -> !cir.ptr<!cir.ptr<!void>>355// CIR-COMMON: %[[C_VPTR_ADDR:.*]] = cir.cast bitcast %[[C_VTT_ADDR_POINT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>356// CIR-COMMON: %[[C_VPTR:.*]] = cir.load{{.*}} %[[C_VPTR_ADDR]]357// CIR-COMMON: %[[C_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]]358// CIR-COMMON: %[[VPTR:.*]] = cir.load{{.*}} %[[C_VPTR_ADDR]]359// CIR-COMMON: %[[VPTR_ADDR2:.*]] = cir.cast bitcast %[[VPTR]] : !cir.vptr -> !cir.ptr<!u8i>360// CIR-COMMON: %[[CONST_24:.*]] = cir.const #cir.int<-24>361// CIR-COMMON: %[[BASE_OFFSET_ADDR:.*]] = cir.ptr_stride %[[VPTR_ADDR2]], %[[CONST_24]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>362// CIR-COMMON: %[[BASE_OFFSET_PTR:.*]] = cir.cast bitcast %[[BASE_OFFSET_ADDR]] : !cir.ptr<!u8i> -> !cir.ptr<!s64i>363// CIR-COMMON: %[[BASE_OFFSET:.*]] = cir.load{{.*}} %[[BASE_OFFSET_PTR]] : !cir.ptr<!s64i>, !s64i364// CIR-COMMON: %[[THIS_PTR:.*]] = cir.cast bitcast %[[THIS]] : !cir.ptr<!rec_C> -> !cir.ptr<!u8i>365// CIR-COMMON: %[[BASE_PTR:.*]] = cir.ptr_stride %[[THIS_PTR]], %[[BASE_OFFSET]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>366// CIR-COMMON: %[[BASE_CAST:.*]] = cir.cast bitcast %[[BASE_PTR]] : !cir.ptr<!u8i> -> !cir.ptr<!rec_C>367// CIR-COMMON: %[[BASE_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[BASE_CAST]]368// CIR-COMMON: cir.store{{.*}} %[[C_VPTR]], %[[BASE_VPTR_ADDR]]369 370// LLVM-COMMON: define {{.*}} void @_ZN1CC2Ev(ptr %[[THIS_ARG:.*]], ptr %[[VTT_ARG:.*]])371// LLVM-COMMON: %[[THIS_ADDR:.*]] = alloca ptr372// LLVM-COMMON: %[[VTT_ADDR:.*]] = alloca ptr373// LLVM-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]374// LLVM-COMMON: store ptr %[[VTT_ARG]], ptr %[[VTT_ADDR]]375// LLVM-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]376// LLVM-COMMON: %[[VTT:.*]] = load ptr, ptr %[[VTT_ADDR]]377// LLVM-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[VTT]]378// LLVM-COMMON: store ptr %[[VPTR]], ptr %[[THIS]]379// LLVM-COMMON: %[[B_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i32 1380// LLVM-COMMON: %[[B_VPTR:.*]] = load ptr, ptr %[[B_VPTR_ADDR]]381// LLVM-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[THIS]]382// LLVM-COMMON: %[[BASE_OFFSET_ADDR:.*]] = getelementptr i8, ptr %[[VPTR]], i64 -24383// LLVM-COMMON: %[[BASE_OFFSET:.*]] = load i64, ptr %[[BASE_OFFSET_ADDR]]384// LLVM-COMMON: %[[BASE_PTR:.*]] = getelementptr i8, ptr %[[THIS]], i64 %[[BASE_OFFSET]]385// LLVM-COMMON: store ptr %[[B_VPTR]], ptr %[[BASE_PTR]]386 387// OGCG-COMMON: define {{.*}} void @_ZN1CC2Ev(ptr {{.*}} %[[THIS_ARG:.*]], ptr {{.*}} %[[VTT_ARG:.*]])388// OGCG-COMMON: %[[THIS_ADDR:.*]] = alloca ptr389// OGCG-COMMON: %[[VTT_ADDR:.*]] = alloca ptr390// OGCG-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]391// OGCG-COMMON: store ptr %[[VTT_ARG]], ptr %[[VTT_ADDR]]392// OGCG-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]393// OGCG-COMMON: %[[VTT:.*]] = load ptr, ptr %[[VTT_ADDR]]394// OGCG-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[VTT]]395// OGCG-COMMON: store ptr %[[VPTR]], ptr %[[THIS]]396// OGCG-COMMON: %[[B_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i64 1397// OGCG-COMMON: %[[B_VPTR:.*]] = load ptr, ptr %[[B_VPTR_ADDR]]398// OGCG-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[THIS]]399// OGCG-COMMON: %[[BASE_OFFSET_ADDR:.*]] = getelementptr i8, ptr %[[VPTR]], i64 -24400// OGCG-COMMON: %[[BASE_OFFSET:.*]] = load i64, ptr %[[BASE_OFFSET_ADDR]]401// OGCG-COMMON: %[[BASE_PTR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 %[[BASE_OFFSET]]402// OGCG-COMMON: store ptr %[[B_VPTR]], ptr %[[BASE_PTR]]403 404// Base (C2) constructor for D405 406// CIR-COMMON: cir.func {{.*}} @_ZN1DC2Ev407// CIR-COMMON-SAME: %[[THIS_ARG:.*]]: !cir.ptr<!rec_D>408// CIR-COMMON-SAME: %[[VTT_ARG:.*]]: !cir.ptr<!cir.ptr<!void>>409// CIR-COMMON: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]410// CIR-COMMON: %[[VTT_ADDR:.*]] = cir.alloca {{.*}} ["vtt", init]411// CIR-COMMON: cir.store %[[THIS_ARG]], %[[THIS_ADDR]]412// CIR-COMMON: cir.store %[[VTT_ARG]], %[[VTT_ADDR]]413// CIR-COMMON: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]414// CIR-COMMON: %[[VTT:.*]] = cir.load{{.*}} %[[VTT_ADDR]]415// CIR-COMMON: %[[B_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [0] -> !cir.ptr<!rec_B>416// CIR-COMMON: %[[B_VTT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 1 -> !cir.ptr<!cir.ptr<!void>>417// CIR-COMMON: cir.call @_ZN1BC2Ev(%[[B_ADDR]], %[[B_VTT]]) nothrow : (!cir.ptr<!rec_B>, !cir.ptr<!cir.ptr<!void>>) -> ()418// CIR-COMMON: %[[C_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [16] -> !cir.ptr<!rec_C>419// CIR-COMMON: %[[C_VTT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 3 -> !cir.ptr<!cir.ptr<!void>>420// CIR-COMMON: cir.call @_ZN1CC2Ev(%[[C_ADDR]], %[[C_VTT]]) nothrow : (!cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!void>>) -> ()421// CIR-COMMON: %[[D_VTT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 0 -> !cir.ptr<!cir.ptr<!void>>422// CIR-COMMON: %[[VPTR_ADDR:.*]] = cir.cast bitcast %[[D_VTT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>423// CIR-COMMON: %[[VPTR:.*]] = cir.load{{.*}} %[[VPTR_ADDR]] : !cir.ptr<!cir.vptr>, !cir.vptr424// CIR-COMMON: %[[D_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]]425// CIR-COMMON: cir.store{{.*}} %[[VPTR]], %[[D_VPTR_ADDR]]426// CIR-COMMON: %[[D_VTT_ADDR_POINT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 5 -> !cir.ptr<!cir.ptr<!void>>427// CIR-COMMON: %[[D_VPTR_ADDR:.*]] = cir.cast bitcast %[[D_VTT_ADDR_POINT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>428// CIR-COMMON: %[[D_VPTR:.*]] = cir.load{{.*}} %[[D_VPTR_ADDR]] : !cir.ptr<!cir.vptr>, !cir.vptr429// CIR-COMMON: %[[D_VPTR_ADDR2:.*]] = cir.vtable.get_vptr %[[THIS]] : !cir.ptr<!rec_D> -> !cir.ptr<!cir.vptr>430// CIR-COMMON: %[[VPTR2:.*]] = cir.load{{.*}} %[[D_VPTR_ADDR2]] : !cir.ptr<!cir.vptr>, !cir.vptr431// CIR-COMMON: %[[VPTR_ADDR2:.*]] = cir.cast bitcast %[[VPTR2]] : !cir.vptr -> !cir.ptr<!u8i>432// CIR-COMMON: %[[CONST_24:.*]] = cir.const #cir.int<-24> : !s64i433// CIR-COMMON: %[[BASE_OFFSET_ADDR:.*]] = cir.ptr_stride %[[VPTR_ADDR2]], %[[CONST_24]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>434// CIR-COMMON: %[[BASE_OFFSET_PTR:.*]] = cir.cast bitcast %[[BASE_OFFSET_ADDR]] : !cir.ptr<!u8i> -> !cir.ptr<!s64i>435// CIR-COMMON: %[[BASE_OFFSET:.*]] = cir.load{{.*}} %[[BASE_OFFSET_PTR]] : !cir.ptr<!s64i>, !s64i436// CIR-COMMON: %[[THIS_PTR:.*]] = cir.cast bitcast %[[THIS]] : !cir.ptr<!rec_D> -> !cir.ptr<!u8i>437// CIR-COMMON: %[[BASE_PTR:.*]] = cir.ptr_stride %[[THIS_PTR]], %[[BASE_OFFSET]] : (!cir.ptr<!u8i>, !s64i) -> !cir.ptr<!u8i>438// CIR-COMMON: %[[BASE_CAST:.*]] = cir.cast bitcast %[[BASE_PTR]] : !cir.ptr<!u8i> -> !cir.ptr<!rec_D>439// CIR-COMMON: %[[BASE_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[BASE_CAST]]440// CIR-COMMON: cir.store{{.*}} %[[D_VPTR]], %[[BASE_VPTR_ADDR]]441// CIR-COMMON: %[[C_VTT_ADDR_POINT:.*]] = cir.vtt.address_point %[[VTT]] : !cir.ptr<!cir.ptr<!void>>, offset = 6 -> !cir.ptr<!cir.ptr<!void>>442// CIR-COMMON: %[[C_VPTR_ADDR:.*]] = cir.cast bitcast %[[C_VTT_ADDR_POINT]] : !cir.ptr<!cir.ptr<!void>> -> !cir.ptr<!cir.vptr>443// CIR-COMMON: %[[C_VPTR:.*]] = cir.load{{.*}} %[[C_VPTR_ADDR]] : !cir.ptr<!cir.vptr>, !cir.vptr444// CIR-COMMON: %[[C_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [16] -> !cir.ptr<!rec_C>445// CIR-COMMON: %[[C_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[C_ADDR]] : !cir.ptr<!rec_C> -> !cir.ptr<!cir.vptr>446// CIR-COMMON: cir.store{{.*}} %[[C_VPTR]], %[[C_VPTR_ADDR]] : !cir.vptr, !cir.ptr<!cir.vptr>447 448// LLVM-COMMON: define {{.*}} void @_ZN1DC2Ev(ptr %[[THIS_ARG:.*]], ptr %[[VTT_ARG:.*]]){{.*}} {449// LLVM-COMMON: %[[THIS_ADDR:.*]] = alloca ptr450// LLVM-COMMON: %[[VTT_ADDR:.*]] = alloca ptr451// LLVM-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]452// LLVM-COMMON: store ptr %[[VTT_ARG]], ptr %[[VTT_ADDR]]453// LLVM-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]454// LLVM-COMMON: %[[VTT:.*]] = load ptr, ptr %[[VTT_ADDR]]455// LLVM-COMMON: %[[B_VTT:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i32 1456// LLVM-COMMON: call void @_ZN1BC2Ev(ptr %[[THIS]], ptr %[[B_VTT]])457// LLVM-COMMON: %[[C_ADDR:.*]] = getelementptr i8, ptr %[[THIS]], i32 16458// LLVM-COMMON: %[[C_VTT:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i32 3459// LLVM-COMMON: call void @_ZN1CC2Ev(ptr %[[C_ADDR]], ptr %[[C_VTT]])460// LLVM-COMMON: %[[VPTR:.*]] = load ptr, ptr %[[VTT]]461// LLVM-COMMON: store ptr %[[VPTR]], ptr %[[THIS]]462// LLVM-COMMON: %[[D_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i32 5463// LLVM-COMMON: %[[D_VPTR:.*]] = load ptr, ptr %[[D_VPTR_ADDR]]464// LLVM-COMMON: %[[D_VPTR_ADDR2:.*]] = load ptr, ptr %[[THIS]]465// LLVM-COMMON: %[[BASE_OFFSET_ADDR:.*]] = getelementptr i8, ptr %[[D_VPTR_ADDR2]], i64 -24466// LLVM-COMMON: %[[BASE_OFFSET:.*]] = load i64, ptr %[[BASE_OFFSET_ADDR]]467// LLVM-COMMON: %[[BASE_PTR:.*]] = getelementptr i8, ptr %[[THIS]], i64 %[[BASE_OFFSET]]468// LLVM-COMMON: store ptr %[[D_VPTR]], ptr %[[BASE_PTR]]469// LLVM-COMMON: %[[C_VPTR_ADDR:.*]] = getelementptr inbounds ptr, ptr %[[VTT]], i32 6470// LLVM-COMMON: %[[C_VPTR:.*]] = load ptr, ptr %[[C_VPTR_ADDR]]471// LLVM-COMMON: %[[C_ADDR:.*]] = getelementptr i8, ptr %[[THIS]], i32 16472// LLVM-COMMON: store ptr %[[C_VPTR]], ptr %[[C_ADDR]]473 474// The C2 constructor for D gets emitted earlier in OGCG, see above.475 476// Base (C2) constructor for A477 478// CIR-COMMON: cir.func {{.*}} @_ZN1AC2Ev479// CIR-COMMON-SAME: %[[THIS_ARG:.*]]: !cir.ptr<!rec_A>480// CIR-COMMON: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]481// CIR-COMMON: cir.store %[[THIS_ARG]], %[[THIS_ADDR]]482// CIR-COMMON: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]483// CIR-COMMON: %[[VPTR:.*]] = cir.vtable.address_point(@_ZTV1A, address_point = <index = 0, offset = 2>) : !cir.vptr484// CIR-COMMON: %[[VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]] : !cir.ptr<!rec_A> -> !cir.ptr<!cir.vptr>485// CIR-COMMON: cir.store{{.*}} %[[VPTR]], %[[VPTR_ADDR]] : !cir.vptr, !cir.ptr<!cir.vptr>486 487// LLVM-COMMON: define {{.*}} void @_ZN1AC2Ev(ptr %[[THIS_ARG:.*]]){{.*}} {488// LLVM-COMMON: %[[THIS_ADDR:.*]] = alloca ptr, i64 1, align 8489// LLVM-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]], align 8490// LLVM-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]], align 8491// LLVM-COMMON: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV1A, i64 16), ptr %[[THIS]]492 493// The C2 constructor for A gets emitted later in OGCG, see below.494 495// Complete (C1) constructor for D496 497// CIR-COMMON: cir.func {{.*}} @_ZN1DC1Ev498// CIR-COMMON-SAME: %[[THIS_ARG:.*]]: !cir.ptr<!rec_D>499// CIR-COMMON: %[[THIS_ADDR:.*]] = cir.alloca {{.*}} ["this", init]500// CIR-COMMON: cir.store %[[THIS_ARG]], %[[THIS_ADDR]]501// CIR-COMMON: %[[THIS:.*]] = cir.load %[[THIS_ADDR]]502// CIR-COMMON: %[[A_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [40] -> !cir.ptr<!rec_A>503// CIR-COMMON: cir.call @_ZN1AC2Ev(%[[A_ADDR]]) nothrow : (!cir.ptr<!rec_A>) -> ()504// CIR-COMMON: %[[B_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [0] -> !cir.ptr<!rec_B>505// CIR-COMMON: %[[B_VTT:.*]] = cir.vtt.address_point @_ZTT1D, offset = 1 -> !cir.ptr<!cir.ptr<!void>>506// CIR-COMMON: cir.call @_ZN1BC2Ev(%[[B_ADDR]], %[[B_VTT]]) nothrow : (!cir.ptr<!rec_B>, !cir.ptr<!cir.ptr<!void>>) -> ()507// CIR-COMMON: %[[C_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [16] -> !cir.ptr<!rec_C>508// CIR-COMMON: %[[C_VTT:.*]] = cir.vtt.address_point @_ZTT1D, offset = 3 -> !cir.ptr<!cir.ptr<!void>>509// CIR-COMMON: cir.call @_ZN1CC2Ev(%[[C_ADDR]], %[[C_VTT]]) nothrow : (!cir.ptr<!rec_C>, !cir.ptr<!cir.ptr<!void>>) -> ()510// CIR-COMMON: %[[D_VPTR:.*]] = cir.vtable.address_point(@_ZTV1D, address_point = <index = 0, offset = 3>) : !cir.vptr511// CIR-COMMON: %[[VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[THIS]] : !cir.ptr<!rec_D> -> !cir.ptr<!cir.vptr>512// CIR-COMMON: cir.store{{.*}} %[[D_VPTR]], %[[VPTR_ADDR]] : !cir.vptr, !cir.ptr<!cir.vptr>513// CIR-COMMON: %[[A_VPTR:.*]] = cir.vtable.address_point(@_ZTV1D, address_point = <index = 2, offset = 3>) : !cir.vptr514// CIR-COMMON: %[[A_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [40] -> !cir.ptr<!rec_A>515// CIR-COMMON: %[[A_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[A_ADDR]] : !cir.ptr<!rec_A> -> !cir.ptr<!cir.vptr>516// CIR-COMMON: cir.store{{.*}} %[[A_VPTR]], %[[A_VPTR_ADDR]] : !cir.vptr, !cir.ptr<!cir.vptr>517// CIR-COMMON: %[[C_VPTR:.*]] = cir.vtable.address_point(@_ZTV1D, address_point = <index = 1, offset = 3>) : !cir.vptr518// CIR-COMMON: %[[C_ADDR:.*]] = cir.base_class_addr %[[THIS]] : !cir.ptr<!rec_D> nonnull [16] -> !cir.ptr<!rec_C>519// CIR-COMMON: %[[C_VPTR_ADDR:.*]] = cir.vtable.get_vptr %[[C_ADDR]] : !cir.ptr<!rec_C> -> !cir.ptr<!cir.vptr>520// CIR-COMMON: cir.store{{.*}} %[[C_VPTR]], %[[C_VPTR_ADDR]] : !cir.vptr, !cir.ptr<!cir.vptr>521 522// LLVM-COMMON: define {{.*}} void @_ZN1DC1Ev(ptr %[[THIS_ARG:.*]])523// LLVM-COMMON: %[[THIS_ADDR:.*]] = alloca ptr524// LLVM-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]525// LLVM-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]526// LLVM-COMMON: %[[A_ADDR:.*]] = getelementptr i8, ptr %[[THIS]], i32 40527// LLVM-COMMON: call void @_ZN1AC2Ev(ptr %[[A_ADDR]])528// LLVM-COMMON: call void @_ZN1BC2Ev(ptr %[[THIS]], ptr getelementptr inbounds nuw (i8, ptr @_ZTT1D, i64 8))529// LLVM-COMMON: %[[C_ADDR:.*]] = getelementptr i8, ptr %[[THIS]], i32 16530// LLVM-COMMON: call void @_ZN1CC2Ev(ptr %[[C_ADDR]], ptr getelementptr inbounds nuw (i8, ptr @_ZTT1D, i64 24))531// LLVM-COMMON: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 24), ptr %[[THIS]]532// LLVM-COMMON: %[[A_ADDR:.*]] = getelementptr i8, ptr %[[THIS]], i32 40533// LLVM-COMMON: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 96), ptr %[[A_ADDR]]534// LLVM-COMMON: %[[C_ADDR:.*]] = getelementptr i8, ptr %[[THIS]], i32 16535// LLVM-COMMON: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 64), ptr %[[C_ADDR]]536 537// OGCG-COMMON: define {{.*}} void @_ZN1DC1Ev(ptr {{.*}} %[[THIS_ARG:.*]])538// OGCG-COMMON: %[[THIS_ADDR:.*]] = alloca ptr539// OGCG-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]540// OGCG-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]541// OGCG-COMMON: %[[A_ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 40542// OGCG-COMMON: call void @_ZN1AC2Ev(ptr {{.*}} %[[A_ADDR]])543// OGCG-COMMON: call void @_ZN1BC2Ev(ptr {{.*}} %[[THIS]], ptr {{.*}} getelementptr inbounds ([7 x ptr], ptr @_ZTT1D, i64 0, i64 1))544// OGCG-COMMON: %[[C_ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 16545// OGCG-COMMON: call void @_ZN1CC2Ev(ptr {{.*}} %[[C_ADDR]], ptr {{.*}} getelementptr inbounds ([7 x ptr], ptr @_ZTT1D, i64 0, i64 3))546// OGCG-COMMON: store ptr getelementptr inbounds inrange(-24, 16) ({ [5 x ptr], [4 x ptr], [4 x ptr] }, ptr @_ZTV1D, i32 0, i32 0, i32 3), ptr %[[THIS]]547// OGCG-COMMON: %[[A_ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 40548// OGCG-COMMON: store ptr getelementptr inbounds inrange(-24, 8) ({ [5 x ptr], [4 x ptr], [4 x ptr] }, ptr @_ZTV1D, i32 0, i32 2, i32 3), ptr %[[A_ADDR]]549// OGCG-COMMON: %[[C_ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS]], i64 16550// OGCG-COMMON: store ptr getelementptr inbounds inrange(-24, 8) ({ [5 x ptr], [4 x ptr], [4 x ptr] }, ptr @_ZTV1D, i32 0, i32 1, i32 3), ptr %[[C_ADDR]]551 552// OGCG-COMMON: define {{.*}} void @_ZN1AC2Ev(ptr {{.*}} %[[THIS_ARG:.*]])553// OGCG-COMMON: %[[THIS_ADDR:.*]] = alloca ptr554// OGCG-COMMON: store ptr %[[THIS_ARG]], ptr %[[THIS_ADDR]]555// OGCG-COMMON: %[[THIS:.*]] = load ptr, ptr %[[THIS_ADDR]]556// OGCG-COMMON: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTV1A, i32 0, i32 0, i32 2), ptr %[[THIS]]557