aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2011-01-20 17:19:02 +0000
committerFariborz Jahanian <fjahanian@apple.com>2011-01-20 17:19:02 +0000
commit2726267f094a0c1f5ac5b501ec5a9898c58876bf (patch)
treedc61f39188448cc2b42cd6ddd6351b3c2466f3d8 /lib/CodeGen/CGExprCXX.cpp
parent14cc9451de4a9539bf79e4e5d63248c2377426db (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.cpp17
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);