зеркало из https://github.com/microsoft/clang-1.git
Make GenerateVtable a private member function of CGVtableInfo.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90684 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
d013733c73
Коммит
8c2d36ffc8
|
@ -1111,22 +1111,22 @@ createGlobalVariable(CodeGenModule &CGM, const CXXRecordDecl *RD,
|
|||
return V;
|
||||
}
|
||||
|
||||
llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass,
|
||||
const CXXRecordDecl *RD,
|
||||
uint64_t Offset) {
|
||||
llvm::GlobalVariable *
|
||||
CGVtableInfo::GenerateVtable(const CXXRecordDecl *LayoutClass,
|
||||
const CXXRecordDecl *RD, uint64_t Offset) {
|
||||
llvm::SmallString<256> OutName;
|
||||
if (LayoutClass != RD)
|
||||
getMangleContext().mangleCXXCtorVtable(LayoutClass, Offset/8, RD, OutName);
|
||||
CGM.getMangleContext().mangleCXXCtorVtable(LayoutClass, Offset / 8,
|
||||
RD, OutName);
|
||||
else
|
||||
getMangleContext().mangleCXXVtable(RD, OutName);
|
||||
CGM.getMangleContext().mangleCXXVtable(RD, OutName);
|
||||
llvm::StringRef Name = OutName.str();
|
||||
|
||||
llvm::Type *Ptr8Ty=llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext),0);
|
||||
int64_t AddressPoint;
|
||||
|
||||
llvm::GlobalVariable *GV = getModule().getGlobalVariable(Name);
|
||||
if (GV && AddressPoints[LayoutClass] && !GV->isDeclaration()) {
|
||||
AddressPoint=(*(*(AddressPoints[LayoutClass]))[RD])[std::make_pair(RD,
|
||||
llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
|
||||
if (GV && CGM.AddressPoints[LayoutClass] && !GV->isDeclaration()) {
|
||||
AddressPoint=(*(*(CGM.AddressPoints[LayoutClass]))[RD])[std::make_pair(RD,
|
||||
Offset)];
|
||||
// FIXME: We can never have 0 address point. Do this for now so gepping
|
||||
// retains the same structure. Later, we'll just assert.
|
||||
|
@ -1138,7 +1138,7 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass,
|
|||
CreateDefinition = true;
|
||||
else {
|
||||
const ASTRecordLayout &Layout =
|
||||
getContext().getASTRecordLayout(LayoutClass);
|
||||
CGM.getContext().getASTRecordLayout(LayoutClass);
|
||||
|
||||
if (const CXXMethodDecl *KeyFunction = Layout.getKeyFunction()) {
|
||||
if (!KeyFunction->getBody()) {
|
||||
|
@ -1149,7 +1149,7 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass,
|
|||
}
|
||||
}
|
||||
|
||||
VtableBuilder b(RD, LayoutClass, Offset, *this, CreateDefinition);
|
||||
VtableBuilder b(RD, LayoutClass, Offset, CGM, CreateDefinition);
|
||||
|
||||
D1(printf("vtable %s\n", RD->getNameAsCString()));
|
||||
// First comes the vtables for all the non-virtual bases...
|
||||
|
@ -1159,15 +1159,16 @@ llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *LayoutClass,
|
|||
b.GenerateVtableForVBases(RD, Offset);
|
||||
|
||||
llvm::Constant *Init = 0;
|
||||
const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
|
||||
llvm::ArrayType *ArrayType =
|
||||
llvm::ArrayType::get(Ptr8Ty, b.getVtable().size());
|
||||
llvm::ArrayType::get(Int8PtrTy, b.getVtable().size());
|
||||
|
||||
if (CreateDefinition) {
|
||||
Init = llvm::ConstantArray::get(ArrayType, &b.getVtable()[0],
|
||||
b.getVtable().size());
|
||||
}
|
||||
llvm::GlobalVariable *OGV = GV;
|
||||
GV = createGlobalVariable(*this, LayoutClass, ArrayType, Init, Name);
|
||||
GV = createGlobalVariable(CGM, LayoutClass, ArrayType, Init, Name);
|
||||
if (OGV) {
|
||||
GV->takeName(OGV);
|
||||
llvm::Constant *NewPtr =
|
||||
|
@ -1382,23 +1383,24 @@ llvm::Constant *CodeGenModule::GenerateVTT(const CXXRecordDecl *RD) {
|
|||
}
|
||||
|
||||
void CGVtableInfo::GenerateClassData(const CXXRecordDecl *RD) {
|
||||
Vtables[RD] = CGM.GenerateVtable(RD, RD);
|
||||
Vtables[RD] = GenerateVtable(RD, RD, 0);
|
||||
CGM.GenerateRTTI(RD);
|
||||
CGM.GenerateVTT(RD);
|
||||
}
|
||||
|
||||
llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {
|
||||
llvm::Constant *&Vtable = Vtables[RD];
|
||||
llvm::GlobalVariable *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {
|
||||
llvm::GlobalVariable *Vtable = Vtables[RD];
|
||||
|
||||
if (!Vtable)
|
||||
Vtable = CGM.GenerateVtable(RD, RD);
|
||||
Vtable = GenerateVtable(RD, RD, 0);
|
||||
|
||||
return Vtable;
|
||||
}
|
||||
|
||||
llvm::Constant *CGVtableInfo::getCtorVtable(const CXXRecordDecl *LayoutClass,
|
||||
const CXXRecordDecl *RD,
|
||||
uint64_t Offset) {
|
||||
return CGM.GenerateVtable(LayoutClass, RD, Offset);
|
||||
llvm::GlobalVariable *
|
||||
CGVtableInfo::getCtorVtable(const CXXRecordDecl *LayoutClass,
|
||||
const CXXRecordDecl *RD, uint64_t Offset) {
|
||||
return GenerateVtable(LayoutClass, RD, Offset);
|
||||
}
|
||||
|
||||
void CGVtableInfo::MaybeEmitVtable(GlobalDecl GD) {
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "GlobalDecl.h"
|
||||
|
||||
namespace llvm {
|
||||
class Constant;
|
||||
class GlobalVariable;
|
||||
}
|
||||
|
||||
namespace clang {
|
||||
|
@ -79,7 +79,8 @@ class CGVtableInfo {
|
|||
typedef llvm::DenseMap<ClassPairTy, int64_t> VirtualBaseClassIndiciesTy;
|
||||
VirtualBaseClassIndiciesTy VirtualBaseClassIndicies;
|
||||
|
||||
llvm::DenseMap<const CXXRecordDecl *, llvm::Constant *> Vtables;
|
||||
/// Vtables - All the vtables which have been defined.
|
||||
llvm::DenseMap<const CXXRecordDecl *, llvm::GlobalVariable *> Vtables;
|
||||
|
||||
/// NumVirtualFunctionPointers - Contains the number of virtual function
|
||||
/// pointers in the vtable for a given record decl.
|
||||
|
@ -95,7 +96,11 @@ class CGVtableInfo {
|
|||
/// upon definition of a KeyFunction. This includes the vtable, the
|
||||
/// rtti data structure and the VTT.
|
||||
void GenerateClassData(const CXXRecordDecl *RD);
|
||||
|
||||
|
||||
llvm::GlobalVariable *GenerateVtable(const CXXRecordDecl *LayoutClass,
|
||||
const CXXRecordDecl *RD,
|
||||
uint64_t Offset);
|
||||
|
||||
public:
|
||||
CGVtableInfo(CodeGenModule &CGM)
|
||||
: CGM(CGM) { }
|
||||
|
@ -118,9 +123,10 @@ public:
|
|||
/// FIXME: This should return a list of address points.
|
||||
uint64_t getVtableAddressPoint(const CXXRecordDecl *RD);
|
||||
|
||||
llvm::Constant *getVtable(const CXXRecordDecl *RD);
|
||||
llvm::Constant *getCtorVtable(const CXXRecordDecl *RD,
|
||||
const CXXRecordDecl *Class, uint64_t Offset);
|
||||
llvm::GlobalVariable *getVtable(const CXXRecordDecl *RD);
|
||||
llvm::GlobalVariable *getCtorVtable(const CXXRecordDecl *RD,
|
||||
const CXXRecordDecl *Class,
|
||||
uint64_t Offset);
|
||||
|
||||
|
||||
void MaybeEmitVtable(GlobalDecl GD);
|
||||
|
|
|
@ -212,15 +212,6 @@ public:
|
|||
llvm::Constant *GetAddrOfFunction(GlobalDecl GD,
|
||||
const llvm::Type *Ty = 0);
|
||||
|
||||
/// GenerateVtable - Generate the vtable for the given type. LayoutClass is
|
||||
/// the class to use for the virtual base layout information. For
|
||||
/// non-construction vtables, this is always the same as RD. Offset is the
|
||||
/// offset in bits for the RD object in the LayoutClass, if we're generating a
|
||||
/// construction vtable, otherwise 0.
|
||||
llvm::Constant *GenerateVtable(const CXXRecordDecl *LayoutClass,
|
||||
const CXXRecordDecl *RD,
|
||||
uint64_t Offset=0);
|
||||
|
||||
/// GenerateVTT - Generate the VTT for the given type.
|
||||
llvm::Constant *GenerateVTT(const CXXRecordDecl *RD);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче