class CodeGenVTables

Declaration

class CodeGenVTables { /* full declaration omitted */ };

Declared at: clang/lib/CodeGen/CGVTables.h:32

Member Variables

private clang::CodeGen::CodeGenModule& CGM
private clang::VTableContextBase* VTContext
private clang::CodeGen::CodeGenVTables:: SubVTTIndiciesMapTy SubVTTIndicies
SubVTTIndicies - Contains indices into the various sub-VTTs.
private clang::CodeGen::CodeGenVTables:: SecondaryVirtualPointerIndicesMapTy SecondaryVirtualPointerIndices
SecondaryVirtualPointerIndices - Contains the secondary virtual pointer indices.
private llvm::Constant* PureVirtualFn = nullptr
Cache for the pure virtual member call function.
private llvm::Constant* DeletedVirtualFn = nullptr
Cache for the deleted virtual member call function.

Method Overview

  • public CodeGenVTables(clang::CodeGen::CodeGenModule & CGM)
  • public void EmitThunks(clang::GlobalDecl GD)
  • public void EmitVTTDefinition(llvm::GlobalVariable * VTT, llvm::GlobalVariable::LinkageTypes Linkage, const clang::CXXRecordDecl * RD)
  • public void GenerateClassData(const clang::CXXRecordDecl * RD)
  • public llvm::GlobalVariable * GenerateConstructionVTable(const clang::CXXRecordDecl * RD, const clang::BaseSubobject & Base, bool BaseIsVirtual, llvm::GlobalVariable::LinkageTypes Linkage, clang::CodeGen::CodeGenVTables::VTableAddressPointsMapTy & AddressPoints)
  • public void GenerateRelativeVTableAlias(llvm::GlobalVariable * VTable, llvm::StringRef AliasNameRef)
  • public llvm::GlobalVariable * GetAddrOfVTT(const clang::CXXRecordDecl * RD)
  • private void addRelativeComponent(clang::CodeGen::ConstantArrayBuilder & builder, llvm::Constant * component, unsigned int vtableAddressPoint, bool vtableHasLocalLinkage, bool isCompleteDtor) const
  • private void addVTableComponent(clang::CodeGen::ConstantArrayBuilder & builder, const clang::VTableLayout & layout, unsigned int componentIndex, llvm::Constant * rtti, unsigned int & nextVTableThunkIndex, unsigned int vtableAddressPoint, bool vtableHasLocalLinkage)
  • public void createVTableInitializer(clang::CodeGen::ConstantStructBuilder & builder, const clang::VTableLayout & layout, llvm::Constant * rtti, bool vtableHasLocalLinkage)
  • public clang::ItaniumVTableContext & getItaniumVTableContext()
  • public clang::MicrosoftVTableContext & getMicrosoftVTableContext()
  • private llvm::Function * getOrCreateRelativeStub(llvm::Function * func, llvm::GlobalValue::LinkageTypes stubLinkage, bool isCompleteDtor) const
  • public uint64_t getSecondaryVirtualPointerIndex(const clang::CXXRecordDecl * RD, clang::BaseSubobject Base)
  • public uint64_t getSubVTTIndex(const clang::CXXRecordDecl * RD, clang::BaseSubobject Base)
  • private llvm::Type * getVTableComponentType() const
  • public llvm::Type * getVTableType(const clang::VTableLayout & layout)
  • public bool isVTableExternal(const clang::CXXRecordDecl * RD)
  • private llvm::Constant * maybeEmitThunk(clang::GlobalDecl GD, const clang::ThunkInfo & ThunkAdjustments, bool ForVTable)
  • private bool useRelativeLayout() const

Methods

CodeGenVTables(clang::CodeGen::CodeGenModule& CGM)

Declared at: clang/lib/CodeGen/CGVTables.h:99

Parameters

clang::CodeGen::CodeGenModule& CGM

void EmitThunks(clang::GlobalDecl GD)

Description

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

Declared at: clang/lib/CodeGen/CGVTables.h:136

Parameters

clang::GlobalDecl GD

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

Description

EmitVTTDefinition - Emit the definition of the given vtable.

Declared at: clang/lib/CodeGen/CGVTables.h:131

Parameters

llvm::GlobalVariable* VTT
llvm::GlobalVariable::LinkageTypes Linkage
const clang::CXXRecordDecl* RD

void GenerateClassData(
    const clang::CXXRecordDecl* RD)

Description

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

Declared at: clang/lib/CodeGen/CGVTables.h:142

Parameters

const clang::CXXRecordDecl* RD

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

Description

GenerateConstructionVTable - Generate a construction vtable for the given base subobject.

Declared at: clang/lib/CodeGen/CGVTables.h:121

Parameters

