clang 19.0.0git
Public Member Functions | List of all members
clang::CodeGen::CodeGenVTables Class Reference

#include "/home/buildbot/as-worker-4/publish-doxygen-docs/llvm-project/clang/lib/CodeGen/CGVTables.h"

Public Member Functions

void createVTableInitializer (ConstantStructBuilder &builder, const VTableLayout &layout, llvm::Constant *rtti, bool vtableHasLocalLinkage)
 Add vtable components for the given vtable layout to the given global initializer.
 
 CodeGenVTables (CodeGenModule &CGM)
 
ItaniumVTableContextgetItaniumVTableContext ()
 
const ItaniumVTableContextgetItaniumVTableContext () const
 
MicrosoftVTableContextgetMicrosoftVTableContext ()
 
uint64_t getSubVTTIndex (const CXXRecordDecl *RD, BaseSubobject Base)
 getSubVTTIndex - Return the index of the sub-VTT for the base class of the given record decl.
 
uint64_t getSecondaryVirtualPointerIndex (const CXXRecordDecl *RD, BaseSubobject Base)
 getSecondaryVirtualPointerIndex - Return the index in the VTT where the virtual pointer for the given subobject is located.
 
llvm::GlobalVariable * GenerateConstructionVTable (const CXXRecordDecl *RD, const BaseSubobject &Base, bool BaseIsVirtual, llvm::GlobalVariable::LinkageTypes Linkage, VTableAddressPointsMapTy &AddressPoints)
 GenerateConstructionVTable - Generate a construction vtable for the given base subobject.
 
llvm::GlobalVariable * GetAddrOfVTT (const CXXRecordDecl *RD)
 GetAddrOfVTT - Get the address of the VTT for the given record decl.
 
void EmitVTTDefinition (llvm::GlobalVariable *VTT, llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD)
 EmitVTTDefinition - Emit the definition of the given vtable.
 
void EmitThunks (GlobalDecl GD)
 EmitThunks - Emit the associated thunks for the given global decl.
 
void GenerateClassData (const CXXRecordDecl *RD)
 GenerateClassData - Generate all the class data required to be generated upon definition of a KeyFunction.
 
bool isVTableExternal (const CXXRecordDecl *RD)
 At this point in the translation unit, does it appear that can we rely on the vtable being defined elsewhere in the program?
 
llvm::Type * getVTableType (const VTableLayout &layout)
 Returns the type of a vtable with the given layout.
 
void GenerateRelativeVTableAlias (llvm::GlobalVariable *VTable, llvm::StringRef AliasNameRef)
 Generate a public facing alias for the vtable and make the vtable either hidden or private.
 
void RemoveHwasanMetadata (llvm::GlobalValue *GV) const
 Specify a global should not be instrumented with hwasan.
 

Detailed Description

Definition at line 32 of file CGVTables.h.

Constructor & Destructor Documentation

◆ CodeGenVTables()

CodeGenVTables::CodeGenVTables ( CodeGenModule CGM)

Definition at line 32 of file CGVTables.cpp.

Member Function Documentation

◆ createVTableInitializer()

void CodeGenVTables::createVTableInitializer ( ConstantStructBuilder builder,
const VTableLayout layout,
llvm::Constant *  rtti,
bool  vtableHasLocalLinkage 
)

◆ EmitThunks()

void CodeGenVTables::EmitThunks ( GlobalDecl  GD)

EmitThunks - Emit the associated thunks for the given global decl.

Definition at line 600 of file CGVTables.cpp.

References clang::Dtor_Base, clang::CXXMethodDecl::getCanonicalDecl(), clang::GlobalDecl::getDecl(), clang::GlobalDecl::getDtorType(), and clang::VTableContextBase::getThunkInfo().

◆ EmitVTTDefinition()

void CodeGenVTables::EmitVTTDefinition ( llvm::GlobalVariable *  VTT,
llvm::GlobalVariable::LinkageTypes  Linkage,
const CXXRecordDecl RD 
)

◆ GenerateClassData()

void CodeGenVTables::GenerateClassData ( const CXXRecordDecl RD)

GenerateClassData - 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).

Definition at line 1142 of file CGVTables.cpp.

References clang::CodeGen::CGCXXABI::emitVirtualInheritanceTables(), clang::CodeGen::CGCXXABI::emitVTableDefinitions(), clang::CodeGen::CodeGenModule::getCXXABI(), clang::CodeGen::CodeGenModule::getModuleDebugInfo(), and clang::CXXRecordDecl::getNumVBases().

Referenced by clang::CodeGen::CodeGenModule::EmitVTable().

