Skip to content

Commit 3aed38c

Browse files
committed
[CIR][CIRGen] Teach all uses of ApplyNonVirtualAndVirtualOffset to use BaseClassAddrOp
1 parent c10f493 commit 3aed38c

File tree

3 files changed

+20
-29
lines changed

3 files changed

+20
-29
lines changed

clang/lib/CIR/CodeGen/CIRGenClass.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -662,21 +662,19 @@ static Address ApplyNonVirtualAndVirtualOffset(
662662
// Compute the offset from the static and dynamic components.
663663
mlir::Value baseOffset;
664664
if (!nonVirtualOffset.isZero()) {
665-
mlir::Type OffsetType =
666-
(CGF.CGM.getTarget().getCXXABI().isItaniumFamily() &&
667-
CGF.CGM.getItaniumVTableContext().isRelativeLayout())
668-
? CGF.SInt32Ty
669-
: CGF.PtrDiffTy;
670-
baseOffset = CGF.getBuilder().getConstInt(loc, OffsetType,
671-
nonVirtualOffset.getQuantity());
672665
if (virtualOffset) {
666+
mlir::Type OffsetType =
667+
(CGF.CGM.getTarget().getCXXABI().isItaniumFamily() &&
668+
CGF.CGM.getItaniumVTableContext().isRelativeLayout())
669+
? CGF.SInt32Ty
670+
: CGF.PtrDiffTy;
671+
baseOffset = CGF.getBuilder().getConstInt(loc, OffsetType,
672+
nonVirtualOffset.getQuantity());
673673
baseOffset = CGF.getBuilder().createBinop(
674674
virtualOffset, cir::BinOpKind::Add, baseOffset);
675-
} else if (baseValueTy) {
676-
// TODO(cir): this should be used as a firt class in this function for the
677-
// nonVirtualOffset cases, but all users of this function need to be
678-
// updated first.
679-
baseOffset.getDefiningOp()->erase();
675+
} else {
676+
assert(baseValueTy && "expected base type");
677+
// If no virtualOffset is present this is the final stop.
680678
return CGF.getBuilder().createBaseClassAddr(
681679
loc, addr, baseValueTy, nonVirtualOffset.getQuantity(),
682680
assumeNotNull);
@@ -725,6 +723,7 @@ void CIRGenFunction::initializeVTablePointer(mlir::Location loc,
725723
mlir::Value VirtualOffset{};
726724
CharUnits NonVirtualOffset = CharUnits::Zero();
727725

726+
mlir::Type BaseValueTy;
728727
if (CGM.getCXXABI().isVirtualOffsetNeededForVTableField(*this, Vptr)) {
729728
// We need to use the virtual base offset offset because the virtual base
730729
// might have a different offset in the most derived class.
@@ -734,14 +733,15 @@ void CIRGenFunction::initializeVTablePointer(mlir::Location loc,
734733
} else {
735734
// We can just use the base offset in the complete class.
736735
NonVirtualOffset = Vptr.Base.getBaseOffset();
736+
BaseValueTy = convertType(getContext().getTagDeclType(Vptr.Base.getBase()));
737737
}
738738

739739
// Apply the offsets.
740740
Address VTableField = LoadCXXThisAddress();
741741
if (!NonVirtualOffset.isZero() || VirtualOffset) {
742742
VTableField = ApplyNonVirtualAndVirtualOffset(
743743
loc, *this, VTableField, NonVirtualOffset, VirtualOffset,
744-
Vptr.VTableClass, Vptr.NearestVBase);
744+
Vptr.VTableClass, Vptr.NearestVBase, BaseValueTy);
745745
}
746746

747747
// Finally, store the address point. Use the same CIR types as the field.

clang/test/CIR/CodeGen/multi-vtable.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,8 @@ int main() {
5555
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_Child>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
5656
// CIR: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>, !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
5757
// CIR: %{{[0-9]+}} = cir.vtable.address_point(@_ZTV5Child, vtable_index = 1, address_point_index = 2) : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>
58-
// CIR: %{{[0-9]+}} = cir.const #cir.int<8> : !s64i
59-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_Child>), !cir.ptr<!u8i>
60-
// CIR: %{{[0-9]+}} = cir.ptr_stride(%{{[0-9]+}} : !cir.ptr<!u8i>, %{{[0-9]+}} : !s64i), !cir.ptr<!u8i>
61-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!u8i>), !cir.ptr<!ty_Child>
62-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_Child>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
58+
// CIR: %7 = cir.base_class_addr(%1 : !cir.ptr<!ty_Child> nonnull) [8] -> !cir.ptr<!ty_Father>
59+
// CIR: %8 = cir.cast(bitcast, %7 : !cir.ptr<!ty_Father>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>> loc(#loc8)
6360
// CIR: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>, !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
6461
// CIR: cir.return
6562
// CIR: }
@@ -70,7 +67,7 @@ int main() {
7067

7168
// LLVM-DAG: define linkonce_odr void @_ZN5ChildC2Ev(ptr %0)
7269
// LLVM-DAG: store ptr getelementptr inbounds ({ [4 x ptr], [3 x ptr] }, ptr @_ZTV5Child, i32 0, i32 0, i32 2), ptr %{{[0-9]+}}, align 8
73-
// LLVM-DAG: %{{[0-9]+}} = getelementptr i8, ptr %3, i64 8
70+
// LLVM-DAG: %{{[0-9]+}} = getelementptr i8, ptr {{.*}}, i32 8
7471
// LLVM-DAG: store ptr getelementptr inbounds ({ [4 x ptr], [3 x ptr] }, ptr @_ZTV5Child, i32 0, i32 1, i32 2), ptr %{{[0-9]+}}, align 8
7572
// LLVM-DAG: ret void
7673
// }

clang/test/CIR/CodeGen/vtt.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,13 @@ int f() {
120120
// CIR: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>, !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
121121
// CIR: %{{[0-9]+}} = cir.vtable.address_point(@_ZTV1D, vtable_index = 2, address_point_index = 3) : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>
122122

123-
// CIR: %{{[0-9]+}} = cir.const #cir.int<40> : !s64i
124-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_D>), !cir.ptr<!u8i>
125-
// CIR: %{{[0-9]+}} = cir.ptr_stride(%{{[0-9]+}} : !cir.ptr<!u8i>, %{{[0-9]+}} : !s64i), !cir.ptr<!u8i>
126-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!u8i>), !cir.ptr<!ty_D>
127-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_D>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
123+
// CIR: %{{[0-9]+}} = cir.base_class_addr(%{{[0-9]+}} : !cir.ptr<!ty_D> nonnull) [40] -> !cir.ptr<!ty_A>
124+
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_A>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
128125
// CIR: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>, !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
129126
// CIR: %{{[0-9]+}} = cir.vtable.address_point(@_ZTV1D, vtable_index = 1, address_point_index = 3) : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>
130127

131-
// CIR: %{{[0-9]+}} = cir.const #cir.int<16> : !s64i
132-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_D>), !cir.ptr<!u8i>
133-
// CIR: %{{[0-9]+}} = cir.ptr_stride(%{{[0-9]+}} : !cir.ptr<!u8i>, %{{[0-9]+}} : !s64i), !cir.ptr<!u8i>
134-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!u8i>), !cir.ptr<!ty_D>
135-
// CIR: %{{[0-9]+}} = cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_D>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
128+
// CIR: cir.base_class_addr(%{{[0-9]+}} : !cir.ptr<!ty_D> nonnull) [16] -> !cir.ptr<!ty_C>
129+
// CIR: cir.cast(bitcast, %{{[0-9]+}} : !cir.ptr<!ty_C>), !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
136130
// CIR: cir.store %{{[0-9]+}}, %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>, !cir.ptr<!cir.ptr<!cir.ptr<!cir.func<!u32i ()>>>>
137131
// CIR: cir.return
138132
// CIR: }

0 commit comments

Comments
 (0)