diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-01-20 17:19:02 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-01-20 17:19:02 +0000 |
commit | 2726267f094a0c1f5ac5b501ec5a9898c58876bf (patch) | |
tree | dc61f39188448cc2b42cd6ddd6351b3c2466f3d8 /lib/CodeGen/CGExprCXX.cpp | |
parent | 14cc9451de4a9539bf79e4e5d63248c2377426db (diff) |
apple kext abi requires all vf calls, including qualified
vf calls, be made indirect. This patch is towards that goal.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123922 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index 01d671a2d9..08ff17e1fd 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -172,8 +172,12 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, // // We also don't emit a virtual call if the base expression has a record type // because then we know what the type is. - bool UseVirtualCall = MD->isVirtual() && !ME->hasQualifier() + bool UseVirtualCall; + if (!getContext().getLangOptions().AppleKext) + UseVirtualCall = MD->isVirtual() && !ME->hasQualifier() && !canDevirtualizeMemberFunctionCalls(ME->getBase(), MD); + else + UseVirtualCall = MD->isVirtual(); llvm::Value *Callee; if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(MD)) { @@ -186,7 +190,12 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, dyn_cast<CXXConstructorDecl>(MD)) { Callee = CGM.GetAddrOfFunction(GlobalDecl(Ctor, Ctor_Complete), Ty); } else if (UseVirtualCall) { - Callee = BuildVirtualCall(MD, This, Ty); + if (getContext().getLangOptions().AppleKext && + ME->hasQualifier()) { + Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), This, Ty); + } + else + Callee = BuildVirtualCall(MD, This, Ty); } else { Callee = CGM.GetAddrOfFunction(MD, Ty); } @@ -267,7 +276,9 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), FPT->isVariadic()); llvm::Value *Callee; - if (MD->isVirtual() && !canDevirtualizeMemberFunctionCalls(E->getArg(0), MD)) + if (MD->isVirtual() && + (getContext().getLangOptions().AppleKext || + !canDevirtualizeMemberFunctionCalls(E->getArg(0), MD))) Callee = BuildVirtualCall(MD, This, Ty); else Callee = CGM.GetAddrOfFunction(MD, Ty); |