//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This contains code dealing with C++ code generation of virtual tables. // //===----------------------------------------------------------------------===// #ifndef CLANG_LIB_CIR_CODEGEN_CIRGENVTABLES_H #define CLANG_LIB_CIR_CODEGEN_CIRGENVTABLES_H #include "mlir/IR/Types.h" #include "clang/AST/GlobalDecl.h" #include "clang/AST/VTableBuilder.h" #include "clang/CIR/Dialect/IR/CIRDialect.h" namespace clang { class CXXRecordDecl; } namespace clang::CIRGen { class CIRGenModule; class CIRGenVTables { CIRGenModule &cgm; clang::VTableContextBase *vtContext; /// Address points for a single vtable. using VTableAddressPointsMapTy = clang::VTableLayout::AddressPointsMapTy; using BaseSubobjectPairTy = std::pair; using SubVTTIndiciesMapTy = llvm::DenseMap; /// Contains indices into the various sub-VTTs. SubVTTIndiciesMapTy subVTTIndicies; using SecondaryVirtualPointerIndicesMapTy = llvm::DenseMap; /// Contains the secondary virtual pointer /// indices. SecondaryVirtualPointerIndicesMapTy secondaryVirtualPointerIndices; mlir::Attribute getVTableComponent(const VTableLayout &layout, unsigned componentIndex, mlir::Attribute rtti, unsigned &nextVTableThunkIndex, unsigned vtableAddressPoint, bool vtableHasLocalLinkage); mlir::Type getVTableComponentType(); public: CIRGenVTables(CIRGenModule &cgm); /// Add vtable components for the given vtable layout to the given /// global initializer. void createVTableInitializer(cir::GlobalOp &vtable, const clang::VTableLayout &layout, mlir::Attribute rtti, bool vtableHasLocalLinkage); clang::ItaniumVTableContext &getItaniumVTableContext() { return *llvm::cast(vtContext); } const clang::ItaniumVTableContext &getItaniumVTableContext() const { return *llvm::cast(vtContext); } /// Generate a construction vtable for the given base subobject. cir::GlobalOp generateConstructionVTable(const CXXRecordDecl *rd, const BaseSubobject &base, bool baseIsVirtual, cir::GlobalLinkageKind linkage, VTableAddressPointsMapTy &addressPoints); /// Get the address of the VTT for the given record decl. cir::GlobalOp getAddrOfVTT(const CXXRecordDecl *rd); /// Emit the definition of the given vtable. void emitVTTDefinition(cir::GlobalOp vttOp, cir::GlobalLinkageKind linkage, const CXXRecordDecl *rd); /// Return the index of the sub-VTT for the base class of the given record /// decl. uint64_t getSubVTTIndex(const CXXRecordDecl *rd, BaseSubobject base); /// Return the index in the VTT where the virtual pointer for the given /// subobject is located. uint64_t getSecondaryVirtualPointerIndex(const CXXRecordDecl *rd, BaseSubobject base); /// Emit the associated thunks for the given global decl. void emitThunks(GlobalDecl gd); /// Generate all the class data required to be generated upon definition of a /// KeyFunction. This includes the vtable, the RTTI data structure (if RTTI /// is enabled) and the VTT (if the class has virtual bases). void generateClassData(const CXXRecordDecl *rd); /// Returns the type of a vtable with the given layout. Normally a struct of /// arrays of pointers, with one struct element for each vtable in the vtable /// group. cir::RecordType getVTableType(const clang::VTableLayout &layout); }; } // namespace clang::CIRGen #endif // CLANG_LIB_CIR_CODEGEN_CIRGENVTABLES_H