@@ -736,12 +736,27 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
736
736
const CXXRecordDecl *VTableClass,
737
737
CharUnits Offset) {
738
738
const ASTRecordLayout &Layout = CGM.getASTContext ().getASTRecordLayout (RD);
739
-
740
739
if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {
741
740
// Add a vtable pointer, if we need one and it hasn't already been added.
742
- if (Layout.hasOwnVFPtr ())
743
- llvm_unreachable (" NYI" );
744
-
741
+ if (Layout.hasOwnVFPtr ()) {
742
+ CIRGenBuilderTy &builder = CGM.getBuilder ();
743
+ cir::GlobalOp vtable =
744
+ CGM.getCXXABI ().getAddrOfVTable (VTableClass, CharUnits ());
745
+ clang::VTableLayout::AddressPointLocation addressPoint =
746
+ CGM.getItaniumVTableContext ()
747
+ .getVTableLayout (VTableClass)
748
+ .getAddressPoint (BaseSubobject (CD, Offset));
749
+ assert (!cir::MissingFeatures::ptrAuth ());
750
+ mlir::ArrayAttr indices = builder.getArrayAttr ({
751
+ builder.getI32IntegerAttr (0 ),
752
+ builder.getI32IntegerAttr (addressPoint.VTableIndex ),
753
+ builder.getI32IntegerAttr (addressPoint.AddressPointIndex ),
754
+ });
755
+ cir::GlobalViewAttr vtableInit =
756
+ CGM.getBuilder ().getGlobalViewAttr (vtable, indices);
757
+ if (!AppendBytes (Offset, vtableInit))
758
+ return false ;
759
+ }
745
760
// Accumulate and sort bases, in order to visit them in address order, which
746
761
// may not be the same as declaration order.
747
762
SmallVector<BaseInfo, 8 > Bases;
0 commit comments