diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 12 | ||||
-rw-r--r-- | lib/CodeGen/CGClass.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 3 |
4 files changed, 10 insertions, 12 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index a4145675b3..9cb85954df 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -312,7 +312,6 @@ CodeGenFunction::BuildVirtualCall(const CXXMethodDecl *MD, llvm::Value *This, llvm::Value * CodeGenFunction::BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier *Qual, - llvm::Value *This, const llvm::Type *Ty) { llvm::Value *VTable = 0; assert((Qual->getKind() == NestedNameSpecifier::TypeSpec) && @@ -354,7 +353,6 @@ CodeGenFunction::BuildAppleKextVirtualDestructorCall( // 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) { - DD = cast<CXXDestructorDecl>(DD->getCanonicalDecl()); // Compute the function type we're calling. const CGFunctionInfo *FInfo = &CGM.getTypes().getFunctionInfo(cast<CXXDestructorDecl>(MD), @@ -362,18 +360,18 @@ CodeGenFunction::BuildAppleKextVirtualDestructorCall( const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); const llvm::Type *Ty = CGM.getTypes().GetFunctionType(*FInfo, FPT->isVariadic()); - if (!RD) - RD = DD->getParent(); + 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.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type)); + CGM.getVTables().getMethodVTableIndex(GlobalDecl(DD, Type)); uint64_t AddressPoint = - CGM.getVTables().getAddressPoint(BaseSubobject(RD, 0), RD); + CGM.getVTables().getAddressPoint(BaseSubobject(RD, 0), RD); VTableIndex += AddressPoint; llvm::Value *VFuncPtr = - CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt"); + CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt"); Callee = CGF.Builder.CreateLoad(VFuncPtr); } return Callee; diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp index 905e168150..ac2a5445a4 100644 --- a/lib/CodeGen/CGClass.cpp +++ b/lib/CodeGen/CGClass.cpp @@ -1270,7 +1270,8 @@ void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *DD, ForVirtualBase); llvm::Value *Callee = 0; if (getContext().getLangOptions().AppleKext) - Callee = BuildAppleKextVirtualDestructorCall(DD, Type); + Callee = BuildAppleKextVirtualDestructorCall(DD, Type, + DD->getParent()); if (!Callee) Callee = CGM.GetAddrOfCXXDestructor(DD, Type); diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index cd61f85283..bd971af96d 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -228,7 +228,7 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, if (getContext().getLangOptions().AppleKext && MD->isVirtual() && ME->hasQualifier()) - Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), This, Ty); + Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), Ty); else Callee = CGM.GetAddrOfFunction(GlobalDecl(Dtor, Dtor_Complete), Ty); } @@ -241,7 +241,7 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, if (getContext().getLangOptions().AppleKext && MD->isVirtual() && ME->hasQualifier()) - Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), This, Ty); + Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), Ty); else Callee = CGM.GetAddrOfFunction(MD, Ty); } diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 5e91e0b1a5..d1794d0089 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -1661,12 +1661,11 @@ public: llvm::Value *This, const llvm::Type *Ty); llvm::Value *BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier *Qual, - llvm::Value *This, const llvm::Type *Ty); llvm::Value *BuildAppleKextVirtualDestructorCall(const CXXDestructorDecl *DD, CXXDtorType Type, - const CXXRecordDecl *RD=0); + const CXXRecordDecl *RD); RValue EmitCXXMemberCall(const CXXMethodDecl *MD, llvm::Value *Callee, |