diff options
author | John McCall <rjmccall@apple.com> | 2010-08-22 08:30:07 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-08-22 08:30:07 +0000 |
commit | e9fd7eb6c67676dc27e84eac429aec4f3be51f26 (patch) | |
tree | 05d5ae81a5acea15dd38f68c65be803d2ea9723d /lib/CodeGen/CGExpr.cpp | |
parent | e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3b (diff) |
Extract member function pointer comparison and null comparison into
the ABI code. Implement correct semantics for these on ARM.
I believe this completes the implementation of member function pointers
on ARM.
I think I'm going to switch member function pointers over to be
non-aggregates while I have all this in mind.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111774 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 14 |
1 files changed, 3 insertions, 11 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index cbe19825f9..753af76bf2 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -69,17 +69,9 @@ llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) { if (E->getType()->isMemberFunctionPointerType()) { LValue LV = EmitAggExprToLValue(E); - // Get the pointer. - llvm::Value *FuncPtr = Builder.CreateStructGEP(LV.getAddress(), 0, - "src.ptr"); - FuncPtr = Builder.CreateLoad(FuncPtr); - - llvm::Value *IsNotNull = - Builder.CreateICmpNE(FuncPtr, - llvm::Constant::getNullValue(FuncPtr->getType()), - "tobool"); - - return IsNotNull; + return CGM.getCXXABI().EmitMemberFunctionPointerIsNotNull(CGF, + LV.getAddress(), + E->getType()->getAs<MemberPointerType>()); } if (!E->getType()->isAnyComplexType()) return EmitScalarConversion(EmitScalarExpr(E), E->getType(), BoolTy); |