aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprScalar.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-12-09 23:35:29 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-12-09 23:35:29 +0000
commit820bca41c3899374775d2a1dfc2ef2e22aaf1c7b (patch)
treed9c8cd5865583661924ca02932b16de191f899d9 /lib/CodeGen/CGExprScalar.cpp
parent76958099828bac6ebd45abef9f76934b3e99e397 (diff)
Code gen for ObjCIsaExpr AST used as lvalue.
(fixes radar 7457534). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90995 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r--lib/CodeGen/CGExprScalar.cpp36
1 files changed, 21 insertions, 15 deletions
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 9ac8b4d8b3..1ce4c5aef4 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -168,21 +168,8 @@ public:
}
Value *VisitObjCIsaExpr(ObjCIsaExpr *E) {
- Value *V;
- // object->isa or (*object).isa
- // Generate code as for: *(Class*)object
- Expr *BaseExpr = E->getBase();
- if (E->isArrow())
- V = EmitLoadOfLValue(BaseExpr);
- else
- V = EmitLValue(BaseExpr).getAddress();
-
- // build Class* type
- const llvm::Type *ClassPtrTy = ConvertType(E->getType());
- ClassPtrTy = ClassPtrTy->getPointerTo();
- V = Builder.CreateBitCast(V, ClassPtrTy);
- LValue LV = LValue::MakeAddr(V, CGF.MakeQualifiers(E->getType()));
- V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
+ LValue LV = CGF.EmitObjCIsaExpr(E);
+ Value *V = CGF.EmitLoadOfLValue(LV, E->getType()).getScalarVal();
return V;
}
@@ -1997,3 +1984,22 @@ llvm::Value *CodeGenFunction::EmitVector(llvm::Value * const *Vals,
return Vec;
}
+
+LValue CodeGenFunction::EmitObjCIsaExpr(const ObjCIsaExpr *E) {
+ llvm::Value *V;
+ // object->isa or (*object).isa
+ // Generate code as for: *(Class*)object
+ Expr *BaseExpr = E->getBase();
+ if (E->isArrow())
+ V = ScalarExprEmitter(*this).EmitLoadOfLValue(BaseExpr);
+ else
+ V = EmitLValue(BaseExpr).getAddress();
+
+ // build Class* type
+ const llvm::Type *ClassPtrTy = ConvertType(E->getType());
+ ClassPtrTy = ClassPtrTy->getPointerTo();
+ V = Builder.CreateBitCast(V, ClassPtrTy);
+ LValue LV = LValue::MakeAddr(V, MakeQualifiers(E->getType()));
+ return LV;
+}
+