const clang::CXXRecordDecl* RD
const clang::BaseSubobject& Base
bool BaseIsVirtual
llvm::GlobalVariable::LinkageTypes Linkage
clang::CodeGen::CodeGenVTables:: VTableAddressPointsMapTy& AddressPoints

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

Description

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.

Declared at: clang/lib/CodeGen/CGVTables.h:155

Parameters

llvm::GlobalVariable* VTable
llvm::StringRef AliasNameRef

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

Description

GetAddrOfVTT - Get the address of the VTT for the given record decl.

Declared at: clang/lib/CodeGen/CGVTables.h:128

Parameters

const clang::CXXRecordDecl* RD

void addRelativeComponent(
    clang::CodeGen::ConstantArrayBuilder& builder,
    llvm::Constant* component,
    unsigned int vtableAddressPoint,
    bool vtableHasLocalLinkage,
    bool isCompleteDtor) const

Description

Add a 32-bit offset to a component relative to the vtable when using the relative vtables ABI. The array builder points to the start of the vtable.

Declared at: clang/lib/CodeGen/CGVTables.h:72

Parameters

clang::CodeGen::ConstantArrayBuilder& builder
llvm::Constant* component
unsigned int vtableAddressPoint
bool vtableHasLocalLinkage
bool isCompleteDtor

void addVTableComponent(
    clang::CodeGen::ConstantArrayBuilder& builder,
    const clang::VTableLayout& layout,
    unsigned int componentIndex,
    llvm::Constant* rtti,
    unsigned int& nextVTableThunkIndex,
    unsigned int vtableAddressPoint,
    bool vtableHasLocalLinkage)

Declared at: clang/lib/CodeGen/CGVTables.h:64

Parameters

clang::CodeGen::ConstantArrayBuilder& builder
const clang::VTableLayout& layout
unsigned int componentIndex
llvm::Constant* rtti
unsigned int& nextVTableThunkIndex
unsigned int vtableAddressPoint
bool vtableHasLocalLinkage

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

Description

Add vtable components for the given vtable layout to the given global initializer.

Declared at: clang/lib/CodeGen/CGVTables.h:95

Parameters

clang::CodeGen::ConstantStructBuilder& builder
const clang::VTableLayout& layout
llvm::Constant* rtti
bool vtableHasLocalLinkage

clang::ItaniumVTableContext&
getItaniumVTableContext()

Declared at: clang/lib/CodeGen/CGVTables.h:101

clang::MicrosoftVTableContext&
getMicrosoftVTableContext()

Declared at: clang/lib/CodeGen/CGVTables.h:105

llvm::Function* getOrCreateRelativeStub(
    llvm::Function* func,
    llvm::GlobalValue::LinkageTypes stubLinkage,
    bool isCompleteDtor) const

Description

Create a dso_local stub that will be used for a relative reference in the relative vtable layout. This stub will just be a tail call to the original function and propagate any function attributes from the original. If the original function is already dso_local, the original is returned instead and a stub is not created.

Declared at: clang/lib/CodeGen/CGVTables.h:84

Parameters

llvm::Function* func
llvm::GlobalValue::LinkageTypes stubLinkage
bool isCompleteDtor

uint64_t getSecondaryVirtualPointerIndex(
    const clang::CXXRecordDecl* RD,
    clang::BaseSubobject Base)

Description

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

Declared at: clang/lib/CodeGen/CGVTables.h:115

Parameters

const clang::CXXRecordDecl* RD
clang::BaseSubobject Base

uint64_t getSubVTTIndex(
    const clang::CXXRecordDecl* RD,
    clang::BaseSubobject Base)

Description

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

Declared at: clang/lib/CodeGen/CGVTables.h:111

Parameters

const clang::CXXRecordDecl* RD
clang::BaseSubobject Base

llvm::Type* getVTableComponentType() const

Declared at: clang/lib/CodeGen/CGVTables.h:90

llvm::Type* getVTableType(
    const clang::VTableLayout& layout)

Description

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.

Declared at: clang/lib/CodeGen/CGVTables.h:149

Parameters

const clang::VTableLayout& layout

bool isVTableExternal(
    const clang::CXXRecordDecl* RD)

Declared at: clang/lib/CodeGen/CGVTables.h:144

Parameters

const clang::CXXRecordDecl* RD

llvm::Constant* maybeEmitThunk(
    clang::GlobalDecl GD,
    const clang::ThunkInfo& ThunkAdjustments,
    bool ForVTable)

Description

Get the address of a thunk and emit it if necessary.

Declared at: clang/lib/CodeGen/CGVTables.h:60

Parameters

clang::GlobalDecl GD
const clang::ThunkInfo& ThunkAdjustments
bool ForVTable

bool useRelativeLayout() const

Declared at: clang/lib/CodeGen/CGVTables.h:88