From: Fariborz Jahanian Date: Thu, 3 Feb 2011 19:27:17 +0000 (+0000) Subject: Clean up of -fapple-kext abi code. No change otherwise. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=771c678c04f5f685b4f188ec6c2fd88ad0f7457f;p=clang Clean up of -fapple-kext abi code. No change otherwise. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124807 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(DD->getCanonicalDecl()); // Compute the function type we're calling. const CGFunctionInfo *FInfo = &CGM.getTypes().getFunctionInfo(cast(MD), @@ -362,18 +360,18 @@ CodeGenFunction::BuildAppleKextVirtualDestructorCall( const FunctionProtoType *FPT = MD->getType()->getAs(); 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(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,