diff --git a/clang/lib/CodeGen/CGCXXABI.h b/clang/lib/CodeGen/CGCXXABI.h --- a/clang/lib/CodeGen/CGCXXABI.h +++ b/clang/lib/CodeGen/CGCXXABI.h @@ -209,6 +209,12 @@ llvm::Value *MemPtr, const MemberPointerType *MPT); + /// Create and set the initializer for the vtable. + virtual void SetVTableInitializer(CodeGenVTables &CGVT, + llvm::GlobalVariable *VTable, + const VTableLayout &VTLayout, + llvm::Constant *RTTI); + protected: /// A utility method for computing the offset required for the given /// base-to-derived or derived-to-base member-pointer conversion. diff --git a/clang/lib/CodeGen/CGCXXABI.cpp b/clang/lib/CodeGen/CGCXXABI.cpp --- a/clang/lib/CodeGen/CGCXXABI.cpp +++ b/clang/lib/CodeGen/CGCXXABI.cpp @@ -14,6 +14,7 @@ #include "CGCXXABI.h" #include "CGCleanup.h" #include "clang/AST/Attr.h" +#include "clang/CodeGen/ConstantInitBuilder.h" using namespace clang; using namespace CodeGen; @@ -95,6 +96,16 @@ return CGF.Builder.getFalse(); } +void CGCXXABI::SetVTableInitializer(CodeGenVTables &CGVT, + llvm::GlobalVariable *VTable, + const VTableLayout &VTLayout, + llvm::Constant *RTTI) { + ConstantInitBuilder builder(CGM); + auto components = builder.beginStruct(); + CGVT.createVTableInitializer(components, VTLayout, RTTI); + components.finishAndSetAsInitializer(VTable); +} + llvm::Constant * CGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) { return GetBogusMemberPointer(QualType(MPT, 0)); diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -806,10 +806,7 @@ CGM.getContext().getTagDeclType(Base.getBase())); // Create and set the initializer. - ConstantInitBuilder builder(CGM); - auto components = builder.beginStruct(); - createVTableInitializer(components, *VTLayout, RTTI); - components.finishAndSetAsInitializer(VTable); + CGM.getCXXABI().SetVTableInitializer(*this, VTable, *VTLayout, RTTI); // Set properties only after the initializer has been set to ensure that the // GV is treated as definition and not declaration. diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -493,6 +493,20 @@ explicit FuchsiaCXXABI(CodeGen::CodeGenModule &CGM) : ItaniumCXXABI(CGM) {} + void SetVTableInitializer(CodeGenVTables &CGVT, llvm::GlobalVariable *VTable, + const VTableLayout &VTLayout, + llvm::Constant *RTTI) override { + ConstantInitBuilder builder(CGM); + auto components = builder.beginStruct(); + + // TODO: Replace this with CodeGenVTables::createRelativeVTableInitializer() + // once it is implemented. This will be the helper for the relative-vtables + // ABI. + CGVT.createVTableInitializer(components, VTLayout, RTTI); + + components.finishAndSetAsInitializer(VTable); + } + private: bool HasThisReturn(GlobalDecl GD) const override { return isa(GD.getDecl()) || @@ -1679,10 +1693,7 @@ CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD)); // Create and set the initializer. - ConstantInitBuilder Builder(CGM); - auto Components = Builder.beginStruct(); - CGVT.createVTableInitializer(Components, VTLayout, RTTI); - Components.finishAndSetAsInitializer(VTable); + SetVTableInitializer(CGVT, VTable, VTLayout, RTTI); // Set the correct linkage. VTable->setLinkage(Linkage); diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1690,10 +1690,7 @@ [](const VTableComponent &VTC) { return VTC.isRTTIKind(); })) RTTI = getMSCompleteObjectLocator(RD, *Info); - ConstantInitBuilder Builder(CGM); - auto Components = Builder.beginStruct(); - CGVT.createVTableInitializer(Components, VTLayout, RTTI); - Components.finishAndSetAsInitializer(VTable); + SetVTableInitializer(CGVT, VTable, VTLayout, RTTI); emitVTableTypeMetadata(*Info, RD, VTable); }