diff options
author | John McCall <rjmccall@apple.com> | 2010-12-04 08:14:53 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-12-04 08:14:53 +0000 |
commit | 0e800c9c20d1a658a91096c756c4a4a9e90264fc (patch) | |
tree | 7be31a9b8db7381808de7ee48736c6029c53840b /lib/CodeGen/CGExprCXX.cpp | |
parent | abc56c726178fc7c8a3f45185768426a6e9d584e (diff) |
Remove some defensive calls to EmitLoadOfPropertyRefLValue that shouldn't
be required, and then fix up some missing loads on overloaded-operator
paths which that exposed.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120896 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 37 |
1 files changed, 5 insertions, 32 deletions
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index e88315137a..945aa2a182 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -122,16 +122,8 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, llvm::Value *This; if (ME->isArrow()) This = EmitScalarExpr(ME->getBase()); - else { - LValue BaseLV = EmitLValue(ME->getBase()); - if (BaseLV.isPropertyRef()) { - QualType QT = ME->getBase()->getType(); - RValue RV = EmitLoadOfPropertyRefLValue(BaseLV); - This = RV.isScalar() ? RV.getScalarVal() : RV.getAggregateAddr(); - } - else - This = BaseLV.getAddress(); - } + else + This = EmitLValue(ME->getBase()).getAddress(); if (MD->isTrivial()) { if (isa<CXXDestructorDecl>(MD)) return RValue::get(0); @@ -233,22 +225,14 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, ReturnValueSlot ReturnValue) { assert(MD->isInstance() && "Trying to emit a member call expr on a static method!"); + LValue LV = EmitLValue(E->getArg(0)); + llvm::Value *This = LV.getAddress(); + if (MD->isCopyAssignmentOperator()) { const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(MD->getDeclContext()); if (ClassDecl->hasTrivialCopyAssignment()) { assert(!ClassDecl->hasUserDeclaredCopyAssignment() && "EmitCXXOperatorMemberCallExpr - user declared copy assignment"); - LValue LV = EmitLValue(E->getArg(0)); - llvm::Value *This; - if (LV.isPropertyRef()) { - AggValueSlot Slot = CreateAggTemp(E->getArg(1)->getType()); - EmitAggExpr(E->getArg(1), Slot); - EmitStoreThroughPropertyRefLValue(Slot.asRValue(), LV); - return RValue::getAggregate(0, false); - } - else - This = LV.getAddress(); - llvm::Value *Src = EmitLValue(E->getArg(1)).getAddress(); QualType Ty = E->getType(); EmitAggregateCopy(This, Src, Ty); @@ -260,17 +244,6 @@ CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const llvm::Type *Ty = CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), FPT->isVariadic()); - LValue LV = EmitLValue(E->getArg(0)); - llvm::Value *This; - if (LV.isPropertyRef()) { - QualType QT = E->getArg(0)->getType(); - RValue RV = EmitLoadOfPropertyRefLValue(LV); - assert (!RV.isScalar() && "EmitCXXOperatorMemberCallExpr"); - This = RV.getAggregateAddr(); - } - else - This = LV.getAddress(); - llvm::Value *Callee; if (MD->isVirtual() && !canDevirtualizeMemberFunctionCalls(E->getArg(0), MD)) Callee = BuildVirtualCall(MD, This, Ty); |