brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 9c425ab Raw
114 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This contains code dealing with C++ code generation of virtual tables.10//11//===----------------------------------------------------------------------===//12 13#ifndef CLANG_LIB_CIR_CODEGEN_CIRGENVTABLES_H14#define CLANG_LIB_CIR_CODEGEN_CIRGENVTABLES_H15 16#include "mlir/IR/Types.h"17#include "clang/AST/GlobalDecl.h"18#include "clang/AST/VTableBuilder.h"19#include "clang/CIR/Dialect/IR/CIRDialect.h"20 21namespace clang {22class CXXRecordDecl;23}24 25namespace clang::CIRGen {26class CIRGenModule;27 28class CIRGenVTables {29  CIRGenModule &cgm;30 31  clang::VTableContextBase *vtContext;32 33  /// Address points for a single vtable.34  using VTableAddressPointsMapTy = clang::VTableLayout::AddressPointsMapTy;35  using BaseSubobjectPairTy =36      std::pair<const clang::CXXRecordDecl *, clang::BaseSubobject>;37  using SubVTTIndiciesMapTy = llvm::DenseMap<BaseSubobjectPairTy, uint64_t>;38 39  /// Contains indices into the various sub-VTTs.40  SubVTTIndiciesMapTy subVTTIndicies;41 42  using SecondaryVirtualPointerIndicesMapTy =43      llvm::DenseMap<BaseSubobjectPairTy, uint64_t>;44 45  /// Contains the secondary virtual pointer46  /// indices.47  SecondaryVirtualPointerIndicesMapTy secondaryVirtualPointerIndices;48 49  mlir::Attribute50  getVTableComponent(const VTableLayout &layout, unsigned componentIndex,51                     mlir::Attribute rtti, unsigned &nextVTableThunkIndex,52                     unsigned vtableAddressPoint, bool vtableHasLocalLinkage);53 54  mlir::Type getVTableComponentType();55 56public:57  CIRGenVTables(CIRGenModule &cgm);58 59  /// Add vtable components for the given vtable layout to the given60  /// global initializer.61  void createVTableInitializer(cir::GlobalOp &vtable,62                               const clang::VTableLayout &layout,63                               mlir::Attribute rtti,64                               bool vtableHasLocalLinkage);65 66  clang::ItaniumVTableContext &getItaniumVTableContext() {67    return *llvm::cast<clang::ItaniumVTableContext>(vtContext);68  }69 70  const clang::ItaniumVTableContext &getItaniumVTableContext() const {71    return *llvm::cast<clang::ItaniumVTableContext>(vtContext);72  }73 74  /// Generate a construction vtable for the given base subobject.75  cir::GlobalOp76  generateConstructionVTable(const CXXRecordDecl *rd, const BaseSubobject &base,77                             bool baseIsVirtual, cir::GlobalLinkageKind linkage,78                             VTableAddressPointsMapTy &addressPoints);79 80  /// Get the address of the VTT for the given record decl.81  cir::GlobalOp getAddrOfVTT(const CXXRecordDecl *rd);82 83  /// Emit the definition of the given vtable.84  void emitVTTDefinition(cir::GlobalOp vttOp, cir::GlobalLinkageKind linkage,85                         const CXXRecordDecl *rd);86  /// Return the index of the sub-VTT for the base class of the given record87  /// decl.88  uint64_t getSubVTTIndex(const CXXRecordDecl *rd, BaseSubobject base);89 90  /// Return the index in the VTT where the virtual pointer for the given91  /// subobject is located.92  uint64_t getSecondaryVirtualPointerIndex(const CXXRecordDecl *rd,93                                           BaseSubobject base);94 95  /// Emit the associated thunks for the given global decl.96  void emitThunks(GlobalDecl gd);97 98  /// Generate all the class data required to be generated upon definition of a99  /// KeyFunction. This includes the vtable, the RTTI data structure (if RTTI100  /// is enabled) and the VTT (if the class has virtual bases).101  void generateClassData(const CXXRecordDecl *rd);102 103  bool isVTableExternal(const clang::CXXRecordDecl *rd);104 105  /// Returns the type of a vtable with the given layout. Normally a struct of106  /// arrays of pointers, with one struct element for each vtable in the vtable107  /// group.108  cir::RecordType getVTableType(const clang::VTableLayout &layout);109};110 111} // namespace clang::CIRGen112 113#endif // CLANG_LIB_CIR_CODEGEN_CIRGENVTABLES_H114