#ifndef LLVM_CLANG_LIB_CODEGEN_CGVTABLES_H
#define LLVM_CLANG_LIB_CODEGEN_CGVTABLES_H
#include "clang/AST/BaseSubobject.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/GlobalDecl.h"
#include "clang/AST/VTableBuilder.h"
#include "clang/Basic/ABI.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/IR/GlobalVariable.h"
namespace clang {
class CXXRecordDecl;
namespace CodeGen {
class CodeGenModule;
class CodeGenVTables {
CodeGenModule &CGM;
VTableContextBase *VTContext;
typedef llvm::DenseMap<BaseSubobject, uint64_t> VTableAddressPointsMapTy;
typedef std::pair<const CXXRecordDecl *, BaseSubobject> BaseSubobjectPairTy;
typedef llvm::DenseMap<BaseSubobjectPairTy, uint64_t> SubVTTIndiciesMapTy;
SubVTTIndiciesMapTy SubVTTIndicies;
typedef llvm::DenseMap<BaseSubobjectPairTy, uint64_t>
SecondaryVirtualPointerIndicesMapTy;
SecondaryVirtualPointerIndicesMapTy SecondaryVirtualPointerIndices;
void emitThunk(GlobalDecl GD, const ThunkInfo &Thunk, bool ForVTable);
void maybeEmitThunkForVTable(GlobalDecl GD, const ThunkInfo &Thunk);
public:
llvm::Constant *CreateVTableInitializer(
const CXXRecordDecl *RD, const VTableComponent *Components,
unsigned NumComponents, const VTableLayout::VTableThunkTy *VTableThunks,
unsigned NumVTableThunks, llvm::Constant *RTTI);
CodeGenVTables(CodeGenModule &CGM);
ItaniumVTableContext &getItaniumVTableContext() {
return *cast<ItaniumVTableContext>(VTContext);
}
MicrosoftVTableContext &getMicrosoftVTableContext() {
return *cast<MicrosoftVTableContext>(VTContext);
}
uint64_t getSubVTTIndex(const CXXRecordDecl *RD, BaseSubobject Base);
uint64_t getSecondaryVirtualPointerIndex(const CXXRecordDecl *RD,
BaseSubobject Base);
llvm::GlobalVariable *
GenerateConstructionVTable(const CXXRecordDecl *RD, const BaseSubobject &Base,
bool BaseIsVirtual,
llvm::GlobalVariable::LinkageTypes Linkage,
VTableAddressPointsMapTy& AddressPoints);
llvm::GlobalVariable *GetAddrOfVTT(const CXXRecordDecl *RD);
void EmitVTTDefinition(llvm::GlobalVariable *VTT,
llvm::GlobalVariable::LinkageTypes Linkage,
const CXXRecordDecl *RD);
void EmitThunks(GlobalDecl GD);
void GenerateClassData(const CXXRecordDecl *RD);
bool isVTableExternal(const CXXRecordDecl *RD);
};
} } #endif