◆ GenerateConstructionVTable()

llvm::GlobalVariable * CodeGenVTables::GenerateConstructionVTable ( const CXXRecordDecl RD,
const BaseSubobject Base,
bool  BaseIsVirtual,
llvm::GlobalVariable::LinkageTypes  Linkage,
VTableAddressPointsMapTy &  AddressPoints 
)

◆ GenerateRelativeVTableAlias()

void CodeGenVTables::GenerateRelativeVTableAlias ( llvm::GlobalVariable *  VTable,
llvm::StringRef  AliasNameRef 
)

Generate a public facing alias for the vtable and make the vtable either hidden or private.

The alias will have the original linkage and visibility of the vtable. This is used for cases under the relative vtables ABI when a vtable may not be dso_local.

Definition at line 984 of file CGVTables.cpp.

References getItaniumVTableContext(), and clang::CodeGen::CodeGenModule::getModule().

Referenced by GenerateConstructionVTable().

◆ GetAddrOfVTT()

llvm::GlobalVariable * CodeGenVTables::GetAddrOfVTT ( const CXXRecordDecl RD)

◆ getItaniumVTableContext() [1/2]

ItaniumVTableContext & clang::CodeGen::CodeGenVTables::getItaniumVTableContext ( )
inline

◆ getItaniumVTableContext() [2/2]

const ItaniumVTableContext & clang::CodeGen::CodeGenVTables::getItaniumVTableContext ( ) const
inline

Definition at line 95 of file CGVTables.h.

◆ getMicrosoftVTableContext()

MicrosoftVTableContext & clang::CodeGen::CodeGenVTables::getMicrosoftVTableContext ( )
inline

◆ getSecondaryVirtualPointerIndex()

uint64_t CodeGenVTables::getSecondaryVirtualPointerIndex ( const CXXRecordDecl RD,
BaseSubobject  Base 
)

getSecondaryVirtualPointerIndex - Return the index in the VTT where the virtual pointer for the given subobject is located.

Definition at line 163 of file CGVTT.cpp.

References clang::CodeGen::CodeGenModule::getContext().

◆ getSubVTTIndex()

uint64_t CodeGenVTables::getSubVTTIndex ( const CXXRecordDecl RD,
BaseSubobject  Base 
)

getSubVTTIndex - Return the index of the sub-VTT for the base class of the given record decl.

Definition at line 137 of file CGVTT.cpp.

References clang::CodeGen::CodeGenModule::getContext().

◆ getVTableType()

llvm::Type * CodeGenVTables::getVTableType ( const VTableLayout layout)

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.

Definition at line 852 of file CGVTables.cpp.

References clang::CodeGen::CodeGenModule::getLLVMContext(), clang::VTableLayout::getNumVTables(), and clang::VTableLayout::getVTableSize().

Referenced by GenerateConstructionVTable().

◆ isVTableExternal()

bool CodeGenVTables::isVTableExternal ( const CXXRecordDecl RD)

At this point in the translation unit, does it appear that can we rely on the vtable being defined elsewhere in the program?

The response is really only definitive when called at the end of the translation unit.

The only semantic restriction here is that the object file should not contain a vtable definition when that vtable is defined strongly elsewhere. Otherwise, we'd just like to avoid emitting vtables when unnecessary.

Definition at line 1162 of file CGVTables.cpp.

References clang::CodeGen::CodeGenModule::getContext(), clang::ASTContext::getCurrentKeyFunction(), clang::TargetInfo::getCXXABI(), clang::CodeGen::CodeGenModule::getTarget(), clang::CXXRecordDecl::getTemplateSpecializationKind(), clang::FunctionDecl::hasBody(), clang::CXXRecordDecl::isDynamicClass(), clang::Decl::isInAnotherModuleUnit(), clang::FunctionDecl::isInlineSpecified(), clang::TargetCXXABI::isMicrosoft(), clang::TSK_ExplicitInstantiationDeclaration, clang::TSK_ExplicitInstantiationDefinition, and clang::TSK_ImplicitInstantiation.

Referenced by shouldEmitVTableAtEndOfTranslationUnit(), and ShouldUseExternalRTTIDescriptor().

◆ RemoveHwasanMetadata()

void CodeGenVTables::RemoveHwasanMetadata ( llvm::GlobalValue *  GV) const

Specify a global should not be instrumented with hwasan.

Definition at line 968 of file CGVTables.cpp.

References clang::CodeGen::CodeGenModule::getLangOpts(), clang::SanitizerSet::has(), and clang::LangOptions::Sanitize.

Referenced by GenerateConstructionVTable().


The documentation for this class was generated from the following files: