Author: Erich Keane Date: 2026-08-16T20:14:41-07:00 New Revision: 9cd4a3d4eeadf8f69b32f7b88bdcea480aab60ed
URL: https://github.com/llvm/llvm-project/commit/9cd4a3d4eeadf8f69b32f7b88bdcea480aab60ed DIFF: https://github.com/llvm/llvm-project/commit/9cd4a3d4eeadf8f69b32f7b88bdcea480aab60ed.diff LOG: [CIR] Fix the 'constant'-ness of vtable-variables (#216434) The createOrReplaceCXXRuntimeVariable sets the variable to be 'constant' in classic codegen, this sets that right. However, 1 use of it (in buildVTablePointer) doesn't match classic-codegen (it instead calls getOrInsertGlobal directly), so this patch adds a bit of a fixup there to minimize the impact of this change. Added: Modified: clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp clang/lib/CIR/CodeGen/CIRGenModule.cpp clang/test/CIR/CodeGen/multi-vtable.cpp clang/test/CIR/CodeGen/pointer-width-32bit.cpp clang/test/CIR/CodeGen/rtti-member-pointer.cpp clang/test/CIR/CodeGen/rtti-qualfn.cpp clang/test/CIR/CodeGen/thunks.cpp clang/test/CIR/CodeGen/vbase.cpp clang/test/CIR/CodeGen/virtual-function-calls.cpp clang/test/CIR/CodeGen/vtable-emission.cpp clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp clang/test/CIR/CodeGen/vtt.cpp clang/test/CIR/CodeGenCXX/vtable-linkage.cpp clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp Removed: ################################################################################ diff --git a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp index 1e3c4d4ddcfeb..800f20ace0e70 100644 --- a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp @@ -1235,6 +1235,11 @@ void CIRGenItaniumRTTIBuilder::buildVTablePointer(mlir::Location loc, cir::GlobalOp vTable = cgm.createOrReplaceCXXRuntimeVariable( loc, vTableName, vtableGlobalTy, cir::GlobalLinkageKind::ExternalLinkage, CharUnits::fromQuantity(align)); + // Note: createOrReplaceCXXRuntimeVariable isn't exactly what classic-codegen + // does here: it just does a getOrInsertGlobal at the module level. However, + // the above function does MOST of what we want, except it sets the global as + // constant, when we don't want that. So set it here instead. + vTable.setConstant(false); // The vtable address point is 2. mlir::Attribute field{}; diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp index 16254d1bdba91..7d8c54cbfb1d8 100644 --- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp @@ -1879,7 +1879,7 @@ cir::GlobalOp CIRGenModule::createOrReplaceCXXRuntimeVariable( } // Create a new variable. - gv = createGlobalOp(loc, name, ty); + gv = createGlobalOp(loc, name, ty, /*isConstant=*/true); // Set up extra information and add to the module gv.setLinkageAttr( diff --git a/clang/test/CIR/CodeGen/multi-vtable.cpp b/clang/test/CIR/CodeGen/multi-vtable.cpp index fd51c6bf80807..33980b459886e 100644 --- a/clang/test/CIR/CodeGen/multi-vtable.cpp +++ b/clang/test/CIR/CodeGen/multi-vtable.cpp @@ -39,7 +39,7 @@ void Child::MotherKey() {} // Child vtable -// CIR: cir.global "private" external @_ZTV5Child = #cir.vtable<{ +// CIR: cir.global "private" constant external @_ZTV5Child = #cir.vtable<{ // CIR-SAME: #cir.const_array<[ // CIR-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, // CIR-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, @@ -53,7 +53,7 @@ void Child::MotherKey() {} // CIR-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 3> // CIR-SAME: }> : [[CHILD_VTABLE_TYPE]] -// LLVM: @_ZTV5Child = global { [4 x ptr], [3 x ptr] } { +// LLVM: @_ZTV5Child = constant { [4 x ptr], [3 x ptr] } { // LLVM-SAME: [4 x ptr] [ // LLVM-SAME: ptr null, // LLVM-SAME: ptr null, @@ -83,7 +83,7 @@ void Child::MotherKey() {} // Mother vtable -// CIR: cir.global "private" external @_ZTV6Mother = #cir.vtable<{ +// CIR: cir.global "private" constant external @_ZTV6Mother = #cir.vtable<{ // CIR-SAME: #cir.const_array<[ // CIR-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, // CIR-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, @@ -92,7 +92,7 @@ void Child::MotherKey() {} // CIR-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4> // CIR-SAME: }> : [[MOTHER_VTABLE_TYPE]] -// LLVM: @_ZTV6Mother = global { [4 x ptr] } { +// LLVM: @_ZTV6Mother = constant { [4 x ptr] } { // LLVM-SAME: [4 x ptr] [ // LLVM-SAME: ptr null, // LLVM-SAME: ptr null, @@ -112,7 +112,7 @@ void Child::MotherKey() {} // Father vtable -// CIR: cir.global "private" external @_ZTV6Father = #cir.vtable<{ +// CIR: cir.global "private" constant external @_ZTV6Father = #cir.vtable<{ // CIR-SAME: #cir.const_array<[ // CIR-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, // CIR-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, @@ -120,7 +120,7 @@ void Child::MotherKey() {} // CIR-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 3> // CIR-SAME: }> : [[FATHER_VTABLE_TYPE]] -// LLVM: @_ZTV6Father = global { [3 x ptr] } { +// LLVM: @_ZTV6Father = constant { [3 x ptr] } { // LLVM-SAME: [3 x ptr] [ // LLVM-SAME: ptr null, // LLVM-SAME: ptr null, diff --git a/clang/test/CIR/CodeGen/pointer-width-32bit.cpp b/clang/test/CIR/CodeGen/pointer-width-32bit.cpp index f811fdc5361fb..6715c5680ce24 100644 --- a/clang/test/CIR/CodeGen/pointer-width-32bit.cpp +++ b/clang/test/CIR/CodeGen/pointer-width-32bit.cpp @@ -47,7 +47,7 @@ M m; // LLVM: @s = global %struct.S zeroinitializer, align 4 // LLVM: @m = global %struct.M { i32 -1, i32 0 }, align 4 -// LLVM: @_ZTV1A = global { [3 x ptr] } {{.*}}, align 4 +// LLVM: @_ZTV1A = constant { [3 x ptr] } {{.*}}, align 4 // OGCG: @s = global %struct.S zeroinitializer, align 4 // OGCG: @m = global %struct.M { i32 -1, i32 0 }, align 4 diff --git a/clang/test/CIR/CodeGen/rtti-member-pointer.cpp b/clang/test/CIR/CodeGen/rtti-member-pointer.cpp index b223857a9630c..a041db2cab628 100644 --- a/clang/test/CIR/CodeGen/rtti-member-pointer.cpp +++ b/clang/test/CIR/CodeGen/rtti-member-pointer.cpp @@ -23,8 +23,8 @@ void throw_data_member_ptr() { // CIR-DAG: cir.throw %{{.*}} : !cir.ptr<!s64i>, @_ZTIM1Ai -// LLVM-DAG: @_ZTSM1Ai = linkonce_odr global [5 x i8] c"M1Ai\00", comdat -// LLVM-DAG: @_ZTS1A = linkonce_odr global [3 x i8] c"1A\00", comdat +// LLVM-DAG: @_ZTSM1Ai = linkonce_odr constant [5 x i8] c"M1Ai\00", comdat +// LLVM-DAG: @_ZTS1A = linkonce_odr constant [3 x i8] c"1A\00", comdat // LLVM-DAG: @_ZTI1A = linkonce_odr constant { ptr, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 16), ptr @_ZTS1A }, comdat // LLVM-DAG: @_ZTIM1Ai = linkonce_odr constant { ptr, ptr, i32, ptr, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv129__pointer_to_member_type_infoE, i64 16), ptr @_ZTSM1Ai, i32 0, ptr @_ZTIi, ptr @_ZTI1A }, comdat // LLVM-DAG: call void @__cxa_throw(ptr %{{.*}}, ptr @_ZTIM1Ai, ptr null) @@ -45,8 +45,8 @@ void throw_member_fn_ptr() { // CIR-DAG: cir.global {{.*}} @_ZTIFvvE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv120__function_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTSFvvE> : !cir.ptr<!u8i>}> // CIR-DAG: cir.global {{.*}} @_ZTIM1AFvvE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv129__pointer_to_member_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTSM1AFvvE> : !cir.ptr<!u8i>, #cir.int<0> : !u32i, #cir.global_view<@_ZTIFvvE> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1A> : !cir.ptr<!u8i>}> -// LLVM-DAG: @_ZTSM1AFvvE = linkonce_odr global [8 x i8] c"M1AFvvE\00", comdat -// LLVM-DAG: @_ZTSFvvE = linkonce_odr global [5 x i8] c"FvvE\00", comdat +// LLVM-DAG: @_ZTSM1AFvvE = linkonce_odr constant [8 x i8] c"M1AFvvE\00", comdat +// LLVM-DAG: @_ZTSFvvE = linkonce_odr constant [5 x i8] c"FvvE\00", comdat // LLVM-DAG: @_ZTIFvvE = linkonce_odr constant { ptr, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv120__function_type_infoE, i64 16), ptr @_ZTSFvvE }, comdat // LLVM-DAG: @_ZTIM1AFvvE = linkonce_odr constant { ptr, ptr, i32, ptr, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv129__pointer_to_member_type_infoE, i64 16), ptr @_ZTSM1AFvvE, i32 0, ptr @_ZTIFvvE, ptr @_ZTI1A }, comdat // LLVM-DAG: call void @__cxa_throw(ptr %{{.*}}, ptr @_ZTIM1AFvvE, ptr null) diff --git a/clang/test/CIR/CodeGen/rtti-qualfn.cpp b/clang/test/CIR/CodeGen/rtti-qualfn.cpp index d57e7fce7915f..639bc1bac92b3 100644 --- a/clang/test/CIR/CodeGen/rtti-qualfn.cpp +++ b/clang/test/CIR/CodeGen/rtti-qualfn.cpp @@ -23,9 +23,9 @@ void f() noexcept { // CIR: cir.throw %{{.*}} : !cir.ptr<!cir.ptr<!cir.func<()>>>, @_ZTIPDoFvvE -// LLVM-DAG: @_ZTSFvvE = linkonce_odr global [5 x i8] c"FvvE\00", comdat +// LLVM-DAG: @_ZTSFvvE = linkonce_odr constant [5 x i8] c"FvvE\00", comdat // LLVM-DAG: @_ZTIFvvE = linkonce_odr constant { ptr, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv120__function_type_infoE, i64 16), ptr @_ZTSFvvE }, comdat -// LLVM-DAG: @_ZTSPDoFvvE = linkonce_odr global [8 x i8] c"PDoFvvE\00", comdat +// LLVM-DAG: @_ZTSPDoFvvE = linkonce_odr constant [8 x i8] c"PDoFvvE\00", comdat // LLVM-DAG: @_ZTIPDoFvvE = linkonce_odr constant { ptr, ptr, i32, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv119__pointer_type_infoE, i64 16), ptr @_ZTSPDoFvvE, i32 64, ptr @_ZTIFvvE }, comdat // LLVM: call void @__cxa_throw(ptr %{{.*}}, ptr @_ZTIPDoFvvE, ptr null) diff --git a/clang/test/CIR/CodeGen/thunks.cpp b/clang/test/CIR/CodeGen/thunks.cpp index 5ec846350d115..3fa329f02ffc9 100644 --- a/clang/test/CIR/CodeGen/thunks.cpp +++ b/clang/test/CIR/CodeGen/thunks.cpp @@ -151,28 +151,28 @@ void C::f(int x, ...) {} // In CIR, all globals are emitted before functions. // Test1 vtable: C's vtable references the thunk for B's entry. -// CIR-DAG: cir.global "private" external @_ZTVN5Test11CE = #cir.vtable<{ +// CIR-DAG: cir.global "private" constant external @_ZTVN5Test11CE = #cir.vtable<{ // CIR-DAG: #cir.global_view<@_ZN5Test11C1fEv> : !cir.ptr<!u8i> // CIR-DAG: #cir.global_view<@_ZThn8_N5Test11C1fEv> : !cir.ptr<!u8i> // Test2 vtable: C's vtable references the thunk for B's entry. -// CIR-DAG: cir.global "private" external @_ZTVN5Test21CE = #cir.vtable<{ +// CIR-DAG: cir.global "private" constant external @_ZTVN5Test21CE = #cir.vtable<{ // CIR-DAG: #cir.global_view<@_ZN5Test21C1gEv> : !cir.ptr<!u8i> // CIR-DAG: #cir.global_view<@_ZThn8_N5Test21C1gEv> : !cir.ptr<!u8i> // Test5 vtable: C's vtable references the aggregate-return thunk for B's // entry. -// CIR-DAG: cir.global "private" external @_ZTVN5Test51CE = #cir.vtable<{ +// CIR-DAG: cir.global "private" constant external @_ZTVN5Test51CE = #cir.vtable<{ // CIR-DAG: #cir.global_view<@_ZN5Test51C1hEv> : !cir.ptr<!u8i> // CIR-DAG: #cir.global_view<@_ZThn8_N5Test51C1hEv> : !cir.ptr<!u8i> // Test4 vtable: C's vtable references the thunk for B's entry. -// CIR-DAG: cir.global "private" external @_ZTVN5Test41CE = #cir.vtable<{ +// CIR-DAG: cir.global "private" constant external @_ZTVN5Test41CE = #cir.vtable<{ // CIR-DAG: #cir.global_view<@_ZN5Test41C1gEi> : !cir.ptr<!u8i> // CIR-DAG: #cir.global_view<@_ZThn8_N5Test41C1gEi> : !cir.ptr<!u8i> // Test3 vtable: D's vtable references D1, D0, and their thunks. -// CIR-DAG: cir.global "private" external @_ZTVN5Test31DE = #cir.vtable<{ +// CIR-DAG: cir.global "private" constant external @_ZTVN5Test31DE = #cir.vtable<{ // CIR-DAG: #cir.global_view<@_ZN5Test31DD1Ev> : !cir.ptr<!u8i> // CIR-DAG: #cir.global_view<@_ZN5Test31DD0Ev> : !cir.ptr<!u8i> // CIR-DAG: #cir.global_view<@_ZThn8_N5Test31DD1Ev> : !cir.ptr<!u8i> @@ -282,27 +282,27 @@ void C::f(int x, ...) {} // --- LLVM checks --- -// LLVM: @_ZTVN5Test11CE = global { [3 x ptr], [3 x ptr] } { +// LLVM: @_ZTVN5Test11CE = constant { [3 x ptr], [3 x ptr] } { // LLVM-SAME: [3 x ptr] [ptr null, ptr null, ptr @_ZN5Test11C1fEv], // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr @_ZThn8_N5Test11C1fEv] // LLVM-SAME: } -// LLVM: @_ZTVN5Test21CE = global { [3 x ptr], [3 x ptr] } { +// LLVM: @_ZTVN5Test21CE = constant { [3 x ptr], [3 x ptr] } { // LLVM-SAME: [3 x ptr] [ptr null, ptr null, ptr @_ZN5Test21C1gEv], // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr @_ZThn8_N5Test21C1gEv] // LLVM-SAME: } -// LLVM: @_ZTVN5Test31DE = global { [4 x ptr], [4 x ptr] } { +// LLVM: @_ZTVN5Test31DE = constant { [4 x ptr], [4 x ptr] } { // LLVM-SAME: [4 x ptr] [ptr null, ptr null, ptr @_ZN5Test31DD1Ev, ptr @_ZN5Test31DD0Ev], // LLVM-SAME: [4 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr @_ZThn8_N5Test31DD1Ev, ptr @_ZThn8_N5Test31DD0Ev] // LLVM-SAME: } -// LLVM: @_ZTVN5Test41CE = global { [4 x ptr], [3 x ptr] } { +// LLVM: @_ZTVN5Test41CE = constant { [4 x ptr], [3 x ptr] } { // LLVM-SAME: [4 x ptr] [ptr null, ptr null, ptr @_ZN5Test41A1fEv, ptr @_ZN5Test41C1gEi], // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr @_ZThn8_N5Test41C1gEi] // LLVM-SAME: } -// LLVM: @_ZTVN5Test51CE = global { [3 x ptr], [3 x ptr] } { +// LLVM: @_ZTVN5Test51CE = constant { [3 x ptr], [3 x ptr] } { // LLVM-SAME: [3 x ptr] [ptr null, ptr null, ptr @_ZN5Test51C1hEv], // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr @_ZThn8_N5Test51C1hEv] // LLVM-SAME: } diff --git a/clang/test/CIR/CodeGen/vbase.cpp b/clang/test/CIR/CodeGen/vbase.cpp index e1b8d04f5247b..fb37a49c7856e 100644 --- a/clang/test/CIR/CodeGen/vbase.cpp +++ b/clang/test/CIR/CodeGen/vbase.cpp @@ -52,7 +52,7 @@ void ppp() { B b; } // Vtable definition for B // CIR: cir.global "private" {{.*}}@_ZTV1B = #cir.vtable<{#cir.const_array<[#cir.ptr<12 : i64> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1B> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !rec_anon_struct3 {alignment = 8 : i64} -// LLVM: @_ZTV1B = linkonce_odr global { [3 x ptr] } { [3 x ptr] [ptr inttoptr (i64 12 to ptr), ptr null, ptr @_ZTI1B] }, comdat, align 8 +// LLVM: @_ZTV1B = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr inttoptr (i64 12 to ptr), ptr null, ptr @_ZTI1B] }, comdat, align 8 // OGCG: @_ZTV1B = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr inttoptr (i64 12 to ptr), ptr null, ptr @_ZTI1B] }, comdat, align 8 diff --git a/clang/test/CIR/CodeGen/virtual-function-calls.cpp b/clang/test/CIR/CodeGen/virtual-function-calls.cpp index 569bc7cf4e65a..3d7e3a8ae4712 100644 --- a/clang/test/CIR/CodeGen/virtual-function-calls.cpp +++ b/clang/test/CIR/CodeGen/virtual-function-calls.cpp @@ -16,9 +16,9 @@ A::A() {} // CIR: !rec_A = !cir.struct<"A" {data !cir.vptr}> // CIR: !rec_anon_struct = !cir.struct<{data !cir.array<!cir.ptr<!u8i> x 3>}> -// CIR: cir.global "private" external @_ZTV1A : !rec_anon_struct +// CIR: cir.global "private" constant external @_ZTV1A : !rec_anon_struct -// LLVM: @_ZTV1A = external global { [3 x ptr] } +// LLVM: @_ZTV1A = external constant { [3 x ptr] } // OGCG: @_ZTV1A = external constant { [3 x ptr] } diff --git a/clang/test/CIR/CodeGen/vtable-emission.cpp b/clang/test/CIR/CodeGen/vtable-emission.cpp index d1522db762ba0..4c5a6f04719cf 100644 --- a/clang/test/CIR/CodeGen/vtable-emission.cpp +++ b/clang/test/CIR/CodeGen/vtable-emission.cpp @@ -3,7 +3,7 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -fclangir -emit-llvm -o %t-cir.ll %s // RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -emit-llvm -o %t.ll %s -// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s +// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s // Note: This test is using -fno-rtti so that we can delay implemntation of that handling. // When rtti handling for vtables is implemented, that option should be removed. @@ -18,7 +18,7 @@ void S::key() {} // CHECK-DAG: !rec_anon_struct = !cir.struct<{data !cir.array<!cir.ptr<!u8i> x 4>}> // The definition of the key function should result in the vtable being emitted. -// CHECK: cir.global "private" external @_ZTV1S = #cir.vtable<{ +// CHECK: cir.global "private" constant external @_ZTV1S = #cir.vtable<{ // CHECK-SAME: #cir.const_array<[ // CHECK-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, // CHECK-SAME: #cir.ptr<null> : !cir.ptr<!u8i>, @@ -26,12 +26,9 @@ void S::key() {} // CHECK-SAME: #cir.global_view<@_ZN1S6nonKeyEv> : !cir.ptr<!u8i>]> // CHECK-SAME: : !cir.array<!cir.ptr<!u8i> x 4>}> : !rec_anon_struct -// LLVM: @_ZTV1S = global { [4 x ptr] } { [4 x ptr] +// LLVM: @_ZTV1S = {{(unnamed_addr )?}}constant { [4 x ptr] } { [4 x ptr] // LLVM-SAME: [ptr null, ptr null, ptr @_ZN1S3keyEv, ptr @_ZN1S6nonKeyEv] } -// OGCG: @_ZTV1S = unnamed_addr constant { [4 x ptr] } { [4 x ptr] -// OGCG-SAME: [ptr null, ptr null, ptr @_ZN1S3keyEv, ptr @_ZN1S6nonKeyEv] } - // CHECK: cir.func {{.*}} @_ZN1S3keyEv // The reference from the vtable should result in nonKey being emitted. diff --git a/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp b/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp index ae63d0c4905aa..2f8fb92e571bd 100644 --- a/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp +++ b/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp @@ -5,7 +5,7 @@ // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -fno-clangir-call-conv-lowering -emit-llvm %s -o %t-cir.ll // RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll -// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s +// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s template <typename T> struct Base { @@ -44,21 +44,17 @@ void use_key() { // Base has no key function and extern template declaration, so the vtable // gets external linkage. -// CHECK: cir.global "private" external @_ZTV4BaseIiE +// CHECK: cir.global "private" constant external @_ZTV4BaseIiE // The key function (~KeyBase) is not instantiated in this TU, so the vtable // also gets external linkage. -// CHECK: cir.global "private" external @_ZTV7KeyBaseIiE +// CHECK: cir.global "private" constant external @_ZTV7KeyBaseIiE // Verify the virtual call goes through the vtable. // CHECK: cir.func {{.*}} @_Z3useP4BaseIiE // CHECK: cir.vtable.get_vptr // CHECK: cir.vtable.get_virtual_fn_addr -// LLVM: @_ZTV4BaseIiE = external global -// LLVM: @_ZTV7KeyBaseIiE = external global +// LLVM: @_ZTV4BaseIiE = external constant +// LLVM: @_ZTV7KeyBaseIiE = external constant // LLVM: define {{.*}} @_Z3useP4BaseIiE - -// OGCG: @_ZTV4BaseIiE = external constant -// OGCG: @_ZTV7KeyBaseIiE = external constant -// OGCG: define {{.*}} @_Z3useP4BaseIiE diff --git a/clang/test/CIR/CodeGen/vtt.cpp b/clang/test/CIR/CodeGen/vtt.cpp index 9a30484314179..62fc27d4949b6 100644 --- a/clang/test/CIR/CodeGen/vtt.cpp +++ b/clang/test/CIR/CodeGen/vtt.cpp @@ -85,7 +85,7 @@ void D::y() {} // CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4> // CIR-COMMON-SAME: }> : ![[REC_D_VTABLE]] {alignment = 8 : i64} -// LLVM-COMMON: @_ZTV1D = global { [5 x ptr], [4 x ptr], [4 x ptr] } { +// LLVM-COMMON: @_ZTV1D = constant { [5 x ptr], [4 x ptr], [4 x ptr] } { // LLVM-NO-RTTI-SAME: [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr null, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv], // LLVM-RTTI-SAME: [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr @_ZTI1D, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv], // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr inttoptr (i64 -16 to ptr), ptr null, ptr @_ZN1C1xEv], @@ -116,7 +116,7 @@ void D::y() {} // CIR-COMMON-SAME: #cir.global_view<@_ZTV1D, [1 : i32, 3 : i32]> : !cir.ptr<!u8i> // CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 7> {alignment = 8 : i64} -// LLVM-COMMON: @_ZTT1D = global [7 x ptr] [ +// LLVM-COMMON: @_ZTT1D = constant [7 x ptr] [ // LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 24), // LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D0_1B, i64 24), // LLVM-COMMON-SAME: ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D0_1B, i64 56), @@ -155,7 +155,7 @@ void D::y() {} // CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4> // CIR-COMMON-SAME: }> : ![[REC_B_OR_C_IN_D_VTABLE]] -// LLVM-COMMON: @_ZTC1D0_1B = global { [4 x ptr], [4 x ptr] } { +// LLVM-COMMON: @_ZTC1D0_1B = constant { [4 x ptr], [4 x ptr] } { // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr null, ptr @_ZN1B1wEv], // LLVM-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr @_ZTI1B, ptr @_ZN1B1wEv], // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr null, ptr @_ZN1A1vEv] @@ -194,7 +194,7 @@ void D::y() {} // CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 4>}> // CIR-COMMON-SAME: : ![[REC_B_OR_C_IN_D_VTABLE]] -// LLVM-COMMON: @_ZTC1D16_1C = global { [4 x ptr], [4 x ptr] } { +// LLVM-COMMON: @_ZTC1D16_1C = constant { [4 x ptr], [4 x ptr] } { // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr null, ptr @_ZN1C1xEv], // LLVM-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr @_ZTI1C, ptr @_ZN1C1xEv], // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -24 to ptr), ptr null, ptr @_ZN1A1vEv] @@ -211,7 +211,7 @@ void D::y() {} // RTTI class type info for D -// CIR-RTTI: cir.globa{{.*}} @_ZTVN10__cxxabiv121__vmi_class_type_infoE : !cir.ptr<!cir.ptr<!u8i>> +// CIR-RTTI: cir.global{{.*}} @_ZTVN10__cxxabiv121__vmi_class_type_infoE : !cir.ptr<!cir.ptr<!u8i>> // CIR-RTTI: cir.global{{.*}} @_ZTS1D = #cir.const_array<"1D" : !cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> @@ -227,7 +227,7 @@ void D::y() {} // CIR-RTTI: cir.global{{.*}} @_ZTV1A : !rec_anon_struct3 // LLVM-RTTI: @_ZTVN10__cxxabiv121__vmi_class_type_infoE = external global ptr -// LLVM-RTTI: @_ZTS1D = global [3 x i8] c"1D\00", align 1 +// LLVM-RTTI: @_ZTS1D = constant [3 x i8] c"1D\00", align 1 // LLVM-RTTI: @_ZTI1D = constant { ptr, ptr, i32, i32, ptr, i64, ptr, i64 } { // LLVM-RTTI-SAME: ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 16), diff --git a/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp b/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp index 201dd398bf745..54f6f9c54a69c 100644 --- a/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp +++ b/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp @@ -109,81 +109,81 @@ void use_F() { // B has a key function that is not defined in this translation unit so its vtable // has external linkage. -// CIR-DAG: cir.global "private" external @_ZTV1B : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1B = external {{.*}}{ [3 x ptr] }, align 8 +// CIR-DAG: cir.global "private" constant external @_ZTV1B : !{{.*}}{alignment = 8 : i64} +// LLVM-DAG: @_ZTV1B = external constant { [3 x ptr] }, align 8 // C has no key function, so its vtable should have weak_odr linkage // and hidden visibility. -// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1C = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1C> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1C1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 5>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1C = #cir.const_array<"1C" : !cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1C = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1C> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1C1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 5>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1C = #cir.const_array<"1C" : !cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : i64} // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1C = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv121__vmi_class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1C> : !cir.ptr<!u8i>, #cir.int<0> : !u32i, #cir.int<1> : !u32i, #cir.global_view<@_ZTI1B> : !cir.ptr<!u8i>, #cir.int<-8189> : !s64i}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global linkonce_odr comdat @_ZTT1C = #cir.const_array<[#cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 2> {alignment = 8 : i64} -// LLVM-DAG: @_ZTV1C = linkonce_odr {{.*}}{ [5 x ptr] } { [5 x ptr] [ptr null, ptr null, ptr null, ptr @_ZTI1C, ptr @_ZN1C1fEv] }, comdat, align 8 -// LLVM-DAG: @_ZTS1C = linkonce_odr {{.*}}[{{[0-9]}} x i8] c"1C\00", comdat, align 1 -// LLVM-DAG: @_ZTI1C = linkonce_odr {{.*}}{ ptr, ptr, i32, i32, ptr, i64 } { ptr getelementptr{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 {{.*}}), ptr @_ZTS1C, i32 0, i32 1, ptr @_ZTI1B, i64 -8189 }, comdat -// LLVM-DAG: @_ZTT1C = linkonce_odr {{.*}}[2 x ptr] [ptr getelementptr inbounds{{.*}}({{.*}}, ptr @_ZTV1C, {{.*}}, ptr getelementptr inbounds {{.*}}({{.*}}, ptr @_ZTV1C{{.*}})] +// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTT1C = #cir.const_array<[#cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 2> {alignment = 8 : i64} +// LLVM-DAG: @_ZTV1C = linkonce_odr constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr null, ptr null, ptr @_ZTI1C, ptr @_ZN1C1fEv] }, comdat, align 8 +// LLVM-DAG: @_ZTS1C = linkonce_odr constant [{{[0-9]}} x i8] c"1C\00", comdat, align 1 +// LLVM-DAG: @_ZTI1C = linkonce_odr constant { ptr, ptr, i32, i32, ptr, i64 } { ptr getelementptr{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 {{.*}}), ptr @_ZTS1C, i32 0, i32 1, ptr @_ZTI1B, i64 -8189 }, comdat +// LLVM-DAG: @_ZTT1C = linkonce_odr{{.*}} constant [2 x ptr] [ptr getelementptr inbounds{{.*}}({{.*}}, ptr @_ZTV1C, {{.*}}, ptr getelementptr inbounds {{.*}}({{.*}}, ptr @_ZTV1C{{.*}})] // D has a key function that is defined in this translation unit so its vtable is // defined in the translation unit. -// CIR-DAG: cir.global "private" external @_ZTV1D = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global external @_ZTS1D = #cir.const_array<"1D" : !cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant external @_ZTV1D = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant external @_ZTS1D = #cir.const_array<"1D" : !cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : i64} // CIR-DAG: cir.global constant external @_ZTI1D = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1D> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1D = {{(constant|global)}} { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1D, ptr @_ZN1D1fEv] }, align 8 -// LLVM-DAG: @_ZTS1D = {{(constant|global)}} [{{[0-9]}} x i8] c"1D\00", align 1 +// LLVM-DAG: @_ZTV1D = constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1D, ptr @_ZN1D1fEv] }, align 8 +// LLVM-DAG: @_ZTS1D = constant [{{[0-9]}} x i8] c"1D\00", align 1 // LLVM-DAG: @_ZTI1D = constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{[0-9]+}}), ptr @_ZTS1D }, align 8 // E<char> is an explicit specialization with a key function defined // in this translation unit, so its vtable should have external // linkage. -// CIR-DAG: cir.global "private" external @_ZTV1EIcE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1EIcE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIcE6anchorEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global external @_ZTS1EIcE = #cir.const_array<"1EIcE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant external @_ZTV1EIcE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1EIcE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIcE6anchorEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant external @_ZTS1EIcE = #cir.const_array<"1EIcE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} // CIR-DAG: cir.global constant external @_ZTI1EIcE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1EIcE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1EIcE = {{(constant|global)}} { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1EIcE, ptr @_ZN1EIcE6anchorEv] }, align 8 -// LLVM-DAG: @_ZTS1EIcE = {{(constant|global)}} [6 x i8] c"1EIcE\00", align 1 +// LLVM-DAG: @_ZTV1EIcE = constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1EIcE, ptr @_ZN1EIcE6anchorEv] }, align 8 +// LLVM-DAG: @_ZTS1EIcE = constant [6 x i8] c"1EIcE\00", align 1 // LLVM-DAG: @_ZTI1EIcE = constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTS1EIcE }, align 8 // E<short> is an explicit template instantiation with a key function // defined in this translation unit, so its vtable should have // weak_odr linkage. -// CIR-DAG: cir.global "private" weak_odr comdat @_ZTV1EIsE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1EIsE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED1Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED0Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global "private" constant weak_odr comdat @_ZTV1EIsE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1EIsE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED1Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED0Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} // CIR-DAG: cir.global constant weak_odr comdat @_ZTI1EIsE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1EIsE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global weak_odr comdat @_ZTS1EIsE = #cir.const_array<"1EIsE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} -// LLVM-DAG: @_ZTV1EIsE = weak_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1EIsE, ptr @_ZN1EIsED1Ev, ptr @_ZN1EIsED0Ev] }, comdat, align 8 +// CIR-DAG: cir.global constant weak_odr comdat @_ZTS1EIsE = #cir.const_array<"1EIsE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} +// LLVM-DAG: @_ZTV1EIsE = weak_odr constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1EIsE, ptr @_ZN1EIsED1Ev, ptr @_ZN1EIsED0Ev] }, comdat, align 8 // LLVM-DAG: @_ZTI1EIsE = weak_odr constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTS1EIsE }, comdat -// LLVM-DAG: @_ZTS1EIsE = weak_odr {{.*}}[6 x i8] c"1EIsE\00", comdat +// LLVM-DAG: @_ZTS1EIsE = weak_odr constant [6 x i8] c"1EIsE\00", comdat // F<short> is an explicit template instantiation without a key // function, so its vtable should have weak_odr linkage -// CIR-DAG: cir.global "private" weak_odr comdat @_ZTV1FIsE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1FIsE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1FIsE3fooEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global weak_odr comdat @_ZTS1FIsE = #cir.const_array<"1FIsE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant weak_odr comdat @_ZTV1FIsE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1FIsE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1FIsE3fooEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant weak_odr comdat @_ZTS1FIsE = #cir.const_array<"1FIsE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} // CIR-DAG: cir.global constant weak_odr comdat @_ZTI1FIsE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1FIsE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1FIsE = weak_odr {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1FIsE, ptr @_ZN1FIsE3fooEv] }, comdat, align 8 -// LLVM-DAG: @_ZTS1FIsE = weak_odr {{.*}}[6 x i8] c"1FIsE\00", comdat, align 1 +// LLVM-DAG: @_ZTV1FIsE = weak_odr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1FIsE, ptr @_ZN1FIsE3fooEv] }, comdat, align 8 +// LLVM-DAG: @_ZTS1FIsE = weak_odr constant [6 x i8] c"1FIsE\00", comdat, align 1 // LLVM-DAG: @_ZTI1FIsE = weak_odr constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTS1FIsE }, comdat // E<long> is an implicit template instantiation with a key function // defined in this translation unit, so its vtable should have // linkonce_odr linkage. -// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1EIlE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1EIlE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED1Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED0Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1EIlE = #cir.const_array<"1EIlE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1EIlE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1EIlE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED1Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED0Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1EIlE = #cir.const_array<"1EIlE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1EIlE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1EIlE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1EIlE = linkonce_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1EIlE, ptr @_ZN1EIlED1Ev, ptr @_ZN1EIlED0Ev] }, comdat, align 8 -// LLVM-DAG: @_ZTS1EIlE = linkonce_odr {{.*}}[6 x i8] c"1EIlE\00", comdat, align 1 +// LLVM-DAG: @_ZTV1EIlE = linkonce_odr constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1EIlE, ptr @_ZN1EIlED1Ev, ptr @_ZN1EIlED0Ev] }, comdat, align 8 +// LLVM-DAG: @_ZTS1EIlE = linkonce_odr constant [6 x i8] c"1EIlE\00", comdat, align 1 // LLVM-DAG: @_ZTI1EIlE = linkonce_odr constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTS1EIlE }, comdat // F<long> is an implicit template instantiation with no key function, // so its vtable should have linkonce_odr linkage. -// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1FIlE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1FIlE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1FIlE3fooEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1FIlE = #cir.const_array<"1FIlE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1FIlE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1FIlE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1FIlE3fooEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1FIlE = #cir.const_array<"1FIlE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1FIlE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1FIlE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1FIlE = linkonce_odr {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1FIlE, ptr @_ZN1FIlE3fooEv] }, comdat, align 8 -// LLVM-DAG: @_ZTS1FIlE = linkonce_odr {{.*}}[6 x i8] c"1FIlE\00", comdat, align 1 +// LLVM-DAG: @_ZTV1FIlE = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1FIlE, ptr @_ZN1FIlE3fooEv] }, comdat, align 8 +// LLVM-DAG: @_ZTS1FIlE = linkonce_odr constant [6 x i8] c"1FIlE\00", comdat, align 1 // LLVM-DAG: @_ZTI1FIlE = linkonce_odr constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTS1FIlE }, comdat // F<int> is an explicit template instantiation declaration without a // key function, so its vtable should have external linkage. -// CIR-DAG: cir.global "private" external @_ZTV1FIiE : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1FIiE = external {{.*}}{ [3 x ptr] }, align 8 +// CIR-DAG: cir.global "private" constant external @_ZTV1FIiE : !{{.*}}{alignment = 8 : i64} +// LLVM-DAG: @_ZTV1FIiE = external constant { [3 x ptr] }, align 8 // E<int> is an explicit template instantiation declaration. It has a // key function is not instantiated, so we know that vtable definition @@ -191,38 +191,38 @@ void use_F() { // so we can mark it as external (without optimizations) and // available_externally (with optimizations) because all of the inline // virtual functions have been emitted. -// CIR-DAG: cir.global "private" external @_ZTV1EIiE : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1EIiE = external {{.*}}{ [4 x ptr] }, align 8 +// CIR-DAG: cir.global "private" constant external @_ZTV1EIiE : !{{.*}}{alignment = 8 : i64} +// LLVM-DAG: @_ZTV1EIiE = external constant { [4 x ptr] }, align 8 // The anonymous struct for e has no linkage, so the vtable should have // internal linkage. -// CIR-DAG: cir.global "private" internal dso_local @_ZTV3$_0 = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI3$_0> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global internal dso_local @_ZTS3$_0 = #cir.const_array<"3$_0" : !cir.array<!s8i x 4>, trailing_zeros> : !cir.array<!s8i x 5> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant internal dso_local @_ZTV3$_0 = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI3$_0> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant internal dso_local @_ZTS3$_0 = #cir.const_array<"3$_0" : !cir.array<!s8i x 4>, trailing_zeros> : !cir.array<!s8i x 5> {alignment = 1 : i64} // CIR-DAG: cir.global constant internal @_ZTI3$_0 = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv120__si_class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS3$_0> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @"_ZTV3$_0" = internal {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, ptr @"_ZTI3$_0", ptr @_ZN1D1fEv] }, align 8 -// LLVM-DAG: @"_ZTS3$_0" = internal {{.*}}[5 x i8] c"3$_0\00", align 1 +// LLVM-DAG: @"_ZTV3$_0" = internal constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @"_ZTI3$_0", ptr @_ZN1D1fEv] }, align 8 +// LLVM-DAG: @"_ZTS3$_0" = internal constant [5 x i8] c"3$_0\00", align 1 // LLVM-DAG: @"_ZTI3$_0" = internal constant { ptr, ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 {{.*}}), ptr @"_ZTS3$_0", ptr @_ZTI1D }, align 8 // The A vtable should have internal linkage since it is inside an anonymous // namespace. -// CIR-DAG: cir.global "private" internal dso_local @_ZTVN12_GLOBAL__N_11AE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTIN12_GLOBAL__N_11AE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN12_GLOBAL__N_11A1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global internal dso_local @_ZTSN12_GLOBAL__N_11AE = #cir.const_array<"N12_GLOBAL__N_11AE" : !cir.array<!s8i x 18>, trailing_zeros> : !cir.array<!s8i x 19> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant internal dso_local @_ZTVN12_GLOBAL__N_11AE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTIN12_GLOBAL__N_11AE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN12_GLOBAL__N_11A1fEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant internal dso_local @_ZTSN12_GLOBAL__N_11AE = #cir.const_array<"N12_GLOBAL__N_11AE" : !cir.array<!s8i x 18>, trailing_zeros> : !cir.array<!s8i x 19> {alignment = 1 : i64} // CIR-DAG: cir.global constant internal @_ZTIN12_GLOBAL__N_11AE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTSN12_GLOBAL__N_11AE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTVN12_GLOBAL__N_11AE = internal {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTIN12_GLOBAL__N_11AE, ptr @_ZN12_GLOBAL__N_11A1fEv] }, align 8 -// LLVM-DAG: @_ZTSN12_GLOBAL__N_11AE = internal {{.*}}[19 x i8] c"N12_GLOBAL__N_11AE\00", align 1 +// LLVM-DAG: @_ZTVN12_GLOBAL__N_11AE = internal constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTIN12_GLOBAL__N_11AE, ptr @_ZN12_GLOBAL__N_11A1fEv] }, align 8 +// LLVM-DAG: @_ZTSN12_GLOBAL__N_11AE = internal constant [19 x i8] c"N12_GLOBAL__N_11AE\00", align 1 // LLVM-DAG: @_ZTIN12_GLOBAL__N_11AE = internal constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTSN12_GLOBAL__N_11AE }, align 8 // F<char> is an explicit specialization without a key function, so // its vtable should have linkonce_odr linkage. -// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1FIcE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1FIcE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1FIcE3fooEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1FIcE = #cir.const_array<"1FIcE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} +// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1FIcE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1FIcE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1FIcE3fooEv> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1FIcE = #cir.const_array<"1FIcE" : !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : i64} // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1FIcE = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1FIcE> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1FIcE = linkonce_odr {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1FIcE, ptr @_ZN1FIcE3fooEv] }, comdat, align 8 -// LLVM-DAG: @_ZTS1FIcE = linkonce_odr {{.*}}[6 x i8] c"1FIcE\00", comdat, align 1 +// LLVM-DAG: @_ZTV1FIcE = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1FIcE, ptr @_ZN1FIcE3fooEv] }, comdat, align 8 +// LLVM-DAG: @_ZTS1FIcE = linkonce_odr constant [6 x i8] c"1FIcE\00", comdat, align 1 // LLVM-DAG: @_ZTI1FIcE = linkonce_odr constant { ptr, ptr } { ptr getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr @_ZTS1FIcE }, comdat -// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1GIiE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1GIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f0Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f1Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1GIiE = linkonce_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1GIiE, ptr @_ZN1GIiE2f0Ev, ptr @_ZN1GIiE2f1Ev] }, comdat, align 8 +// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1GIiE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1GIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f0Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f1Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} +// LLVM-DAG: @_ZTV1GIiE = linkonce_odr constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1GIiE, ptr @_ZN1GIiE2f0Ev, ptr @_ZN1GIiE2f1Ev] }, comdat, align 8 template <typename T> class G { public: @@ -238,8 +238,8 @@ void G_f0() { new G<int>(); } // H<int> has a key function without a body but it's a template instantiation // so its VTable must be emitted. -// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1HIiE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1HIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED1Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED0Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} -// LLVM-DAG: @_ZTV1HIiE = linkonce_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1HIiE, ptr @_ZN1HIiED1Ev, ptr @_ZN1HIiED0Ev] }, comdat, align 8 +// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1HIiE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1HIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED1Ev> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED0Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64} +// LLVM-DAG: @_ZTV1HIiE = linkonce_odr constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr @_ZTI1HIiE, ptr @_ZN1HIiED1Ev, ptr @_ZN1HIiED0Ev] }, comdat, align 8 template <typename T> class H { public: @@ -253,10 +253,10 @@ void use_H() { // I<int> has an explicit instantiation declaration and needs a VTT and // construction vtables. -// CIR-DAG: cir.global "private" external @_ZTV1IIiE : !{{.*}}{alignment = 8 : i64} -// CIR-DAG: cir.global "private" external @_ZTT1IIiE : !cir.array<!cir.ptr<!u8i> x 4> {alignment = 8 : i64} -// LLVM-DAG: @_ZTV1IIiE = external {{.*}}{ [5 x ptr] }, align 8 -// LLVM-DAG: @_ZTT1IIiE = external {{.*}}[4 x ptr], align 8 +// CIR-DAG: cir.global "private" constant external @_ZTV1IIiE : !{{.*}}{alignment = 8 : i64} +// CIR-DAG: cir.global "private" constant external @_ZTT1IIiE : !cir.array<!cir.ptr<!u8i> x 4> {alignment = 8 : i64} +// LLVM-DAG: @_ZTV1IIiE = external constant { [5 x ptr] }, align 8 +// LLVM-DAG: @_ZTT1IIiE = external {{.*}}constant [4 x ptr], align 8 struct VBase1 { virtual void f(); }; struct VBase2 : virtual VBase1 {}; template<typename T> struct I : VBase2 {}; diff --git a/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp b/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp index 1372d86a3d15e..c2fca1bd744bc 100644 --- a/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp +++ b/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp @@ -13,8 +13,8 @@ struct Struct { void Struct::f3(){} -// CIR: cir.global "private" external @_ZTV6Struct = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI6Struct> : !cir.ptr<!u8i>, #cir.global_view<@__cxa_pure_virtual> : !cir.ptr<!u8i>, #cir.global_view<@__cxa_deleted_virtual> : !cir.ptr<!u8i>, #cir.global_view<@_ZN6Struct2f3Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 5>}> -// LLVM: @_ZTV6Struct = {{.*}}{ [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTI6Struct, ptr @__cxa_pure_virtual, ptr @__cxa_deleted_virtual, ptr @_ZN6Struct2f3Ev] } +// CIR: cir.global "private" constant external @_ZTV6Struct = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI6Struct> : !cir.ptr<!u8i>, #cir.global_view<@__cxa_pure_virtual> : !cir.ptr<!u8i>, #cir.global_view<@__cxa_deleted_virtual> : !cir.ptr<!u8i>, #cir.global_view<@_ZN6Struct2f3Ev> : !cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 5>}> +// LLVM: @_ZTV6Struct = constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr @_ZTI6Struct, ptr @__cxa_pure_virtual, ptr @__cxa_deleted_virtual, ptr @_ZN6Struct2f3Ev] } // CIR: cir.global constant external @_ZTI6Struct = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS6Struct> : !cir.ptr<!u8i>}> // LLVM-CIR: @_ZTI6Struct = constant { ptr, ptr } { ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 16), ptr @_ZTS6Struct } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
