forked from OSchip/llvm-project
Simplify the CodeGenFunction::Build*Virtual*Call family of functions
llvm-svn: 186657
This commit is contained in:
parent
90a735d606
commit
03e8746f90
|
@ -291,33 +291,46 @@ CodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *dtor,
|
|||
/*ForVTable=*/false));
|
||||
}
|
||||
|
||||
static llvm::Value *BuildVirtualCall(CodeGenFunction &CGF, uint64_t VTableIndex,
|
||||
llvm::Value *This, llvm::Type *Ty) {
|
||||
llvm::Value *
|
||||
CodeGenFunction::BuildVirtualCall(GlobalDecl GD, llvm::Value *This,
|
||||
llvm::Type *Ty) {
|
||||
GD = GD.getCanonicalDecl();
|
||||
uint64_t VTableIndex = CGM.getVTableContext().getMethodVTableIndex(GD);
|
||||
|
||||
Ty = Ty->getPointerTo()->getPointerTo();
|
||||
|
||||
llvm::Value *VTable = CGF.GetVTablePtr(This, Ty);
|
||||
llvm::Value *VFuncPtr =
|
||||
CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
|
||||
llvm::Value *VTable = GetVTablePtr(This, Ty);
|
||||
llvm::Value *VFuncPtr =
|
||||
Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfn");
|
||||
return Builder.CreateLoad(VFuncPtr);
|
||||
}
|
||||
|
||||
static llvm::Value *BuildAppleKextVirtualCall(CodeGenFunction &CGF,
|
||||
GlobalDecl GD,
|
||||
llvm::Type *Ty,
|
||||
const CXXRecordDecl *RD) {
|
||||
GD = GD.getCanonicalDecl();
|
||||
CodeGenModule &CGM = CGF.CGM;
|
||||
llvm::Value *VTable = CGM.getVTables().GetAddrOfVTable(RD);
|
||||
Ty = Ty->getPointerTo()->getPointerTo();
|
||||
VTable = CGF.Builder.CreateBitCast(VTable, Ty);
|
||||
assert(VTable && "BuildVirtualCall = kext vtbl pointer is null");
|
||||
uint64_t VTableIndex = CGM.getVTableContext().getMethodVTableIndex(GD);
|
||||
uint64_t AddressPoint =
|
||||
CGM.getVTableContext().getVTableLayout(RD)
|
||||
.getAddressPoint(BaseSubobject(RD, CharUnits::Zero()));
|
||||
VTableIndex += AddressPoint;
|
||||
llvm::Value *VFuncPtr =
|
||||
CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");
|
||||
return CGF.Builder.CreateLoad(VFuncPtr);
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CodeGenFunction::BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
|
||||
llvm::Type *Ty) {
|
||||
MD = MD->getCanonicalDecl();
|
||||
uint64_t VTableIndex = CGM.getVTableContext().getMethodVTableIndex(MD);
|
||||
|
||||
return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
|
||||
}
|
||||
|
||||
/// BuildVirtualCall - This routine is to support gcc's kext ABI making
|
||||
/// BuildAppleKextVirtualCall - This routine is to support gcc's kext ABI making
|
||||
/// indirect call to virtual functions. It makes the call through indexing
|
||||
/// into the vtable.
|
||||
llvm::Value *
|
||||
CodeGenFunction::BuildAppleKextVirtualCall(const CXXMethodDecl *MD,
|
||||
NestedNameSpecifier *Qual,
|
||||
llvm::Type *Ty) {
|
||||
llvm::Value *VTable = 0;
|
||||
assert((Qual->getKind() == NestedNameSpecifier::TypeSpec) &&
|
||||
"BuildAppleKextVirtualCall - bad Qual kind");
|
||||
|
||||
|
@ -329,20 +342,8 @@ CodeGenFunction::BuildAppleKextVirtualCall(const CXXMethodDecl *MD,
|
|||
|
||||
if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD))
|
||||
return BuildAppleKextVirtualDestructorCall(DD, Dtor_Complete, RD);
|
||||
|
||||
VTable = CGM.getVTables().GetAddrOfVTable(RD);
|
||||
Ty = Ty->getPointerTo()->getPointerTo();
|
||||
VTable = Builder.CreateBitCast(VTable, Ty);
|
||||
assert(VTable && "BuildVirtualCall = kext vtbl pointer is null");
|
||||
MD = MD->getCanonicalDecl();
|
||||
uint64_t VTableIndex = CGM.getVTableContext().getMethodVTableIndex(MD);
|
||||
uint64_t AddressPoint =
|
||||
CGM.getVTableContext().getVTableLayout(RD)
|
||||
.getAddressPoint(BaseSubobject(RD, CharUnits::Zero()));
|
||||
VTableIndex += AddressPoint;
|
||||
llvm::Value *VFuncPtr =
|
||||
Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");
|
||||
return Builder.CreateLoad(VFuncPtr);
|
||||
|
||||
return ::BuildAppleKextVirtualCall(*this, MD, Ty, RD);
|
||||
}
|
||||
|
||||
/// BuildVirtualCall - This routine makes indirect vtable call for
|
||||
|
@ -352,42 +353,16 @@ CodeGenFunction::BuildAppleKextVirtualDestructorCall(
|
|||
const CXXDestructorDecl *DD,
|
||||
CXXDtorType Type,
|
||||
const CXXRecordDecl *RD) {
|
||||
llvm::Value * Callee = 0;
|
||||
const CXXMethodDecl *MD = cast<CXXMethodDecl>(DD);
|
||||
// FIXME. Dtor_Base dtor is always direct!!
|
||||
// It need be somehow inline expanded into the caller.
|
||||
// -O does that. But need to support -O0 as well.
|
||||
if (MD->isVirtual() && Type != Dtor_Base) {
|
||||
// Compute the function type we're calling.
|
||||
const CGFunctionInfo &FInfo =
|
||||
CGM.getTypes().arrangeCXXDestructor(cast<CXXDestructorDecl>(MD),
|
||||
Dtor_Complete);
|
||||
const CGFunctionInfo &FInfo =
|
||||
CGM.getTypes().arrangeCXXDestructor(DD, Dtor_Complete);
|
||||
llvm::Type *Ty = CGM.getTypes().GetFunctionType(FInfo);
|
||||
|
||||
llvm::Value *VTable = CGM.getVTables().GetAddrOfVTable(RD);
|
||||
Ty = Ty->getPointerTo()->getPointerTo();
|
||||
VTable = Builder.CreateBitCast(VTable, Ty);
|
||||
DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl());
|
||||
uint64_t VTableIndex =
|
||||
CGM.getVTableContext().getMethodVTableIndex(GlobalDecl(DD, Type));
|
||||
uint64_t AddressPoint =
|
||||
CGM.getVTableContext().getVTableLayout(RD)
|
||||
.getAddressPoint(BaseSubobject(RD, CharUnits::Zero()));
|
||||
VTableIndex += AddressPoint;
|
||||
llvm::Value *VFuncPtr =
|
||||
Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");
|
||||
Callee = Builder.CreateLoad(VFuncPtr);
|
||||
return ::BuildAppleKextVirtualCall(*this, GlobalDecl(DD, Type), Ty, RD);
|
||||
}
|
||||
return Callee;
|
||||
return 0;
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type,
|
||||
llvm::Value *This, llvm::Type *Ty) {
|
||||
DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl());
|
||||
uint64_t VTableIndex =
|
||||
CGM.getVTableContext().getMethodVTableIndex(GlobalDecl(DD, Type));
|
||||
|
||||
return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
|
||||
}
|
||||
|
||||
|
|
|
@ -2103,10 +2103,8 @@ public:
|
|||
void EmitNoreturnRuntimeCallOrInvoke(llvm::Value *callee,
|
||||
ArrayRef<llvm::Value*> args);
|
||||
|
||||
llvm::Value *BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This,
|
||||
llvm::Value *BuildVirtualCall(GlobalDecl GD, llvm::Value *This,
|
||||
llvm::Type *Ty);
|
||||
llvm::Value *BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type,
|
||||
llvm::Value *This, llvm::Type *Ty);
|
||||
llvm::Value *BuildAppleKextVirtualCall(const CXXMethodDecl *MD,
|
||||
NestedNameSpecifier *Qual,
|
||||
llvm::Type *Ty);
|
||||
|
|
|
@ -834,7 +834,8 @@ void ItaniumCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
|
|||
const CGFunctionInfo *FInfo
|
||||
= &CGM.getTypes().arrangeCXXDestructor(Dtor, DtorType);
|
||||
llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
|
||||
llvm::Value *Callee = CGF.BuildVirtualCall(Dtor, DtorType, This, Ty);
|
||||
llvm::Value *Callee
|
||||
= CGF.BuildVirtualCall(GlobalDecl(Dtor, DtorType), This, Ty);
|
||||
|
||||
CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValueSlot(), This,
|
||||
/*ImplicitParam=*/0, QualType(), 0, 0);
|
||||
|
|
|
@ -490,7 +490,8 @@ void MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
|
|||
const CGFunctionInfo *FInfo
|
||||
= &CGM.getTypes().arrangeCXXDestructor(Dtor, Dtor_Deleting);
|
||||
llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
|
||||
llvm::Value *Callee = CGF.BuildVirtualCall(Dtor, Dtor_Deleting, This, Ty);
|
||||
llvm::Value *Callee
|
||||
= CGF.BuildVirtualCall(GlobalDecl(Dtor, Dtor_Deleting), This, Ty);
|
||||
|
||||
ASTContext &Context = CGF.getContext();
|
||||
llvm::Value *ImplicitParam
|
||||
|
|
Loading…
Reference in New Issue